我的应用程序中有一个DataGridViewComboBoxColumn,定义如下
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是一个包含值Download,Upload和Ignore的枚举。一切正常,但我想知道是否有办法在此列的单元格中显示图标而不是枚举文本值?如果可能的话,我想在用户进行选择时以及之后显示图标。
答案 0 :(得分:1)
这MSDN Answer会有效吗?我会把翻译留给你:
编辑:源页面提供了C#版本。
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