2011-08-17 3 views
10

winforms .net의 datetimepicker 컨트롤에 확인란이 있습니다. 그러나 확인란을 선택하거나 선택 취소했을 때 트리거되는 이벤트를 찾을 수 없습니다. 출구가 있습니까?datetimepicker C# winform 체크/체크되지 않은 이벤트

+0

여기를 참고하십시오 http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/27dd3141-5dfb-439e-8e30-e051a019303a/ – V4Vendetta

답변

2

지저분 트리거 않는이 (가) "확인"그래서 만약 주어질거야 결정할 수, 이전이 "확인"새 비교하기 위해 값을 저장해야 상태가 변경되었습니다 :

bool oldDateChecked = false; //if it's created as not checked 

private void dtp_filtro_date_ValueChanged(object sender, EventArgs e) 
{ 
    if (this.dtp_filtro_date.Checked != oldDateChecked) 
    { 
     oldDateChecked = this.dtp_filtro_date.Checked; 
     //do your stuff ... 

    } 
} 
10

그것은 그러나 값 변경 이벤트

+2

코드에서 Checked 속성을 설정하지 않은 경우. –

2

동일한 문제로 실행됩니다. winForms DateTimePicker 컨트롤에서 CheckedChangedEvent가 필요했습니다. 그래서 저는 저의 답변 앞에서 영감을 얻어이 이벤트를 구현 한 DateTimePicker에서 상속받은 DateTimePicker2라는 상속 된 사용자 정의 컨트롤을 만들었습니다. 그것은 작동하지만 보증은없는 것 같습니다.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace MyNameSpace 
{ 
    public partial class DateTimePicker2 : DateTimePicker 
    { 
     private bool _checked; 

     public new bool Checked 
     { 
      get 
      { 
       return base.Checked; 
      } 
      set 
      { 
       if (value != base.Checked) 
       { 
        base.Checked = value; 
        _checked = base.Checked; 
        OnCheckedChanged(new CheckedChangedEventArgs { OldCheckedValue = !value, NewCheckedValue = value }); 
       } 
      } 
     } 

     public event CheckedChangedEventHandler CheckedChanged; 

     public DateTimePicker2() 
     { 
      InitializeComponent(); 
      _checked = Checked; 
     } 


     protected virtual void OnCheckedChanged(CheckedChangedEventArgs e) 
     { 
      if (CheckedChanged != null) CheckedChanged(this, e); 
     } 

     private void DateTimePicker2_ValueChanged(object sender, EventArgs e) 
     { 
      if (Checked != _checked) 
      { 
       _checked = Checked; 
       CheckedChangedEventArgs cce = new CheckedChangedEventArgs { OldCheckedValue = !_checked, NewCheckedValue = _checked }; 
       OnCheckedChanged(cce); 
      } 
     } 
    } 

    public delegate void CheckedChangedEventHandler(object sender, CheckedChangedEventArgs e); 

    public class CheckedChangedEventArgs : EventArgs 
    { 
     public bool OldCheckedValue { get; set; } 
     public bool NewCheckedValue { get; set; } 
    } 

} 

오프 물론

디자이너에서 DateTimePicker2_ValueChanged 이벤트에 가입하는 것을 잊지 마세요.

  1. base.Checked 속성이 없기 때문에 나는, 이전의 값의 트럭을 유지하는 _checked 필드합니다 (base.Checked 하나를 숨기기 위해) 새로운 Checked 속성을 모두 사용하는 이유는,이다 프로그래밍 방식으로 변경되면 ValueChanged 이벤트가 발생하므로이를 수행 할 수있는 새 속성이 필요합니다.
  2. this.Checked 새 속성은 UI에서 변경 될 때 ValueChanged 이벤트를 발생시키지 않으므로 base.Checked 속성을 추적하는 플래그가 필요합니다.

기본적으로 두 가지 방법의 조합이 필요했습니다.

이 정보가 도움이되기를 바랍니다.

+0

좋은 솔루션입니다. 패션 2017에 따라 만들려면 델리게이트 대신에'EventHandler '를 사용하십시오. 이벤트를 발생 시키려면'this.CheckedChanged? .Invoke (this, e)'를 사용하십시오. 또한 생성자에서'ValueChanged'를 구독하십시오 :'this.ValueChanged + = DateTimePicker_ValueChanged'. 이렇게하면 아무도이 수업을 제대로 지키지 못할 수 있습니다. 새로운 Checked가 프로그래밍 방식의 변경을 위해 호출되면 ValueChanged 이벤트는 연산자에 의한 변경 중에 발생합니다. –

0

나는 이것이 매우 오래된 것을 알고 있지만 이것은 누군가를 도울 수 있습니다.

당신은 DataTimePicker.MouseUp 이벤트

private void dateTimePicker1_MouseUp(object sender, MouseEventArgs e) 
    { 
     if (((DateTimePicker)sender).Checked) 
     { 
      //Do whatever you need to do when the check box gets clicked 
     } 
     else 
     { 
      //Do another stuff... 
     } 
    } 

또한 체크 박스를 활성화 할 수있는 스페이스 키 누름을 얻기 위해 KeyUp 이벤트와 동일한 작업을 수행해야합니다을 캡처 할 수 있습니다.