DataGridView 控制元件提供了多種列型別,使得使用者可以透過多種方式輸入和編輯值。但是,如果這些列型別無法滿足資料輸入要求,您也可以使用承載所選控制元件的單元格建立自己的列型別。要做到這一點,必須定義派生自 DataGridViewColumn 和 DataGridViewCell 的類。您還必須定義派生自 Control 並實現 IDataGridViewEditingControl 介面的類。
下面的程式碼示例演示如何建立日曆列。此列的單元格在普通的文字框單元格中顯示日期,但當用戶編輯單元格時,就會出現 DateTimePicker 控制元件。為了避免必須再次實現文字框顯示功能,CalendarCell 類從 DataGridViewTextBoxCell 類派生,而不是直接從 DataGridViewCell 類繼承。
注意
當從 DataGridViewCell 或 DataGridViewColumn 派生並向派生類新增新屬性時,請確保重寫 Clone 方法以便在克隆操作期間複製新屬性。還應呼叫基類的 Clone 方法,以便將基類的屬性複製到新的單元格或列中。
using System;
using System.Windows.Forms;
public class CalendarColumn : DataGridViewColumn
{
public CalendarColumn() : base(new CalendarCell())
}
public override DataGridViewCell CellTemplate
get
return base.CellTemplate;
set
// Ensure that the cell used for the template is a CalendarCell.
if (value != null &&
!value.GetType().IsAssignableFrom(typeof(CalendarCell)))
throw new InvalidCastException("Must be a CalendarCell");
base.CellTemplate = value;
public class CalendarCell : DataGridViewTextBoxCell
public CalendarCell()
: base()
// Use the short date format.
this.Style.Format = "d";
public override void InitializeEditingControl(int rowIndex, object
initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
// Set the value of the editing control to the current cell value.
base.InitializeEditingControl(rowIndex, initialFormattedValue,
dataGridViewCellStyle);
CalendarEditingControl ctl =
DataGridView.EditingControl as CalendarEditingControl;
ctl.Value = (DateTime)this.Value;
public override Type EditType
// Return the type of the editing contol that CalendarCell uses.
return typeof(CalendarEditingControl);
public override Type ValueType
// Return the type of the value that CalendarCell contains.
return typeof(DateTime);
public override object DefaultNewRowValue
// Use the current date and time as the default value.
return DateTime.Now;
DataGridView 控制元件提供了多種列型別,使得使用者可以透過多種方式輸入和編輯值。但是,如果這些列型別無法滿足資料輸入要求,您也可以使用承載所選控制元件的單元格建立自己的列型別。要做到這一點,必須定義派生自 DataGridViewColumn 和 DataGridViewCell 的類。您還必須定義派生自 Control 並實現 IDataGridViewEditingControl 介面的類。
下面的程式碼示例演示如何建立日曆列。此列的單元格在普通的文字框單元格中顯示日期,但當用戶編輯單元格時,就會出現 DateTimePicker 控制元件。為了避免必須再次實現文字框顯示功能,CalendarCell 類從 DataGridViewTextBoxCell 類派生,而不是直接從 DataGridViewCell 類繼承。
注意
當從 DataGridViewCell 或 DataGridViewColumn 派生並向派生類新增新屬性時,請確保重寫 Clone 方法以便在克隆操作期間複製新屬性。還應呼叫基類的 Clone 方法,以便將基類的屬性複製到新的單元格或列中。
using System;
using System.Windows.Forms;
public class CalendarColumn : DataGridViewColumn
{
public CalendarColumn() : base(new CalendarCell())
{
}
public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
// Ensure that the cell used for the template is a CalendarCell.
if (value != null &&
!value.GetType().IsAssignableFrom(typeof(CalendarCell)))
{
throw new InvalidCastException("Must be a CalendarCell");
}
base.CellTemplate = value;
}
}
}
public class CalendarCell : DataGridViewTextBoxCell
{
public CalendarCell()
: base()
{
// Use the short date format.
this.Style.Format = "d";
}
public override void InitializeEditingControl(int rowIndex, object
initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
// Set the value of the editing control to the current cell value.
base.InitializeEditingControl(rowIndex, initialFormattedValue,
dataGridViewCellStyle);
CalendarEditingControl ctl =
DataGridView.EditingControl as CalendarEditingControl;
ctl.Value = (DateTime)this.Value;
}
public override Type EditType
{
get
{
// Return the type of the editing contol that CalendarCell uses.
return typeof(CalendarEditingControl);
}
}
public override Type ValueType
{
get
{
// Return the type of the value that CalendarCell contains.
return typeof(DateTime);
}
}
public override object DefaultNewRowValue
{
get
{
// Use the current date and time as the default value.
return DateTime.Now;
}
}
}