跟踪DataGridView选择null DateTime列

本文关键字:DateTime null 选择 DataGridView 跟踪 | 更新日期: 2023-09-27 18:05:45

首先,我的问题是实验性的,而不是实际问题。我的数据库表有一列datetime允许空值。在该列只有1条记录具有空值。现在,在使用数据适配器(非常基本)将数据填充到DataTable并在DataGridView上显示它之后。我可以看到具有null值的datetime的单元格是空的(DataTable中包含的底层数据是DBNull)。我有一个DateTimePicker绑定到datetime字段(它可以有DBNull值)。现在,如果我将DataGridView上的选择导航到我提到的datetime列中具有空值的行,那么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上当前选择相对应的info OK。这是我在使用Binding时最讨厌的事情。它非常方便,但有时不可能理解和调试。如果使用事件处理程序(SelectionChanged事件)跟踪选择并手动更新控件,则此问题永远不会如此耗时。

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

跟踪DataGridView选择null DateTime列

我所做的实际上应该工作,但是这里关于DateTimePicker的格式化值有点错误,值应该在MinDateMaxDate的范围内。它没有抛出任何异常,但如果行有空datetime列是第一行,绑定后抛出一个异常,让我知道一切都错了。现在代码可以像这样:

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