c# - 当未选中 DateTimePicker 时(在开始时间),DateTime 值未分配给 DateTimePicker

标签 c# winforms datetimepicker

在 WinForms 应用程序中,我有一个 DateTimePicker

来自...Designer.cs的属性

        this.dateTimePicker.AllowDrop = true;
        this.dateTimePicker.CustomFormat = "HH:mm:ss";
        this.dateTimePicker.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
        this.dateTimePicker.Location = new System.Drawing.Point(251, 12);
        this.dateTimePicker.Name = "DateTimePicker";
        this.dateTimePicker.ShowCheckBox = true;
        this.dateTimePicker.ShowUpDown = true;
        this.dateTimePicker.Size = new System.Drawing.Size(200, 28);
        this.dateTimePicker.TabIndex = 1;

每当它的值发生变化时,我都会将需要的内容保存到应用程序设置中(我对许多其他“字段”做了类似的事情,这是我遇到问题的第一个:

... this.Settings = [MyApplication].Properties.Settigns.Default.

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
    this.Settings.dateTimePicker_Time = this.dateTimePicker.Value;
    this.Settings.dateTimePicker_Checked = this.dateTimePicker.Checked;
    this.Settings.Save();
}

当应用程序启动时,实际上,在主窗体的构造函数中,我按如下方式恢复保存的值(请注意,ValueChange 事件仅在分配初始值后才绑定(bind)到控件):

        this.dateTimePicker_Time.Checked = this.Settings.dateTimePicker_Checked;
        if (this.Settings.dateTimePicker_Time != null)
        {
            this.dateTimePicker.Value = this.Settings.dateTimePicker_Time;
        }

        this.dateTimePicker.ValueChanged += new System.EventHandler(this.dateTimePicker_ValueChanged);

问题 如果选中 DateTimePicker,则会按预期分配 DateTime 值。 但是,如果未选中 DateTimePicker,则不会分配 DateTime 值,似乎会分配 DateTime.Now

因此,我也尝试了以下代码,但结果是一样的:

        this.dateTimePicker_Time.Checked = this.Settings.dateTimePicker_Checked;
        if (this.Settings.dateTimePicker_Time != null)
        {
            bool dateTimePicker_Checked = this.dateTimePicker.Checked;
            this.dateTimePicker.Checked = true;
            this.dateTimePicker.Value = this.Settings.dateTimePicker_Time;
            this.dateTimePicker.Checked = dateTimePicker_Checked ;
        }

        this.dateTimePicker.ValueChanged += new System.EventHandler(this.dateTimePicker_ValueChanged);

编辑 我尝试将 DateTimePicker 属性数据绑定(bind)到应用程序设置,但结果与上面“手动”执行操作相同。

最佳答案

当您在构造函数中时,控件的某些设置尚未准备好。您找到了其中一项设置。

尝试将恢复代码移至表单的 OnLoad 覆盖。请注意,更改 DateTimePicker 的 Value 属性会将 Checked 属性设置为 true,因此您需要在设置 Value 属性后设置 Checked 属性:

protected override void OnLoad(EventArgs e) {
  base.OnLoad(e);
  if (this.Settings.dateTimePicker_Time != null) {
    this.dateTimePicker2.Value = this.Settings.dateTimePicker_Time;
  }
  this.dateTimePicker2.Checked = this.Settings.dateTimePicker_Checked;
}

此外,在 OnFormClosing 覆盖中保存一次设置会更有意义:

protected override void OnFormClosing(FormClosingEventArgs e) {
  this.Settings.dateTimePicker_Time = dateTimePicker2.Value;
  this.Settings.dateTimePicker_Checked = dateTimePicker2.Checked;
  this.Settings.Save();
  base.OnFormClosing(e);
}

关于c# - 当未选中 DateTimePicker 时(在开始时间),DateTime 值未分配给 DateTimePicker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46474901/

相关文章:

c# - 确定哪个任务已完成

c# - Azure 上的 Asp .NET Core 遇到 502 Web 服务器在充当网关或代理服务器时收到无效响应

c# - .dtbcache 文件有什么作用?

c# - 检查 DateTimePicker 日历是否下拉

c# - 最佳实践 - 创建包含大量实体的单元测试时该怎么做

c# - 这是依赖注入(inject)的正确使用吗?

winforms - 如何创建一个像 VS 2010 一样形状奇特的高质量闪屏?

c# - 关闭程序后保留剪贴板信息

twitter-bootstrap - Bootstrap datetimepicker 禁用过去日期和当前日期?

angular - 在 angular2-material-datepicker 中设置区域设置