Imports
System.Windows.Forms
Public
Class
Form1
Dim
WithEvents
dgv
As
DataGridView
Public
Sub
New
()
InitializeComponent()
dgv =
New
DataGridView
dgv.Dock = DockStyle.Fill
Dim
ct
As
System.Windows.Forms.DataGridViewTextBoxColumn =
New
System.Windows.Forms.DataGridViewTextBoxColumn
ct.HeaderText =
"A"
dgv.Columns.Add(ct)
Dim
cb
As
ComboBoxColumn =
New
ComboBoxColumn
cb.HeaderText =
"B"
dgv.Columns.Add(cb)
Dim
cc
As
CalendarColumn =
New
CalendarColumn
cc.HeaderText =
"C"
dgv.Columns.Add(cc)
dgv.Rows.Add(10)
Me
.Controls.Add(dgv)
End
Sub
Private
Sub
dgv_EditingControlShowing(
ByVal
sender
As
Object
,
ByVal
e
As
System.Windows.Forms.DataGridViewEditingControlShowingEventArgs)
Handles
dgv.EditingControlShowing
If
(
TypeOf
e.Control
Is
ComboBoxEditingControl)
Then
Dim
cmb
As
ComboBoxEditingControl =
CType
(e.Control, ComboBoxEditingControl)
If
Not
cmb
Is
Nothing
Then
If
dgv.CurrentRow.Index < 5
Then
cmb.DropDownStyle = ComboBoxStyle.Simple
ElseIf
dgv.CurrentRow.Index > 7
Then
cmb.DropDownStyle = ComboBoxStyle.DropDownList
Else
cmb.DropDownStyle = ComboBoxStyle.DropDown
End
If
End
If
End
If
End
Sub
End
Class
Public
Class
ComboBoxColumn
Inherits
DataGridViewColumn
Public
Sub
New
()
MyBase
.
New
(
New
ComboBoxCell())
End
Sub
Public
Overrides
Property
CellTemplate()
As
DataGridViewCell
Get
Return
MyBase
.CellTemplate
End
Get
Set
(
ByVal
value
As
DataGridViewCell)
If
Not
(value
Is
Nothing
)
AndAlso
_
Not
value.
GetType
().IsAssignableFrom(
GetType
(ComboBoxCell)) _
Then
Throw
New
InvalidCastException(
"Must be a ComboBoxCell"
)
End
If
MyBase
.CellTemplate = value
End
Set
End
Property
End
Class
Public
Class
ComboBoxCell
Inherits
DataGridViewTextBoxCell
Public
Sub
New
()
End
Sub
Public
Overrides
Sub
InitializeEditingControl(
ByVal
rowIndex
As
Integer
, _
ByVal
initialFormattedValue
As
Object
, _
ByVal
dataGridViewCellStyle
As
DataGridViewCellStyle)
MyBase
.InitializeEditingControl(rowIndex, initialFormattedValue, _
dataGridViewCellStyle)
Dim
ctl
As
ComboBoxEditingControl = _
CType
(DataGridView.EditingControl, ComboBoxEditingControl)
ctl.Text =
Me
.Value
ctl.DropDownStyle = ComboBoxStyle.DropDown
End
Sub
Public
Overrides
ReadOnly
Property
EditType()
As
Type
Get
Return
GetType
(ComboBoxEditingControl)
End
Get
End
Property
Public
Overrides
ReadOnly
Property
ValueType()
As
Type
Get
Return
GetType
(
String
)
End
Get
End
Property
Public
Overrides
ReadOnly
Property
DefaultNewRowValue()
As
Object
Get
Return
""
End
Get
End
Property
End
Class
Class
ComboBoxEditingControl
Inherits
ComboBox
Implements
IDataGridViewEditingControl
Private
dataGridViewControl
As
DataGridView
Private
valueIsChanged
As
Boolean
=
False
Private
rowIndexNum
As
Integer
Public
Sub
New
()
Me
.DropDownStyle = ComboBoxStyle.DropDownList
Me
.Items.AddRange(
New
String
() _
{
"1"
,
"2"
,
"3"
,
"4"
,
"5"
,
"6"
})
End
Sub
Public
Property
EditingControlFormattedValue()
As
Object
_
Implements
IDataGridViewEditingControl.EditingControlFormattedValue
Get
Return
Me
.Text
End
Get
Set
(
ByVal
value
As
Object
)
Me
.Text = value
End
Set
End
Property
Public
Function
GetEditingControlFormattedValue(
ByVal
context _
As
DataGridViewDataErrorContexts)
As
Object
_
Implements
IDataGridViewEditingControl.GetEditingControlFormattedValue
Return
Me
.Text
End
Function
Public
Sub
ApplyCellStyleToEditingControl(
ByVal
dataGridViewCellStyle
As
_
DataGridViewCellStyle) _
Implements
IDataGridViewEditingControl.ApplyCellStyleToEditingControl
Me
.Font = dataGridViewCellStyle.Font
Me
.ForeColor = dataGridViewCellStyle.ForeColor
Me
.BackColor = dataGridViewCellStyle.BackColor
End
Sub
Public
Property
EditingControlRowIndex()
As
Integer
_
Implements
IDataGridViewEditingControl.EditingControlRowIndex
Get
Return
rowIndexNum
End
Get
Set
(
ByVal
value
As
Integer
)
rowIndexNum = value
End
Set
End
Property
Public
Function
EditingControlWantsInputKey(
ByVal
key
As
Keys, _
ByVal
dataGridViewWantsInputKey
As
Boolean
)
As
Boolean
_
Implements
IDataGridViewEditingControl.EditingControlWantsInputKey
Select
Case
key
And
Keys.KeyCode
Case
Keys.Left, Keys.Up, Keys.Down, Keys.Right, _
Keys.Home, Keys.
End
, Keys.PageDown, Keys.PageUp
Return
True
Case
Else
Return
False
End
Select
End
Function
Public
Sub
PrepareEditingControlForEdit(
ByVal
selectAll
As
Boolean
) _
Implements
IDataGridViewEditingControl.PrepareEditingControlForEdit
End
Sub
Public
ReadOnly
Property
RepositionEditingControlOnValueChange() _
As
Boolean
Implements
_
IDataGridViewEditingControl.RepositionEditingControlOnValueChange
Get
Return
False
End
Get
End
Property
Public
Property
EditingControlDataGridView()
As
DataGridView _
Implements
IDataGridViewEditingControl.EditingControlDataGridView
Get
Return
dataGridViewControl
End
Get
Set
(
ByVal
value
As
DataGridView)
dataGridViewControl = value
End
Set
End
Property
Public
Property
EditingControlValueChanged()
As
Boolean
_
Implements
IDataGridViewEditingControl.EditingControlValueChanged
Get
Return
valueIsChanged
End
Get
Set
(
ByVal
value
As
Boolean
)
valueIsChanged = value
End
Set
End
Property
Public
ReadOnly
Property
EditingControlCursor()
As
Cursor _
Implements
IDataGridViewEditingControl.EditingPanelCursor
Get
Return
MyBase
.Cursor
End
Get
End
Property
Protected
Overrides
Sub
OnTextChanged(
ByVal
e
As
EventArgs)
valueIsChanged =
True
Me
.EditingControlDataGridView.NotifyCurrentCellDirty(
True
)
MyBase
.OnTextChanged(e)
End
Sub
Protected
Overrides
Sub
OnSelectedValueChanged(
ByVal
e
As
EventArgs)
valueIsChanged =
True
Me
.EditingControlDataGridView.NotifyCurrentCellDirty(
True
)
MyBase
.OnSelectedValueChanged(e)
End
Sub
End
Class
Public
Class
CalendarColumn
Inherits
DataGridViewColumn
Public
Sub
New
()
MyBase
.
New
(
New
CalendarCell())
End
Sub
Public
Overrides
Property
CellTemplate()
As
DataGridViewCell
Get
Return
MyBase
.CellTemplate
End
Get
Set
(
ByVal
value
As
DataGridViewCell)
If
Not
(value
Is
Nothing
)
AndAlso
_
Not
value.
GetType
().IsAssignableFrom(
GetType
(CalendarCell)) _
Then
Throw
New
InvalidCastException(
"Must be a CalendarCell"
)
End
If
MyBase
.CellTemplate = value
End
Set
End
Property
End
Class
Public
Class
CalendarCell
Inherits
DataGridViewTextBoxCell
Public
Sub
New
()
Me
.Style.Format =
"d"
End
Sub
Public
Overrides
Sub
InitializeEditingControl(
ByVal
rowIndex
As
Integer
, _
ByVal
initialFormattedValue
As
Object
, _
ByVal
dataGridViewCellStyle
As
DataGridViewCellStyle)
MyBase
.InitializeEditingControl(rowIndex, initialFormattedValue, _
dataGridViewCellStyle)
Dim
ctl
As
CalendarEditingControl = _
CType
(DataGridView.EditingControl, CalendarEditingControl)
ctl.Value = IIf(
Me
.Value
Is
Nothing
, ctl.Value,
CType
(
Me
.Value, DateTime))
End
Sub
Public
Overrides
ReadOnly
Property
EditType()
As
Type
Get
Return
GetType
(CalendarEditingControl)
End
Get
End
Property
Public
Overrides
ReadOnly
Property
ValueType()
As
Type
Get
Return
GetType
(DateTime)
End
Get
End
Property
Public
Overrides
ReadOnly
Property
DefaultNewRowValue()
As
Object
Get
Return
DateTime.Now
End
Get
End
Property
End
Class
Class
CalendarEditingControl
Inherits
DateTimePicker
Implements
IDataGridViewEditingControl
Private
dataGridViewControl
As
DataGridView
Private
valueIsChanged
As
Boolean
=
False
Private
rowIndexNum
As
Integer
Public
Sub
New
()
Me
.Format = DateTimePickerFormat.
Short
End
Sub
Public
Property
EditingControlFormattedValue()
As
Object
_
Implements
IDataGridViewEditingControl.EditingControlFormattedValue
Get
Return
Me
.Value.ToShortDateString()
End
Get
Set
(
ByVal
value
As
Object
)
If
TypeOf
value
Is
[
String
]
Then
Me
.Value = DateTime.Parse(
CStr
(value))
End
If
End
Set
End
Property
Public
Function
GetEditingControlFormattedValue(
ByVal
context _
As
DataGridViewDataErrorContexts)
As
Object
_
Implements
IDataGridViewEditingControl.GetEditingControlFormattedValue
Return
Me
.Value.ToShortDateString()
End
Function
Public
Sub
ApplyCellStyleToEditingControl(
ByVal
dataGridViewCellStyle
As
_
DataGridViewCellStyle) _
Implements
IDataGridViewEditingControl.ApplyCellStyleToEditingControl
Me
.Font = dataGridViewCellStyle.Font
Me
.CalendarForeColor = dataGridViewCellStyle.ForeColor
Me
.CalendarMonthBackground = dataGridViewCellStyle.BackColor
End
Sub
Public
Property
EditingControlRowIndex()
As
Integer
_
Implements
IDataGridViewEditingControl.EditingControlRowIndex
Get
Return
rowIndexNum
End
Get
Set
(
ByVal
value
As
Integer
)
rowIndexNum = value
End
Set
End
Property
Public
Function
EditingControlWantsInputKey(
ByVal
key
As
Keys, _
ByVal
dataGridViewWantsInputKey
As
Boolean
)
As
Boolean
_
Implements
IDataGridViewEditingControl.EditingControlWantsInputKey
Select
Case
key
And
Keys.KeyCode
Case
Keys.Left, Keys.Up, Keys.Down, Keys.Right, _
Keys.Home, Keys.
End
, Keys.PageDown, Keys.PageUp
Return
True
Case
Else
Return
False
End
Select
End
Function
Public
Sub
PrepareEditingControlForEdit(
ByVal
selectAll
As
Boolean
) _
Implements
IDataGridViewEditingControl.PrepareEditingControlForEdit
End
Sub
Public
ReadOnly
Property
RepositionEditingControlOnValueChange() _
As
Boolean
Implements
_
IDataGridViewEditingControl.RepositionEditingControlOnValueChange
Get
Return
False
End
Get
End
Property
Public
Property
EditingControlDataGridView()
As
DataGridView _
Implements
IDataGridViewEditingControl.EditingControlDataGridView
Get
Return
dataGridViewControl
End
Get
Set
(
ByVal
value
As
DataGridView)
dataGridViewControl = value
End
Set
End
Property
Public
Property
EditingControlValueChanged()
As
Boolean
_
Implements
IDataGridViewEditingControl.EditingControlValueChanged
Get
Return
valueIsChanged
End
Get
Set
(
ByVal
value
As
Boolean
)
valueIsChanged = value
End
Set
End
Property
Public
ReadOnly
Property
EditingControlCursor()
As
Cursor _
Implements
IDataGridViewEditingControl.EditingPanelCursor
Get
Return
MyBase
.Cursor
End
Get
End
Property
Protected
Overrides
Sub
OnValueChanged(
ByVal
eventargs
As
EventArgs)
valueIsChanged =
True
Me
.EditingControlDataGridView.NotifyCurrentCellDirty(
True
)
MyBase
.OnValueChanged(eventargs)
End
Sub
End
Class