DataGridTimePickerColumn类代码
using
System;
using
System.Data;
using
System.Windows.Forms;
using
System.Drawing;

public
class
DataGridTimePickerColumn : DataGridColumnStyle

{
private DateTimePicker myDateTimePicker = new DateTimePicker();
private bool isEditing;

public DataGridTimePickerColumn() : base()

{
myDateTimePicker.Visible = false;
}

protected override void Abort(int rowNum)

{
isEditing = false;
myDateTimePicker.ValueChanged -= new EventHandler(TimePickerValueChanged);
Invalidate();
}

protected override bool Commit(CurrencyManager dataSource, int rowNum)

{
myDateTimePicker.Bounds = Rectangle.Empty;
myDateTimePicker.ValueChanged -= new EventHandler(TimePickerValueChanged);

if (!isEditing)

{
return true;
}

isEditing = false;

try

{
DateTime value = myDateTimePicker.Value;
SetColumnValueAtRow(dataSource, rowNum, value);
}
catch (Exception)

{
Abort(rowNum);
return false;
}

Invalidate();
return true;
}

protected override void Edit(
CurrencyManager source,
int rowNum,
Rectangle bounds,
bool readOnly,
string instantText,
bool cellIsVisible)

{
DateTime value = (DateTime)GetColumnValueAtRow(source, rowNum);
if (cellIsVisible)

{
myDateTimePicker.Bounds = new Rectangle(bounds.X + 2, bounds.Y + 2,
bounds.Width - 4, bounds.Height - 4);
myDateTimePicker.Value = value;
myDateTimePicker.Visible = true;
myDateTimePicker.ValueChanged += new EventHandler(TimePickerValueChanged);
}
else

{
myDateTimePicker.Value = value;
myDateTimePicker.Visible = false;
}

if (myDateTimePicker.Visible)

{
DataGridTableStyle.DataGrid.Invalidate(bounds);
}
}

protected override Size GetPreferredSize(Graphics g, object value)

{
return new Size(100, myDateTimePicker.PreferredHeight + 4);
}

protected override int GetMinimumHeight()

{
return myDateTimePicker.PreferredHeight + 4;
}

protected override int GetPreferredHeight(Graphics g, object value)

{
return myDateTimePicker.PreferredHeight + 4;
}

protected override void Paint(Graphics g, Rectangle bounds, CurrencyManager source, int rowNum)

{
Paint(g, bounds, source, rowNum, false);
}
protected override void Paint(
Graphics g,
Rectangle bounds,
CurrencyManager source,
int rowNum,
bool alignToRight)

{
Paint(
g,bounds,
source,
rowNum,
Brushes.Red,
Brushes.Blue,
alignToRight);
}
protected override void Paint(
Graphics g,
Rectangle bounds,
CurrencyManager source,
int rowNum,
Brush backBrush,
Brush foreBrush,
bool alignToRight)

{
DateTime date = (DateTime)GetColumnValueAtRow(source, rowNum);
Rectangle rect = bounds;
g.FillRectangle(backBrush,rect);
rect.Offset(0, 2);
rect.Height -= 2;
g.DrawString(date.ToString("d"), this.DataGridTableStyle.DataGrid.Font, foreBrush, rect);
}

protected override void SetDataGridInColumn(DataGrid value)

{
base.SetDataGridInColumn(value);
if (myDateTimePicker.Parent != null)

{
myDateTimePicker.Parent.Controls.Remove(myDateTimePicker);
}
if (value != null)

{
value.Controls.Add(myDateTimePicker);
}
}

private void TimePickerValueChanged(object sender, EventArgs e)

{
this.isEditing = true;
base.ColumnStartedEditing(myDateTimePicker);
}
}
测试代码
private
void
Form_Load(
object
sender, System.EventArgs e)

{
InitForm( dataGrid1 );

DataTable namesDataTable = new DataTable("NamesTable");

namesDataTable.Columns.Add("Name",typeof(string));
namesDataTable.Columns.Add("Date", typeof(DateTime));

DataSet namesDataSet = new DataSet();
namesDataSet.Tables.Add(namesDataTable);
dataGrid1.DataSource = namesDataSet;
dataGrid1.DataMember = "NamesTable";

//添加样式
AddGridStyle( dataGrid1 );
AddData( namesDataTable );

}

private
void
AddGridStyle( DataGrid grid)

{
DataGridTableStyle myGridStyle = new DataGridTableStyle();
myGridStyle.GridColumnStyles.Clear();
myGridStyle.MappingName = "NamesTable";

DataGridTextBoxColumn nameColumnStyle = new DataGridTextBoxColumn();
nameColumnStyle.MappingName = "Name";
nameColumnStyle.HeaderText= "Name";
myGridStyle.GridColumnStyles.Add(nameColumnStyle);

DataGridTimePickerColumn timePickerColumnStyle = new DataGridTimePickerColumn();
timePickerColumnStyle.MappingName = "Date";
timePickerColumnStyle.HeaderText = "Date";
timePickerColumnStyle.Width = 100;
myGridStyle.GridColumnStyles.Add(timePickerColumnStyle);

grid.TableStyles.Add(myGridStyle);
}

private
void
AddData( DataTable namesDataTable )

{
DataRow dRow = namesDataTable.NewRow();
dRow["Name"] = "小站";
dRow["Date"] = new DateTime(2001, 12, 01);
namesDataTable.Rows.Add(dRow);

dRow = namesDataTable.NewRow();
dRow["Name"] = "小李";
dRow["Date"] = new DateTime(2001, 12, 04);
namesDataTable.Rows.Add(dRow);

dRow = namesDataTable.NewRow();
dRow["Name"] = "小吴";
dRow["Date"] = new DateTime(2001, 12, 29);
namesDataTable.Rows.Add(dRow);

namesDataTable.AcceptChanges();
}

private
void
InitForm( DataGrid grid)

{
grid.TabStop = true;
grid.TabIndex = 1;
}