【问题标题】:DateTime value not assigned to DateTimePicker when DateTimePicker is not checked (at start time)未选中 DateTimePicker 时(在开始时)未将 DateTime 值分配给 DateTimePicker
【发布时间】:2017-09-29 05:39:54
【问题描述】:

在 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事件仅在分配初始值后才绑定到控件):

        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 属性数据绑定到应用程序设置,但结果与上面“手动”执行的操作相同。

【问题讨论】:

    标签: c# winforms datetimepicker


    【解决方案1】:

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

    尝试将您的恢复代码移至表单的 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);
    }
    

    【讨论】:

    • 你这个周末我会尝试测试一下。虽然我已经尝试将代码放在绑定到 Load 事件的 Form_Load 方法中,但我希望 OnLoad 会给出相同的结果。
    • @TTT 我重复了你的问题。请记住,您发布的代码永远不会保存 Checked = false,因为取消选中该框不会触发 ValueChanged 事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多