C#DateTimePicker DataBinding解析事件不起作用
我有一个datetimepicker,我绑定数据集中的可空日期/时间列。 我成功应用格式事件为空和非空对象值。 但是,当我取消选中dtp控件时,它不会在数据集中设置为null。 这是我的代码:
dtpBirthdate.DataBindings.Add(new Binding("Value", bsStaff, "birthDate", true));
dtpBirthdate.DataBindings["Value"].Format += new ConvertEventHandler(dtpFormat);
dtpBirthdate.DataBindings["Value"].Parse += new ConvertEventHandler(dtpParse);
格式化和解析事件:
private void dtpFormat(object sender, ConvertEventArgs e)
{
Binding b = sender as Binding;
if(b != null)
{
DateTimePicker dtp = (b.Control as DateTimePicker);
if(dtp != null)
{
if (e.Value == null || e.Value == DBNull.Value)
{
dtp.Checked = false;
dtp.CustomFormat = " ";
e.Value = false;
}
else
{
dtp.Checked = true;
dtp.CustomFormat = "dd-MMM-yyyy";
dtp.Value = (DateTime) e.Value;
}
}
}
}
private void dtpParse(object sender, ConvertEventArgs e)
{
Binding b = sender as Binding;
if (b != null)
{
DateTimePicker dtp = (b.Control as DateTimePicker);
if (dtp != null)
{
if (dtp.Checked == false)
{
e.Value = DBNull.Value;
}
else
{
e.Value = dtp.Value;
}
}
}
}
调试后,我发现它在解析和格式化事件之间发生无限循环。 我的代码有什么问题?
编辑:还有一个绑定到bsStaff绑定源的datagridview。
在空检查之前,您正在将“绑定b =发件人作为绑定”。 检查发送者是否在投射前是空的,你应该没问题。
我注意到,您正在为两个控件使用Databinding事件捕获,但在您的第一个dtpFormat事件处理程序中,您不首先检查数据绑定值。
Imho这行代码:
if (e.Value == null || e.Value == DBNull.Value)
需要改变
if (e.Value == DBNull.Value || e.Value == null)
问题是你需要将e.Value设置为某个东西; 但如果你改变它,它会再次解析。 尝试将其设置为原始值。
e.Value = dtp.Value;
这里有一个链接给曾经遇到过这个问题的人。 他们没有使用DbNull.Value,但除此之外,它与您正在做的事情几乎完全相同。
http://blogs.interknowlogy.com/2007/01/21/winforms-databinding-datetimepicker-to-a-nullable-type/
链接地址: http://www.djcxy.com/p/95825.html上一篇: C# DateTimePicker DataBinding Parse event not working
下一篇: How to handle a transitive dependency conflict using Git submodules and CMake?