在 WinForm 的 DataGridView 想要使用日期格式
但是在加入資料行時卻沒有相關型別可以使用
只好用 DataGridViewTextBoxColumn 來湊合著用
怕使用者若亂輸入非日期格式只好多寫點程式來檢查
難道沒有更好的方式?
答案就是自訂一個型別為 DateTimePicker 的 DataGridViewColumn
如下圖,是否跟你 DataGridView 所能增加控制項的數量不一樣? ##CONTINUE##
1. 繼承 DateTimePicker 並實作 IDataGridViewEditingControl
2. 繼承 DataGridViewTextBoxCell 來自訂 DataGridView 的 Cell,並把自訂的 DateTimePicker 放進 Cell
3. 繼承 DataGridViewColumn 來自訂 DataGridView 的 Column,並把自訂的 Cell 放進 Column
Public Class DataGridViewCalendarEditingControl 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
Public Class DataGridViewCalendarCell 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 DataGridViewCalendarEditingControl = _ CType(DataGridView.EditingControl, DataGridViewCalendarEditingControl) If Not Me.Value Is Nothing Then ctl.Value = CType(Me.Value, DateTime) End If End Sub Public Overrides ReadOnly Property EditType() As Type Get Return GetType(DataGridViewCalendarEditingControl) End Get End Property End Class
Public Class DataGridViewCalendarColumn Inherits DataGridViewColumn Public Sub New() MyBase.New(New DataGridViewCalendarCell()) 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(DataGridViewCalendarCell)) _ Then Throw New InvalidCastException("Must be a CalendarCell") End If MyBase.CellTemplate = value End Set End Property End Class應用的情況如下圖
沒有留言:
張貼留言