2011-08-17 54 views

Trả lời

2

vì bạn sẽ phải lưu trữ cũ "đã kiểm tra" giá trị để so sánh với cái mới, vì vậy vì bạn sẽ có thể xác định nếu "kiểm tra" tiểu bang đã thay đổi:

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

Bên cạnh đó là kích hoạt các sự kiện giá trị thay đổi

+2

Trừ khi thuộc tính Đã kiểm tra được đặt trong mã. –

2

Chạy cùng một vấn đề. Tôi cần một CheckedChangedEvent trên một điều khiển DateTimePicker winforms. Vì vậy, với nguồn cảm hứng của các câu trả lời trước tôi, tôi tạo ra một điều khiển người dùng kế thừa có tên DateTimePicker2, kế thừa từ DateTimePicker thực hiện sự kiện này. Có vẻ như nó hoạt động nhưng không có bảo đảm.

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

} 

Và tắt khóa học đừng quên đăng ký sự kiện DateTimePicker2_ValueThay đổi từ nhà thiết kế.

Lý do tại sao tôi sử dụng cả hai thuộc tính Checked mới (để ẩn base.Checked một) và một lĩnh vực _checked để giữ xe tải giá trị cũ, là bởi vì

  1. tài sản base.Checked không kích hoạt sự kiện ValueChanged khi thay đổi theo chương trình và do đó cần một thuộc tính mới có thể thực hiện điều đó.
  2. thuộc tính này.Đánh giá mới không kích hoạt sự kiện ValueChanged khi được thay đổi từ giao diện người dùng và do đó cần một cờ sẽ theo dõi thuộc tính base.Checked.

Về cơ bản, kết hợp cả hai phương pháp đều là cần thiết.

Tôi hy vọng điều này sẽ hữu ích.

+0

Giải pháp tốt và đơn giản. Để làm cho nó theo thời trang năm 2017, sử dụng 'event EventHandler ' thay vì ủy nhiệm. Để nâng cao sự kiện sử dụng 'this.CheckedChanged? .Invoke (this, e)' Hơn nữa, hãy đăng ký 'ValueChanged' trong hàm tạo:' this.ValueChanged + = DateTimePicker_ValueChanged'. Bằng cách này bạn chắc chắn rằng không ai có thể ngăn chặn lớp này hoạt động đúng cách. Checked mới được gọi cho các thay đổi có lập trình, sự kiện ValueChanged được nâng lên trong các thay đổi được thực hiện bởi toán tử. –

0

Tôi biết điều này là siêu cũ nhưng điều này có thể giúp một ai đó.

Bạn có thể chụp DataTimePicker.MouseUp kiện

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

Bạn sẽ cần phải làm tương tự với KeyUp kiện để có được không gian nhấn phím mà cũng có thể kích hoạt hộp kiểm.

Các vấn đề liên quan