日期时间选择器不会更新!

15

我有一些在表单中的 DateTimePicker,但它们从未更新。
我已尝试使用 ValueTextInvalidate() 然后 Update(),还有 Refresh()...

无论我设定什么,都不能改变它们当前日期的值!
不管我设置什么,当前的日期都是今天的日期。

这是 .NET 3.5 的一个 bug 吗?
(不,我不能在这个项目中使用 .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


你是第一个报告这个 bug 的人。 - Saeed Amiri
你有为datetimepicker设置MinDate吗?你确定没有其他人覆盖了你的值吗?因为我认为可以很肯定地说,框架中没有bug;-) - Klaus Byskov Pedersen
你尝试过将值设置为 DateTime.Parse(user.BirthDay.ToString()) 吗? - Evan Mulawski
你能插入你的 BithDay 属性代码吗? - Saeed Amiri
1
它不起作用,否则我就不会发布这个问题了,对吧? - Vercas
显示剩余6条评论
3个回答

26

对于这个问题的一个小提示:我的问题在于我将DateTimePicker设置为checked=false,(出于错误)ShowCheckbox=false; 在这种情况下,我可以将DTPicker设为任何值,但它不会自动更新。


这就是问题所在,当你右键单击“重置”DateTimePicker的值时,它会将“Checked”更改为False! - WhoIsRich
这对我也起作用了,但是我有两个TabPage控件,其中包含的控件等完全相同,其中一个我从未遇到任何问题。在另一个TabPage上,(DateTimePicker)控件从未在UI上更新,但是将Checked设置为True可以解决此问题(同样,在另一个选项卡上,两种设置都有效)。 - Gorgsenegger
我刚刚注意到的另一件事是,DateTimePicker的Checked属性的注释说:“当ShowSelectBox为true时,确定是否选中复选框,表示用户已选择值。”。问题在于,在我的DateTimePicker控件上没有ShowSelectBox属性。查看MSDN上最近的版本(http://msdn.microsoft.com/en-us/library/system.windows.forms.datetimepicker.checked(v=vs.90).aspx),该描述已经更新,因此可能需要更新我们的帮助文件。 - Gorgsenegger
同样的问题在我刚尝试修复的一个vb.net项目中也出现了。真没想到吧?感谢您发布这个解决方法! - Jon
这个控件甚至在将DateTimePicker.Checked设置为false后(通过表单加载事件中的代码)清除了成功分配的值!因此,没有办法分配一个默认未启用(选中)的初始值.... -.- - Nicolas
如果您之前将DateTimePicker用作已选版本并改回普通选择器,请查看此答案。这就是我的情况。一位同事喜欢它不被选中,将ShowCheckbox更改为false,但从未设置checked=true(这是其默认值)。非常痛苦的调试过程。感谢您提供的修复! - Carson

1

如果表单未更新其可视外观,但您可以通过调试器看到属性已成功更新,则标准诊断方法是使用错误的表单实例。例如:

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

通过如下代码更改来诊断此问题:

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

有趣的答案,但恐怕情况并非如此。控件在“Form.Load”事件上更新,该事件在窗体和控件已经可见时触发。此外,设置“MinDate”或“MaxDate”似乎不起作用! - Vercas
当Load事件触发时,窗体尚未可见。如果是这样的话,那么肯定有什么严重问题。设置一个断点并查看调用堆栈。确保您不会看到构造函数。 - Hans Passant
不要使用MessageBox来调试。它会泵送消息循环,允许表单中的其他事件处理程序运行。请使用Console.WriteLine,在输出窗口查看。 - Hans Passant
你已经用尽了我们的智慧。请将你的项目精简到必要的部分,但仍然展示出这个问题,并上传至文件共享服务或粘贴板上。这样我们就可以在自己的机器上重现这个非常神秘的问题。 - Hans Passant
好的,当我将表单放到另一个项目中时,我注意到问题已经不存在了。(但在原始项目中仍然存在!) - Vercas

0

我解决更新顽固的DateTimePicker以显示其当前值并更新其相关数据绑定的方法是切换其.Enabled属性。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接