DataGridViewComboBoxColumn Color

mikko

New member
Joined
Mar 17, 2005
Messages
2
Location
New Haven MI
Programming Experience
10+
I would like the selected drawitem to remain after you
move focus from the DataGridViewComboBoxColumn. In this
example from the knowledgebase it shows how do this but
only the text remains after moving to an adjacent cell.

Anybody know how to do this?

Private Sub Form1_Load(ByVal sender As System.Object, 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
 
Got a bit tangled up and just needed to add another handler.
This sets the background to the color selected.
Not exactly what I want but good enough for now.

RemoveHandler DirectCast(e.Control, ComboBox).SelectedIndexChanged, AddressOf ComboBox1_SelectedIndexChanged
AddHandler DirectCast(e.Control, ComboBox).SelectedIndexChanged, AddressOf ComboBox1_SelectedIndexChanged

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Me.DataGridView1.SelectedCells(0).Style.BackColor = Drawing.Color......
End Sub
 
Back
Top