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?