C# 运行调试器时ArgumentOutOfRangeException与数据绑定[VS2010] 问题

C# 运行调试器时ArgumentOutOfRangeException与数据绑定[VS2010] 问题,c#,winforms,visual-studio-2010,data-binding,datetimepicker,C#,Winforms,Visual Studio 2010,Data Binding,Datetimepicker,假设您有一个要对其执行数据绑定的类。看起来是这样的: public class DataClass { private DateTime date; public DataClass() { date = new DateTime(2014, 1, 1); } public DateTime Date { get { return date; } set { date = value; }

假设您有一个要对其执行数据绑定的类。看起来是这样的:

public class DataClass
{
    private DateTime date;

    public DataClass()
    {
        date = new DateTime(2014, 1, 1);
    }

    public DateTime Date
    {
        get { return date; }
        set { date = value; }
    }

}
现在假设您有一个表单,并且希望在该表单中的DateTimePicker上绑定DataClass的实例。创建和初始化数据绑定如下(设计器代码):

然后(不可避免地)绑定到日期选择器(设计器代码):

并将所需对象设置为数据源:

bindingSource.DataSource = new DataClass();
当您尝试调试应用程序时,会出现以下异常:

ArgumentOutOfRangeException值'1/1/0001 00:00:00'对'Value'无效“值”应介于“MinDate”和“MaxDate”之间

有趣的是,当你尝试运行应用程序时,一切都很好

尝试的解决方案 我尝试将数据源更新模式设置为“从不”,我尝试将格式类型设置为“日期时间”,我尝试将空值设置为类似“01/01/2000”(不带引号)的值,猜猜看,什么都没有发生

现在有一些解决方案,例如

  • 不要使用数据绑定或
  • 子类化日期选择器和“覆盖”值,这样就不会因为给它一个如此低的值而惩罚你(甚至更好)
  • 找出为什么绑定过程会将未使用的值传递给绑定控件,而所需的值就在对象中
对于每个范围检查控件,如NumericUpDowns,都是如此。因此,我正在寻找最后一个问题的答案(并希望找到解决方案)。我不敢相信,在实现绑定过程时,有人想到在属性中传递默认值,并且没有预测范围检查控件的情况

编辑
还有一件更重要的事:问题是,在.net framework 3.5上不可复制,我使用的是4.0。

我发现在绑定DateTimePicker(在.net 4.5中)的Value属性时也有同样的问题

将同一DateTime结构绑定到选择器的Text属性时,问题消失了

这有点违反直觉,但它在两方面都很好(显示现有值和将选定日期存储到结构中)

它仍然会抛出类型为“system.argumentoutofrangeexception”的第一次意外异常,但dll会捕获该异常,在绑定到Value属性时不会捕获相同的异常

希望这能帮助别人

关于,,
Leo Prast

此代码必须正常工作。
dateTimePicker.DataBindings.Add(new System.Windows.Forms.Binding("Value", this.bindingSource, "Date", true));
bindingSource.DataSource = new DataClass();