none
DateTimePicker.ValueChanged 事件求高人解答 RRS feed

  • 问题

  • 有两个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的时间却是修改之前的时间。

     

    如果我描述的不清楚请大家试试如上的代码。

     

    求高手解答疑惑。这个事件是如何被执行的。

    2011年3月2日 2:37

答案

  • 你好!

    我做了个测试实际此方法只会进入两次,上面我说的那种方式也是可行的(也可以使用取消事件的方式),检查一下是否是由于其它代码所致。下面是我的测试代码

    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;
          }
        }
      }
    }
    
    


    知识改变命运,奋斗成就人生!
    2011年3月2日 5:09
    版主

全部回复

  • 你好!

    执行了多次是因为你在事件内部再次修改了 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;
      }
    }
    }
    


    知识改变命运,奋斗成就人生!
    2011年3月2日 3:26
    版主
  • 肖小勇:

        您好!

        您说的方式并不能解决此问题,不过我将上面的代码放到了 CloseUp 事件中可以解决这样的问题。当然解决此问题的方式会有很多种, 但是就是很奇怪,即使我内部修改了DTP的Value,ValueChanged事件为何会被执行了三次。常理上判断应该是执行两次。就是对这点存在一些疑惑,希望与您一起讨论这个事件是如何被调用三次的。十分感谢您的回答。

    2011年3月2日 3:47
  • 你好!

    我做了个测试实际此方法只会进入两次,上面我说的那种方式也是可行的(也可以使用取消事件的方式),检查一下是否是由于其它代码所致。下面是我的测试代码

    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;
          }
        }
      }
    }
    
    


    知识改变命运,奋斗成就人生!
    2011年3月2日 5:09
    版主