在 .NET DataGrid 中使用 DateTimePicker 的可空日期时间列





5.00/5 (14投票s)
在 .NET DataGrid 中使用 DateTimePicker 的可空日期时间列。
引言
我一直认识很多对标准的 .NET 2.0 DataGridView
和可空 DateTime
列(使用 Oracle PL/SQL 列定义创建)有问题的人
dtReceived DATE
或者在 Transact SQL 中使用 NULL 值的 MS SQL Server DateTime
列
dtReceived DATETIME NULL
Google 搜索通常会给出这个微软的日历列示例:如何:在 Windows Forms DataGridView 单元格中托管控件。这是一个很好的起点,但它还不够。您永远无法正确地用 NULL
填充 DateTime DataGridView
单元格。我发现了很多简单 DateTimePicker
类的变体,但在 DataGridView
中,可空 DateTime
列的可用示例却很少。
解决方案
我在互联网上花费了大量时间搜索,并找到了一篇关于可空 DateTimePicker
的好文章:DateTimePicker DBNull。然后我做了一些更正,并作为“神奇触点”,它现在适用于 DataGridView
。
使用代码
我们需要以下步骤
- 将类
DateTimePicker
重命名为DatePicker
(我认为相同名称的不同类是一个不好的做法) - 将以下代码片段添加到
DatePicker
类 - 更正来自微软示例的 CalendarEditingControl.cs,以便在我们的
DatePicker
中使用 - 更正来自微软示例的 CalendarCell.cs 以适用于
DBNull
public class DatePicker : System.Windows.Forms.DateTimePicker
{..
public string ToShortDateString()
{
if (!realDate)
return String.Empty;
else
{
DateTime dt = (DateTime)Value;
return dt.ToShortDateString();
}
}
class CalendarEditingControl : DatePicker, IDataGridViewEditingControl { ...
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;
// ++ vic 14-aug-2009
object val = null;
try
{
val = this.Value;
}
catch (Exception ex)
{
// Argument ot of range (value doesn't exists in collection)
return;
}
if (val != System.DBNull.Value)
ctl.Value = (DateTime)val;
}
就这样,伙计们 :)
您应该按 DEL 键来设置一个填充了 NULL
的 DateTime
单元格。
源代码已附上。您可以直接在您的项目中像在 微软示例 (DatePicker.cs, CalendarCell.cs, CalendarColumn.cs, CalendarEditingControl.cs) 中一样使用我的项目中的文件
private void Form1_Load(object sender, EventArgs e)
{
CalendarColumn col = new CalendarColumn();
this.dataGridView1.Columns.Add(col);
this.dataGridView1.RowCount = 5;
foreach (DataGridViewRow row in this.dataGridView1.Rows)
{
row.Cells[0].Value = DateTime.Now;
}
}
或者从 Microsoft Visual Studio 数据设计器中获取 DataGrid(右键单击 DataGridView,然后从上下文菜单中选择“编辑列”)
我附上了一个带有数据库的真实示例(Visual Studio 2008 / SQL Express 数据库)。
历史
- 2009 年 8 月 14 日:发布初始版本。
- 2009 年 8 月 16 日:添加数据库示例。