【问题标题】:Tracking DataGridView selection with null DateTime column?使用 null DateTime 列跟踪 DataGridView 选择?
【发布时间】:2015-07-31 07:06:48
【问题描述】:

首先,我的问题是实验性问题,而不是实际问题。我的数据库表有一列datetime,它允许空值。该列只有 1 条记录具有空值。现在使用数据适配器(非常基本)将数据填充到DataTable 并将其显示在DataGridView 上。我可以看到日期时间为空值的单元格是空的(DataTable 中包含的基础数据是DBNull)。我有一个 DateTimePicker 绑定到 datetime 字段(可以有 DBNull 值)。现在,如果我将 DataGridView 上的选择导航到我提到的日期时间列中具有空值的行,则 DateTimePicker(连同其他一些文本字段)不会更新该值(看起来它停留在之前的选择中)。我还尝试创建一个Binding,它将DBNull 格式化为DateTime.MinValue,但没有任何变化。代码如下:

var dt = new DataTable();
myAdapter.Fill(dt);
dataGridView.DataSource = dt;
//bind controls
var binding = new Binding("Value", dataGridView.DataSource, "birthdate");
//here is what I tried to convert DBNull.Value to DateTime.MinValue
binding.Format += (s,e) => {
   //debug shows that the execution can jump in here
   if(e.Value == DBNull.Value){
       e.Value = DateTime.MinValue;
   }
};
myDatePicker.DataBindings.Add(binding);

数据库表很简单,有一些列。我认为问题可能在于 DateTimePicker 如何处理数据。如果没有将数据绑定到它,控件会显示与 DataGridView 上的当前选择相对应的信息 OK。这是我在使用 Binding 时最讨厌的事情。这非常方便,但有时只是不可能理解和调试。如果使用事件处理程序(SelectionChanged 事件)跟踪选择并手动更新控件,则此问题永远不会如此耗时。

我希望有人遇到过这个问题,可以给我一些建议。谢谢。

【问题讨论】:

    标签: c# winforms data-binding datagridview ado.net


    【解决方案1】:

    好吧,我所做的实际上应该可以工作,但是这里关于DateTimePicker 的格式化值有点错误,该值应该在MinDateMaxDate 的范围内。它没有抛出任何异常,但是如果具有空日期时间列的行是第一行,则在绑定后将立即抛出异常并让我知道所有错误。现在代码可以是这样的:

    binding.Format += (s,e) => {
      //debug shows that the execution can jump in here
      if(e.Value == DBNull.Value){
         e.Value = myDatePicker.MinDate;
      }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-31
      • 2018-08-19
      • 1970-01-01
      • 2011-05-27
      相关资源
      最近更新 更多