【问题标题】:DateTimePicker never updates!DateTimePicker 永远不会更新!
【发布时间】:2019-04-13 05:39:02
【问题描述】:

我有一些DateTimePickers 的表单永远不会更新。
我试过ValueTextInvalidate() 然后Update()Refresh()...

与当前日期相比,它们的值似乎没有任何变化!
无论我设置什么,当前日期都是(相对)今天!

这是 .NET 3.5 的错误还是什么?
(不,我不能在这个项目上使用 .NET 4。)


如果你真的想要一些代码,那么这里是:dateTimePicker1.Value = user.BirthDay;。另外,如果我写MessageBox.Show(user.BirthDay.ToString());,我会得到一个漂亮的盒子,告诉用户的生日(我的生日,在我的机器上)。 (所以变量中有值...)


我还应该提一下它们仅用于日期而不是时间吗?


好的,我知道我需要写更多:

首先,更新控件的方法订阅Form.Load事件。因此,当表单和控件可见且“正在运行”时,它会被调用/触发/调用。

其次,看看这段代码及其结果:

MessageBox.Show(user.BirthDay.ToString()); // Shows 12.12.1995 (in my regional format)
dateTimePicker1.Value = user.BirthDay; // assigned to 12.12.1995
MessageBox.Show(dateTimePicker1.Value.ToString()); // Shows today's date!

这不好...输出是今天的日期。 (今天我的意思是代码运行的那一天。)

dateTimePicker1.MinDate = new DateTime(1900,1,1); // January 1st, 1900
MessageBox.Show(dateTimePicker1.MinDate.ToString()); // January 1st, 1753 ...

控制不好! 1900 不等于 1753!

dateTimePicker1.MaxDate = DateTime.Today;
// In reality, I need it to today's date
MessageBox.Show(dateTimePicker1.MinDate.ToString()); // December 31st, 9998

时间扭曲? O_O

反正整个代码是这样的:

public void Form_Load(object sender, EventArgs e)
{
    this.user = User.Load(path);
    // this.user is a field.
    // path is a static field which holds the absolute path of the file in which is serialized that data of the user.

    MessageBox.Show(user.BirthDay.ToString()); // Shows 12.12.1995 (in my regional format)
    dateTimePicker1.Value = user.BirthDay; // assigned to 12.12.1995
    MessageBox.Show(dateTimePicker1.Value.ToString()); // Shows today's date!

    dateTimePicker1.MinDate = new DateTime(1900,1,1); // January 1st, 1900
    MessageBox.Show(dateTimePicker1.MinDate.ToString()); // January 1st, 1753 ...

    dateTimePicker1.MaxDate = DateTime.Today;
    MessageBox.Show(dateTimePicker1.MinDate.ToString()); // December 31st, 9998
}

那么,有什么解决办法吗? xC

【问题讨论】:

  • 你是第一个报告这个错误的人
  • 您是否为日期时间选择器设置了MinDate?你确定没有人覆盖你的价值吗?因为我认为可以肯定地说框架中没有错误 ;-)
  • 您是否尝试将值设置为DateTime.Parse(user.BirthDay.ToString())
  • 您会插入您的BithDay 属性代码吗?
  • 它确实不起作用,否则我不会发布这个问题,对吧?

标签: c# winforms datetimepicker


【解决方案1】:

这个麻烦的一个小提示:我的问题是我将 DateTimePicker 设置为 checked=false 并且(错误地) ShowCheckbox=false; 通过这个设置,我可以将任何我想要的值设置为 DTPicker,但它不会自动更新。

【讨论】:

  • 这是问题所在,因为当您右键单击“重置”DateTimePicker 值时,它会将“已检查”更改为 False!
  • 这也为我完成了这项工作,但是,我有两个 TabPage 控件,其中包含的控件等具有完全相同的嵌套类型,其中一个我从来没有遇到任何问题。在另一个 TabPage 上,(DateTimePicker) 控件从未在 UI 上更新,但将该 DateTimePicker 的 Checked 设置为 True 解决了这个问题(同样,它同时使用这两种设置)。
  • 我刚刚注意到的另一件事 - DateTimePicker 的 Checked 属性的注释说“当 ShowSelectBox 为真时,确定复选框是否被选中,表明用户已选择一个值。”。问题是 - 我的 DateTimePicker 控件上没有 ShowSelectBox 属性。查看 MSDN 上的最新版本 (msdn.microsoft.com/en-us/library/…),说明已更新,因此可能需要更新我们的帮助文件。
  • 我试图修复的 vb.net 项目中的相同问题。是谁?感谢您发布修复程序!
  • 此控件甚至在之后将DateTimePicker.Checked 设置为false 时清除成功分配的值(通过表单加载事件中的代码)!因此,无法分配默认未启用(选中)的初始值.... -.-
【解决方案2】:

对于没有更新其视觉外观的表单的标准诊断,但是您使用调试器看到属性更新很好,这是使用了错误的表单实例。比如这样:

var frm = new Form1();  // Wrong!!
frm.UpdateBirthDay(user.BirthDay);

通过像这样更改您的代码来诊断:

dateTimePicker1.Value = user.BirthDay;
this.Show();   // <=== add this

【讨论】:

  • 有趣的答案,但恐怕事实并非如此。控件在Form.Load 事件上更新,该事件在窗体和控件已经可见时触发。另外设置MinDateMaxDate 似乎不起作用!
  • 当 Load 事件触发时,表单是可见的。如果是这样,那就真的有问题了。设置断点并查看调用堆栈。确保你没有看到构造函数。
  • 不要使用 MessageBox 来调试它。它泵送一个消息循环,允许其他事件处理程序是您的表单运行。使用 Console.WriteLine,查看输出窗口。
  • 你已经用尽了我们的水晶球。将您的项目的最小版本发布到文件共享服务或粘贴箱中,精简到基本但仍然存在此问题。所以我们可以在自己的机器上重现这个非常神秘的问题。
  • 好的,在将表单放入另一个项目时,我注意到问题不再存在。 (但它仍然在原始项目中!)
【解决方案3】:

我更新顽固的 DateTimePicker 以显示其当前值并更新其相关 DataBindings 的工作是切换其 .Enabled 属性。

myDateTimePicker.Enabled = !myDateTimePicker.Enabled;
myDateTimePicker.Enabled = !myDateTimePicker.Enabled;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    相关资源
    最近更新 更多