1


1

DataGridViewComboBoxColumnのアイコン

私のアプリケーションには、次のように定義された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の列挙です。 すべて正常に動作しますが、列挙型テキスト値ではなく、この列のセルにアイコンを表示する方法があるかどうかを知りたいですか? 可能であれば、ユーザーが選択を行っているときとその後の両方でアイコンを表示したいと思います。

1 Answer


1


これはhttps://social.msdn.microsoft.com/forums/windows/en-US/1f41f16d-17a9-4c52-92cf-3de9426a2dd7/image-inside-datagridviewcomboboxcell[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