源代码:private void dtpValidDate_ValueChanged(object sender, EventArgs e)
{
DateTime td = GetSerialNoDate(dtpValidDate.Value);
dtpValidDate.Value = td;
}private DateTime GetSerialNoDate(DateTime oriDateTime)
{
if (oriDateTime.Day < 10)
oriDateTime = new DateTime(oriDateTime.Year, oriDateTime.Month, 10);
else if (oriDateTime.Day < 20)
oriDateTime = new DateTime(oriDateTime.Year, oriDateTime.Month, 20);
else
{
oriDateTime = oriDateTime.AddMonths(1);
oriDateTime = new DateTime(oriDateTime.Year, oriDateTime.Month, 1).AddDays(-1);
}
return oriDateTime;
}

解决方案 »

  1.   

    这种问题我以前在treeview的afterchecked事件里遇见过,那里可以用e.action判断
    但是对datetimepicker,我也不知道。
      

  2.   

    赋值前取消注册ValueChanged事件,赋值后在注册事件
    //取消事件
    this.yourDateTimePicker.ValueChanged-=new EventHandler(yourDateTimePicker_ValueChanged);
    //赋值
    this.yourDateTimePicker.Value = this.dateTimePicker1.Value;
    //重新注册事件
    this.yourDateTimePicker.ValueChanged+=new EventHandler(yourDateTimePicker_ValueChanged);
      

  3.   

    很简单啊,在valuechange事件中做如下判断:
    DateTime dt=dtp.Value;
    然后对dt做必要的处理,直到dt是满足要求的值为止,最后使用下面的语句重新给dtp赋值:
    if(dtp.Value!=dt)
       dtp.Value=dt;
    注意到上面的判断语句了吗?这样就不会死循环了。这种方法在TextBox等控件的TextChange事件中同样有效。
      

  4.   

    建议 ClampHammer(达龙) 的那种方法
      

  5.   

    楼上的都可以解决问题,我个人还是喜欢ClampHammer(达龙)的方式。
      

  6.   

    就想要ClampHammer(达龙)的这种方法,即让事件暂停工作,处理完成后再重新有效谢谢