views:

179

answers:

1

I have a DataGridViewComboBoxColumn in my application that is defined as follows

DataGridViewComboBoxColumn TransferActionCol = new DataGridViewComboBoxColumn();
TransferActionCol.DataSource = Enum.GetValues(typeof(TransferActionEnum));
TransferActionCol.DataPropertyName = "TransferAction";
TransferActionCol.Name = "Transfer Action";
TransferActionCol.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
fileListdataGridView.Columns.Add(TransferActionCol);

TransferActionEnum is an enumeration with values Download, Upload, and Ignore. Everything works fine, but I'd like to know if there is a way to display an icon in the cells of this column rather then the enum text value? If possible I'd like to display the icons both when the user is making a selection, and after.

+1  A: 

Would this work? I'll leave the transation to you:
Private Sub Form1_Load(ByVal sender As System.Objec t, ByVal e As System.EventArgs) Handles MyBase.Load
Dim cboColumn As DataGridViewComboBoxColumn
cboColumn = New DataGridViewComboBoxColumn
With cboColumn
.Name = "Color"
.Items.Add("Red")
.Items.Add("Blue")
.Items.Add("Green")
End With
Me.DataGridView1.Columns.Add(cboColumn)
Dim txtColumn As DataGridViewTextBoxColumn
txtColumn = New DataGridViewTextBoxColumn
With txtColumn
.Name = "Description"
End With
Me.DataGridView1.Columns.Add(txtColumn)
End Sub

Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    If TypeOf e.Control Is ComboBox Then
        DirectCast(e.Control, ComboBox).DrawMode = DrawMode.OwnerDrawFixed
        Try
            RemoveHandler DirectCast(e.Control, ComboBox).DrawItem, AddressOf combobox1_DrawItem
        Catch ex As Exception

        End Try
        AddHandler DirectCast(e.Control, ComboBox).DrawItem, AddressOf combobox1_DrawItem
    End If
End Sub

Private Sub combobox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs)
    Dim g As Graphics = e.Graphics
    Dim s As String
    Dim br As Brush = SystemBrushes.WindowText
    Dim brBack As Brush
    Dim rDraw As Rectangle
    Dim bSelected As Boolean = CBool(e.State And DrawItemState.Selected)
    Dim bValue As Boolean = CBool(e.State And DrawItemState.ComboBoxEdit)

    rDraw = e.Bounds
    rDraw.Inflate(-1, -1)

    If bSelected And Not bValue Then
        brBack = Brushes.LightBlue
        g.FillRectangle(Brushes.LightBlue, rDraw)
        g.DrawRectangle(Pens.Blue, rDraw)
    Else
        brBack = Brushes.White
        g.FillRectangle(brBack, e.Bounds)
    End If

    br = Nothing
    brBack = Nothing
    rDraw = Nothing

    Try
        s = DirectCast(sender, ComboBox).Items.Item(e.Index).ToString
    Catch
        s = ""
    End Try

    Dim x, y As Integer

    x = e.Bounds.Left + 25
    y = e.Bounds.Top + 1
    Dim c As Color
    Dim b As SolidBrush
    c = Color.FromName(s)
    b = New SolidBrush(c)

    g.FillRectangle(b, x - 20, y + 2, 10, 10)
    g.DrawString(s, DataGridView1.Font, Brushes.Black, x, y)
End Sub
Mohit Deshpande
Not a very clean example however this does work. See: http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/8b5f5bc9-db56-4843-9714-8d4e125fb592 and http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.drawitem.aspx for more info. I have done this and it can work. However Just remember that if you have multiple drop down columns in a datagrid, they can SHARE the same edit control. This could create issues if not handled.
Tony