2013-03-21 34 views
14

Tôi có một biểu mẫu nhỏ với một số hộp kiểm trên đó và có một trình xử lý tin nhắn cho từng hộp kiểm cho sự kiện CheckChanged. Vì một số hộp kiểm phụ thuộc vào người khác, nếu trạng thái đã chọn của một hộp kiểm thay đổi, nó sẽ thay đổi trạng thái đã chọn của bất kỳ hộp kiểm phụ thuộc nào. Tôi thấy rằng điều này làm cho các sự kiện được nâng lên trên các hộp kiểm khác, nhưng vấn đề của tôi là mỗi sự kiện có một cuộc gọi hàm chỉ nên được gọi nếu sự kiện đến từ người dùng thực sự nhấp vào hộp kiểm. Tôi muốn biết cách nói (có thể là từ người gửi hoặc EventArgs) nếu sự kiện CheckChanged gây ra bởi một cú click chuột hay không.Làm cách nào để biết sự kiện đến từ đầu vào của người dùng trong C#?

Cliffs:

  • Nhiều hộp kiểm nhận CheckChanged kiện
  • Cần phải xác định xem sự kiện được nuôi dưỡng bởi một click chuột hay không
+0

gì về khi họ sử dụng các phím tab và không gian để di chuyển và chọn? Tôi sẽ sắp xếp logic của bạn trước khi mạo hiểm vào các phương thức nhập. –

+5

Tôi có thể ngắt kết nối các trình xử lý sự kiện để thay đổi, sau đó kết nối lại chúng. – spender

+0

Bạn có thể cho chúng tôi biết tại sao bạn muốn biết liệu đó có phải là con chuột mà họ đã chọn để sử dụng không? Nó có thể giúp chúng ta. Trong hầu như tất cả các trường hợp tôi có thể nghĩ đến, nó sẽ không tạo ra bất kỳ sự khác biệt nào ... – Penfold

Trả lời

5

Bạn có thể sử dụng một lá cờ để cho biết hay không để bỏ qua các sự kiện. Nó có thể dễ dàng hơn việc hủy đăng ký từ các trình xử lý sự kiện. Nó không phải là rất phức tạp nhưng nó nên làm công việc.

Tôi đặt cùng một ví dụ nhanh:

bool ignoreEvents = false; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void checkBox1_CheckedChanged(object sender, EventArgs e) 
     { 
      ignoreEvents = true; 
      checkBox2.Checked = checkBox1.Checked ; 
      checkBox3.Checked = checkBox1.Checked; 
      ignoreEvents = false; 
     } 

     private void checkBox2_CheckedChanged(object sender, EventArgs e) 
     { 
      if (ignoreEvents) return; 
      MessageBox.Show("Changed in 2"); 
     } 

     private void checkBox3_CheckedChanged(object sender, EventArgs e) 
     { 
      if (ignoreEvents) return; 
      MessageBox.Show("Changed in 3"); 
     } 
+0

Điều này đã làm các trick, và nó đã được khá đơn giản để thực hiện, cảm ơn! EDIT: Tôi hơi thất vọng mặc dù không có câu trả lời nào có thể trêu chọc thông tin từ các đối số đến trình xử lý sự kiện – riqitang

0

Đối với sự ổn định code hơn bạn cũng có thể sử dụng TriggerLock lớp thay vì ignoreEvents cờ.

private void checkBox1_CheckedChanged(object sender, EventArgs e) 
    { 
     using (new TriggerLock()) 
     { 
      checkBox2.Checked = checkBox1.Checked; 
      checkBox3.Checked = checkBox1.Checked; 
     } 
    } 

    private void checkBox2_CheckedChanged(object sender, EventArgs e) 
    { 
     if (TriggerLock.IsOpened) 
     { 
      MessageBox.Show("Changed in 2"); 
     } 
    } 

    private void checkBox3_CheckedChanged(object sender, EventArgs e) 
    { 
     if (TriggerLock.IsOpened) 
     { 
      MessageBox.Show("Changed in 3"); 
     } 
    } 

Lớp TriggerLock, nó hoạt động như một semaphore:

public class TriggerLock 
    : IDisposable 
{ 
    private static int _nUsing = 0; 
    private bool _bDisposed; 

    public TriggerLock() 
    { 
     _bDisposed = false; 
     Interlocked.Increment(ref _nUsing); 
    } 
    ~TriggerLock() 
    { 
     Dispose(false); 
    } 

    public static bool IsOpened 
    { 
     get { return _nUsing == 0; } 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
    } 
    private void Dispose(bool bDisposing) 
    { 
     if (bDisposing && !_bDisposed) 
     { 
      Interlocked.Decrement(ref _nUsing); 
      _bDisposed = true; 
     } 
    } 
} 
+0

thú vị, nhưng làm thế nào để lớp của bạn phân biệt các sự kiện được tương tác trực tiếp với người dùng (ví dụ: người dùng nhấp vào hộp kiểm) và sự kiện tăng theo logic có hiệu lực phụ (ví dụ: người dùng nhấp vào hộp kiểm, điều này khiến các hộp kiểm khác thay đổi trạng thái)? – riqitang

+0

Lớp học không phân biệt rõ ràng giữa tương tác của người dùng và tác dụng phụ. Nó chỉ là một phiên bản cải tiến (ngoại lệ) của ý tưởng từ Alex. – Georg

+0

Tôi nghĩ biến tĩnh '_nUsing' là một ý tưởng tồi. Điều gì sẽ xảy ra nếu lớp này được sử dụng trong hai phần không liên quan của cùng một dự án? Điều này sẽ gây ra sự kết thúc của sự nhầm lẫn. Nó sẽ là tốt hơn để sử dụng một trường thể hiện và làm cho người dùng giữ và đối tượng của lớp này trong một trường. – Lii

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