2014-01-24 34 views
0

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

回答

2

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

+0

好的。这就说得通了。我试着扩展DateTimePicker的方法如下:'class NullableDateTimePicker:DateTimePicker { public DateTime NullableValue { get { return base.Value; } set if((DateTime)value == null) base.Value = DateTime.Today;其他 base.Value = value; } } }'但问题依然存在。 –

+0

没有必要声明DateTime类型的另一个属性,因为这是DateTimePicker.Value属性的第一个问题。我不确定是否有另外一种方法,但是我已经看到这种方法使用了Object类型的属性,该属性需要接受DateTime值和DBNull对象。请注意,数据不会为空,即没有对象,而是一个DBNull对象,它表示数据库空值。 – jmcilhinney

+0

啊,我明白了。得到它完美的工作表示感谢。 –

0

这个问题通过简单地控制基于本网站绑定源的addrow方法解决了我的情况:http://www.vbforums.com/showthread.php?645401-RESOLVED-datetimepicker-with-binding-source

添加上绑定导航一个新的按钮(为你的“添加”使用),并删除旧的。

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

DataRowView row = (DataRowView)bs_.AddNew(); 
row["dbDateTime"] = DateTime.Now; 

其中dbDateTime是你的数据库字段。

尽管您可能必须向click事件添加更多代码,例如移动到数据网格上新添加的行,但该选项迄今为止最容易实现。