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.Al开发者_StackOverflow社区lCells;
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.
Would this MSDN Answer work? I'll leave the translation to you:
EDIT: C# version is available at the source page.
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
精彩评论