mikko
New member
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
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