C# DateTimePicker破坏数据绑定

C# DateTimePicker破坏数据绑定,c#,winforms,C#,Winforms,我有一个带有两个数据绑定文本框的表单,一个数据绑定DateTimePicker和一个BindingNavigator。我在运行时将这些组件绑定到相关数据源(文本框和DateTimePicker的“文本”和“值”分别绑定到数据集中的相关字段)。所有组件都正确显示当前记录。通常,单击导航器上的“添加新项目”按钮时,所有文本框都将清除,以准备新条目。但是,我有一个问题,即当绑定DateTimePicker时不会发生这种情况,而且任何更新数据集的尝试都不会正确发生。如果我忽略了绑定DateTimePic

我有一个带有两个数据绑定文本框的表单,一个数据绑定DateTimePicker和一个BindingNavigator。我在运行时将这些组件绑定到相关数据源(文本框和DateTimePicker的“文本”和“值”分别绑定到数据集中的相关字段)。所有组件都正确显示当前记录。通常,单击导航器上的“添加新项目”按钮时,所有文本框都将清除,以准备新条目。但是,我有一个问题,即当绑定DateTimePicker时不会发生这种情况,而且任何更新数据集的尝试都不会正确发生。如果我忽略了绑定DateTimePicker,那么一切都会按预期工作。这种行为的原因是什么?有没有解决办法?

DateTimePicker不支持绑定到可为空的数据。添加新行时,该字段的值默认为DBNull.value,无法成功转换为可分配给DateTimePicker的value属性(类型为DateTime)的值。您需要扩展DateTimePicker并添加一个同时支持DateTime值和DBNull对象的新属性,然后绑定该属性,或者设置DataColumn的DefaultValue属性,以便DateTimePicker中始终显示一个DateTime。

对于我的场景,通过简单地控制addrow,这个问题得到了解决基于此站点的绑定源的方法:

在绑定导航器上添加一个新按钮(用作“添加”)并删除旧按钮

连接到click事件并设置要添加的新行的日期时间:

DataRowView row = (DataRowView)bs_.AddNew();
row["dbDateTime"] = DateTime.Now;
其中dbDateTime是您的数据库字段


尽管您可能需要向click事件添加更多代码,例如移动到datagrid上新添加的行,但此选项是迄今为止最容易实现的。

Ok。这是有道理的。我尝试了如下扩展DateTimePicker的方法:
class NullableDateTimePicker:DateTimePicker{public DateTime NullableValue{get{return base.Value;}set{if((DateTime)Value==null)base.Value=DateTime.Today;else base.Value=Value;}}}
但问题仍然存在。声明另一个DateTime类型的属性没有意义,因为这是DateTimePicker.Value属性的首要问题。我不确定是否有其他方法,但我以前见过使用Object类型的属性来实现这一点,它是接受DateTime值和DBNull对象所必需的。请注意,数据不是null,即没有对象,而是DBNull对象,它表示数据库null。