Public Class CGridComboBoxStyle
Inherits DataGridColumnStyle
Public cgCombo As New ComboBox
Private isEditing As Boolean
Private m_ComboBoxStyle As ComboBoxStyle
Public Sub New(ByVal MappingName As String)
Me.cgCombo.Visible = False
Me.MappingName = MappingName
Me.NullText = String.Empty
AddHandler Me.cgCombo.Leave, AddressOf HideControl
End Sub
Public Sub New(ByVal MappingName As String, _
ByVal Width As Integer, _
ByVal Alignment As HorizontalAlignment, _
ByVal HeaderText As String, _
ByVal NullText As String, _
ByVal Items() As String, _
ByVal ListDrop As ComboBoxStyle)
Me.New(MappingName)
Me.Width = Width
Me.Alignment = Alignment
Me.HeaderText = HeaderText
Me.NullText = NullText
If Items.Length > 0 Then
Me.cgCombo.Items.AddRange(Items)
End If
m_ComboBoxStyle = ListDrop
cgCombo.DropDownStyle = ListDrop
End Sub
Protected Overrides Sub Abort(ByVal rowNum As Integer)
Try
Me.cgCombo.Bounds = Rectangle.Empty
isEditing = False
Select Case m_ComboBoxStyle
Case ComboBoxStyle.DropDown
RemoveHandler cgCombo.TextChanged, AddressOf ComboBoxSelectedValueChanged
Case ComboBoxStyle.DropDownList
RemoveHandler cgCombo.SelectedValueChanged, AddressOf ComboBoxSelectedValueChanged
End Select
Invalidate()
Catch ex As Exception
'DisplayError(ex)
End Try
End Sub
Protected Overrides Function Commit(ByVal dataSource As CurrencyManager, _
ByVal rowNum As Integer) As Boolean
Try
Me.cgCombo.Bounds = Rectangle.Empty
Select Case m_ComboBoxStyle
Case ComboBoxStyle.DropDown
RemoveHandler Me.cgCombo.TextChanged, AddressOf ComboBoxSelectedValueChanged
Case ComboBoxStyle.DropDownList
RemoveHandler Me.cgCombo.SelectedValueChanged, AddressOf ComboBoxSelectedValueChanged
End Select
If Not isEditing Then
Return True
End If
isEditing = False
Dim value As String = Me.cgCombo.Text
If value.CompareTo(NullText) = 0 Then
SetColumnValueAtRow(dataSource, rowNum, System.DBNull.Value)
Else
SetColumnValueAtRow(dataSource, rowNum, value)
End If
Invalidate()
' data changed -> update array & show validation message
'ValidateGridCellEntry(rowNum, Me.MappingName)
Return True
Catch ex As Exception
'DisplayError(ex)
End Try
End Function
Protected Overloads Overrides Sub Edit(ByVal [source] As CurrencyManager, _
ByVal rowNum As Integer, _
ByVal bounds As Rectangle, _
ByVal [readOnly] As Boolean, _
ByVal instantText As String, _
ByVal cellIsVisible As Boolean)
Try
Select Case m_ComboBoxStyle
Case ComboBoxStyle.DropDown
RemoveHandler Me.cgCombo.TextChanged, AddressOf ComboBoxSelectedValueChanged
Case ComboBoxStyle.DropDownList
RemoveHandler Me.cgCombo.SelectedValueChanged, AddressOf ComboBoxSelectedValueChanged
End Select
Dim value As String
If IsDBNull(GetColumnValueAtRow([source], rowNum)) Then
value = Me.NullText
Else
value = CStr(GetColumnValueAtRow([source], rowNum))
End If
If cellIsVisible Then
Me.cgCombo.Bounds = bounds
Me.cgCombo.Text = value
Me.cgCombo.Visible = True
Select Case m_ComboBoxStyle
Case ComboBoxStyle.DropDown
AddHandler Me.cgCombo.TextChanged, AddressOf ComboBoxSelectedValueChanged
Case ComboBoxStyle.DropDownList
AddHandler Me.cgCombo.SelectedValueChanged, AddressOf ComboBoxSelectedValueChanged
End Select
Else
Me.cgCombo.Text = value
Me.cgCombo.Visible = False
End If
If Me.cgCombo.Visible Then
DataGridTableStyle.DataGrid.Invalidate(bounds)
End If
'Focus the ComboBox so that user can scroll values
Me.cgCombo.Focus()
Catch ex As Exception
'DisplayError(ex)
End Try
End Sub
Protected Overrides Function GetPreferredSize(ByVal g As Graphics, _
ByVal value As Object) As Size
Return New Size(100, Me.cgCombo.PreferredHeight)
End Function
Protected Overrides Function GetMinimumHeight() As Integer
Return Me.cgCombo.PreferredHeight
End Function
Protected Overrides Function GetPreferredHeight(ByVal g As Graphics, _
ByVal value As Object) As Integer
Return Me.cgCombo.PreferredHeight
End Function
Protected Overloads Overrides Sub Paint(ByVal g As Graphics, _
ByVal bounds As Rectangle, _
ByVal [source] As CurrencyManager, _
ByVal rowNum As Integer)
Paint(g, bounds, [source], rowNum, False)
End Sub
Protected Overloads Overrides Sub Paint(ByVal g As Graphics, _
ByVal bounds As Rectangle, _
ByVal [source] As CurrencyManager, _
ByVal rowNum As Integer, _
ByVal alignToRight As Boolean)
Paint(g, bounds, [source], rowNum, Brushes.Red, Brushes.Blue, alignToRight)
End Sub
Protected Overloads Overrides Sub Paint(ByVal g As Graphics, _
ByVal bounds As Rectangle, _
ByVal [source] As CurrencyManager, _
ByVal rowNum As Integer, _
ByVal backBrush As Brush, _
ByVal foreBrush As Brush, _
ByVal alignToRight As Boolean)
Dim o As Object = Me.GetColumnValueAtRow([source], rowNum)
Dim value As String
If IsDBNull(o) Then
value = Me.NullText
Else
value = CStr(o)
End If
Dim rect As Rectangle = bounds
g.FillRectangle(backBrush, rect)
g.DrawString(value, Me.DataGridTableStyle.DataGrid.Font, foreBrush, RectangleF.FromLTRB(rect.X, rect.Y, rect.Right, rect.Bottom))
End Sub
Protected Overrides Sub SetDataGridInColumn(ByVal value As DataGrid)
MyBase.SetDataGridInColumn(value)
If Not (Me.cgCombo.Parent Is Nothing) Then
Me.cgCombo.Parent.Controls.Remove(Me.cgCombo)
End If
If Not (value Is Nothing) Then
value.Controls.Add(Me.cgCombo)
End If
End Sub
Private Sub ComboBoxSelectedValueChanged(ByVal sender As Object, _
ByVal e As EventArgs)
If Not Me.isEditing Then
Me.isEditing = True
Select Case m_ComboBoxStyle
Case ComboBoxStyle.DropDown
RemoveHandler Me.cgCombo.TextChanged, AddressOf ComboBoxSelectedValueChanged
Case ComboBoxStyle.DropDownList
RemoveHandler Me.cgCombo.SelectedIndexChanged, AddressOf ComboBoxSelectedValueChanged
End Select
MyBase.ColumnStartedEditing(Me.cgCombo)
Select Case m_ComboBoxStyle
Case ComboBoxStyle.DropDown
AddHandler Me.cgCombo.TextChanged, AddressOf ComboBoxSelectedValueChanged
Case ComboBoxStyle.DropDownList
AddHandler Me.cgCombo.SelectedIndexChanged, AddressOf ComboBoxSelectedValueChanged
End Select
End If
End Sub
Private Sub HideControl(ByVal sender As Object, _
ByVal e As EventArgs)
Me.cgCombo.Bounds = Rectangle.Empty
End Sub
Protected Overrides Sub EnterNullValue()
Me.cgCombo.Text = Me.NullText
End Sub
End Class