【问题标题】:DateTimePicker's funny issuesDateTimePicker 有趣的问题
【发布时间】:2011-12-07 07:58:50
【问题描述】:

我对 DateTimePicker 有一些有趣的 (?!?) 问题,希望有人可以帮助我。我有一个带有 DateTimePicker 的表单,我想将它绑定到自定义类的属性。 DateTimePicker 的自定义格式设置为dd.MM.yyyy HH:mm:ss。以下是我尝试过的方法以及这些尝试带来的麻烦:

  • 我绑定了 DateTimePicker 的 Value 属性。我的自定义类的属性包含一个有效日期。当我运行该应用程序时,我得到一个 ArgumentOutOfRangeException,指出“01.01.0001 00:00:00”不是一个有效的值,它应该在 MinDate 和 MaxDate 之间。 (但我不能将 DateTime.MaxValue 和 DateTime.MinValue 都设置为 value 属性!
  • 我绑定了 DateTimePicker 的 Text 属性。一切运行良好,秒始终显示为“00”。我可以输入不同的值,它们会反映到我的自定义类的绑定属性中!

有什么想法吗?

编辑 这是设计器文件中的代码sn-p:

this.dateTimePickerTimestampFrom.CustomFormat = "dd.MM.yyyy HH:mm:ss";
this.dateTimePickerTimestampFrom.DataBindings.Add(new System.Windows.Forms.Binding("Value", this.bindingSourceSelectLogEntries, "DateFrom", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.dateTimePickerTimestampFrom.Enabled = false;
this.dateTimePickerTimestampFrom.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
this.dateTimePickerTimestampFrom.Location = new System.Drawing.Point(81, 42);
this.dateTimePickerTimestampFrom.Name = "dateTimePickerTimestampFrom";
this.dateTimePickerTimestampFrom.Size = new System.Drawing.Size(147, 20);
this.dateTimePickerTimestampFrom.TabIndex = 3;

编辑 2 bindingsource 是一个包含几个属性的自定义类。这些值在设置绑定时有效。我在下面的代码中设置它:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    // Exception is thrown at the following line.
    // controller is an instance of my custom class containing valid values.
    bindingSourceSelectLogEntries.DataSource = controller; 
}

【问题讨论】:

  • 相关(供参考):stackoverflow.com/questions/8359380/datetimepicker-and-seconds。你能粘贴一些代码吗?也许你犯了一个你没有看到的“愚蠢”错误。
  • @Otiel:我在设计器的属性表中做了所有的绑定和设置。我将发布相关行。
  • 您使用的是哪个 .net 和 Visual Studio 版本?
  • @dknaack:我使用 VisualStudio 2010 SP1,目标框架是“.NET Framework 4”。 (不是客户资料)
  • @Fischermaen 我试过你的代码,它对我来说很好。真奇怪。

标签: c# winforms datetimepicker


【解决方案1】:

我自己找到了解决方案,我想告诉大家,所以其他人可能不会像我一样在同一个问题上花费这么多时间。

我的设计由一个表单和一个控制器(包含要呈现的数据)组成。在表单中,我想在设计器中做所有事情以最小化背后的代码。所以我在表单上有一个绑定源,我的控制器实例作为数据源。 ReflectorPro 帮助我发现,涉及 CurrencyManager 是因为 BindingSource 被视为列表。因此,在从控制器获取值之前,所有绑定控件的所有值都设置为 null。 DateTimePicker 不喜欢 null 作为其 Value 属性的值并引发异常。

现在我在后面的代码中手动进行了绑定,一切正常。

【讨论】:

  • 很高兴你把它整理好了;)我也喜欢尽可能多地使用设计师,但有时它可能会很棘手。
【解决方案2】:

只是一个 FYI NULL 与代表 NULL 的值相比,这里不是问题。

许多人(包括我自己)大部分时间都错过的框架内的默认值不匹配。

直到最近,在某些情况下甚至现在,在 MSSQL 和大多数其他 DB 中,DateTime 字段中 NULL 值的默认表示是日期值 "1900-01-01"。 现在已改为"01/01/0001" 后来也是MS Visual Studio框架中DateTime.MinValue的值。

但是,datePicker 控件不将此值识别为有效日期,因为 VS 中的标准 DatePicker 控件具有 minDate = '01/01/1758'。 并且存在触发上述错误条件的问题。

您从数据库中获得了一个完全有效的 NULL 字段表示,它超出了 DatePicker 控件的可接受范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-27
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多