65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (14投票s)

2009 年 8 月 17 日

CPOL

2分钟阅读

viewsIcon

154301

downloadIcon

12435

在 .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

使用代码

我们需要以下步骤

  1. 将类 DateTimePicker 重命名为 DatePicker(我认为相同名称的不同类是一个不好的做法)
  2. public class DatePicker : System.Windows.Forms.DateTimePicker
    {..
  3. 将以下代码片段添加到 DatePicker
  4. public string ToShortDateString() 
    { 
        if (!realDate) 
            return String.Empty; 
        else 
        { 
            DateTime dt = (DateTime)Value; 
            return dt.ToShortDateString(); 
        }
    }
  5. 更正来自微软示例的 CalendarEditingControl.cs,以便在我们的 DatePicker 中使用
  6. class CalendarEditingControl : DatePicker, IDataGridViewEditingControl { ...
  7. 更正来自微软示例的 CalendarCell.cs 以适用于 DBNull
  8. 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 键来设置一个填充了 NULLDateTime 单元格。

源代码已附上。您可以直接在您的项目中像在 微软示例 (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 日:添加数据库示例。
© . All rights reserved.