DataGridView 控件提供了多种列类型,使得用户可以通过多种方式输入和编辑值。但是,如果这些列类型无法满足数据输入要求,您也可以使用承载所选控件的单元格创建自己的列类型。要做到这一点,必须定义派生自
DataGridViewColumn 和
DataGridViewCell 的类。您还必须定义派生自
Control 并实现
IDataGridViewEditingControl 接口的类。
下面的代码示例演示如何创建日历列。此列的单元格在普通的文本框单元格中显示日期,但当用户编辑单元格时,就会出现 DateTimePicker 控件。
using
System;
using
System.Windows.Forms;

namespace
STUDY.ProcessManager

...
{
public class DataGridViewCalendarColumn : DataGridViewColumn

...{
public DataGridViewCalendarColumn()
: base(new DataGridViewCalendarCell())

...{
}

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(DataGridViewCalendarCell)))

...{
throw new InvalidCastException("Must be a CalendarCell");
}
base.CellTemplate = value;
}
}
}
public class DataGridViewCalendarCell : DataGridViewTextBoxCell

...{

public DataGridViewCalendarCell()
: 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 usesd.
return typeof(DataGridViewCalendarEditingControl);
}
}

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;
}
}
}

class DataGridViewCalendarEditingControl : DateTimePicker, IDataGridViewEditingControl

...{
DataGridView dataGridView;
private bool valueChanged = false;
int rowIndex;

public DataGridViewCalendarEditingControl()

...{
this.Format = DateTimePickerFormat.Short;
}

// Implements the IDataGridViewEditingControl.EditingControlFormattedValue
// property.
public object EditingControlFormattedValue

...{
get

...{
return this.Value.ToShortDateString();
}
set

...{
String newValue = value as String;
if (newValue != null)

...{
this.Value = DateTime.Parse(newValue);
}
}
}

// Implements the IDataGridViewEditingControl.GetEditingControlFormattedValue
// method.
public object GetEditingControlFormattedValue(
DataGridViewDataErrorContexts context)

...{
return EditingControlFormattedValue;
}

// Implements the IDataGridViewEditingControl.ApplyCellStyleToEditingControl
// method.
public void ApplyCellStyleToEditingControl(
DataGridViewCellStyle dataGridViewCellStyle)

...{
this.Font = dataGridViewCellStyle.Font;
this.CalendarForeColor = dataGridViewCellStyle.ForeColor;
this.CalendarMonthBackground = dataGridViewCellStyle.BackColor;
}

// Implements the IDataGridViewEditingControl.EditingControlRowIndex
// property.
public int EditingControlRowIndex

...{
get

...{
return rowIndex;
}
set

...{
rowIndex = value;
}
}

// Implements the IDataGridViewEditingControl.EditingControlWantsInputKey
// method.
public bool EditingControlWantsInputKey(
Keys key, bool dataGridViewWantsInputKey)

...{
// Let the DateTimePicker handle the keys in the next list.
switch (key & Keys.KeyCode)

...{
case Keys.Left:
case Keys.Up:
case Keys.Down:
case Keys.Right:
case Keys.Home:
case Keys.End:
case Keys.PageDown:
case Keys.PageUp:
return true;
default:
return false;
}
}

// Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit
// method.
public void PrepareEditingControlForEdit(bool selectAll)

...{
// No preparations is needed.
}

// Implements the IDataGridViewEditingControl.RepositionEditingControlOnValueChange
// property.
public bool RepositionEditingControlOnValueChange

...{
get

...{
return false;
}
}

// Implements the IDataGridViewEditingControl.EditingControlDataGridView
// property.
public DataGridView EditingControlDataGridView

...{
get

...{
return dataGridView;
}
set

...{
dataGridView = value;
}
}

// Implements the IDataGridViewEditingControl.EditingControlValueChanged
// property.
public bool EditingControlValueChanged

...{
get

...{
return valueChanged;
}
set

...{
valueChanged = value;
}
}

// Implements the IDataGridViewEditingControl.EditingPanelCursor
// property.
public Cursor EditingPanelCursor

...{
get

...{
return base.Cursor;
}
}

protected override void OnValueChanged(EventArgs eventargs)

...{
// Notify the DataGridView when the cell's contents was changed.
valueChanged = true;
this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
base.OnValueChanged(eventargs);
}
}
}
使用自定义列:
您可以将以上代码添加到您的已经拥有一个Windows窗体的工程内.并在窗体的Load事件中加入以下代码.
执行您的工程,并验证它是否是您所需要的.
DataGridView dataGridView1
=
new
DataGridView();
DataGridViewTextBoxColumn Column1
=
new
DataGridViewTextBoxColumn();
DataGridViewCalendarColumn Column2
=
new
DataGridViewCalendarColumn();

((System.ComponentModel.ISupportInitialize)(dataGridView1)).BeginInit();
this
.SuspendLayout();
dataGridView1.Columns.Add(Column1);
dataGridView1.Columns.Add(Column2);
dataGridView1.Dock
=
DockStyle.Fill;

this
.Controls.Add(dataGridView1);
((System.ComponentModel.ISupportInitialize)(dataGridView1)).EndInit();
this
.ResumeLayout(
false
);
效果图:
下面的代码示例演示如何创建日历列。此列的单元格在普通的文本框单元格中显示日期,但当用户编辑单元格时,就会出现 DateTimePicker 控件。












































































































































































































































































使用自定义列:
您可以将以上代码添加到您的已经拥有一个Windows窗体的工程内.并在窗体的Load事件中加入以下代码.
执行您的工程,并验证它是否是您所需要的.














效果图: