积极答复者
DateTimePicker.ValueChanged 事件求高人解答

问题
-
有两个DateTimePicker控件:dtp_start、dtp_end
event :
dtp_end_ValueChanged
{
if(dtp_end.Value.Date.CompareTo(dtp_start.Value.Date)==-1)
{
MessageBox.Show("结束时间应晚于或等于起始时间");
dtp_end.Value=dtp_start.Value.Date;
}
}
///////////
在修改了dtp_end 的时间后,上面的代码执行了3次。时间对比返回值第一次是-1,第二次是 0 ,第三次是-1。 想不明白为什么会执行了三次。dtp_end.Value=dtp_start.Value.Date; 执行后时间应该是改为了dtp_start的时间了,再次触发ValueChanged事件时,时间对比返回值应该是0。为什么是0了之后会执行了第三次。而第三次的dtp_end的时间却是修改之前的时间。
如果我描述的不清楚请大家试试如上的代码。
求高手解答疑惑。这个事件是如何被执行的。
答案
-
你好!
我做了个测试实际此方法只会进入两次,上面我说的那种方式也是可行的(也可以使用取消事件的方式),检查一下是否是由于其它代码所致。下面是我的测试代码
using System.Drawing; using System.Windows.Forms; using System; using System.Collections.Generic; namespace X.WinForms.UI { public partial class Form1 : Form { public Form1() { InitializeComponent(); InitDemo(); } DateTimePicker dateTimePicker1 = new DateTimePicker(); DateTimePicker dateTimePicker2 = new DateTimePicker(); void InitDemo() { this.dateTimePicker2.ValueChanged += new System.EventHandler(dateTimePicker2_ValueChanged); this.dateTimePicker1.Value = new DateTime(2000, 1, 2); this.dateTimePicker2.Value = new DateTime(2000, 1, 1); } bool changing = false; List<int> list = new List<int>(); void dateTimePicker2_ValueChanged(object sender, System.EventArgs e) { if (changing) return; var ret = dateTimePicker2.Value.Date.CompareTo(dateTimePicker1.Value.Date); list.Add(ret); // 记录比较结果 if (ret == -1) { MessageBox.Show("结束时间应晚于或等于起始时间"); changing = true; dateTimePicker2.Value = dateTimePicker1.Value.Date; changing = false; } } } }
知识改变命运,奋斗成就人生!- 已标记为答案 肖小勇Moderator 2011年3月7日 15:51
全部回复
-
你好!
执行了多次是因为你在事件内部再次修改了 dtp_end 控件的值。可以通过下在的方法解决
bool changing = false; void dtp_end_ValueChanged() { if (changing) return; // 判断事件内部正在修改控件值则退出 if (dtp_end.Value.Date.CompareTo(dtp_start.Value.Date) == -1) { MessageBox.Show("结束时间应晚于或等于起始时间"); changing = true; dtp_end.Value = dtp_start.Value.Date; changing = false; } } }
知识改变命运,奋斗成就人生! -
你好!
我做了个测试实际此方法只会进入两次,上面我说的那种方式也是可行的(也可以使用取消事件的方式),检查一下是否是由于其它代码所致。下面是我的测试代码
using System.Drawing; using System.Windows.Forms; using System; using System.Collections.Generic; namespace X.WinForms.UI { public partial class Form1 : Form { public Form1() { InitializeComponent(); InitDemo(); } DateTimePicker dateTimePicker1 = new DateTimePicker(); DateTimePicker dateTimePicker2 = new DateTimePicker(); void InitDemo() { this.dateTimePicker2.ValueChanged += new System.EventHandler(dateTimePicker2_ValueChanged); this.dateTimePicker1.Value = new DateTime(2000, 1, 2); this.dateTimePicker2.Value = new DateTime(2000, 1, 1); } bool changing = false; List<int> list = new List<int>(); void dateTimePicker2_ValueChanged(object sender, System.EventArgs e) { if (changing) return; var ret = dateTimePicker2.Value.Date.CompareTo(dateTimePicker1.Value.Date); list.Add(ret); // 记录比较结果 if (ret == -1) { MessageBox.Show("结束时间应晚于或等于起始时间"); changing = true; dateTimePicker2.Value = dateTimePicker1.Value.Date; changing = false; } } } }
知识改变命运,奋斗成就人生!- 已标记为答案 肖小勇Moderator 2011年3月7日 15:51