2012-07-12 19 views
5

Tôi đang làm việc với C# WinForm. Nó có hơn một chục hộp văn bản, hộp tổ hợp và hộp kiểm. Winform hiển thị thông tin được lấy từ cơ sở dữ liệu. Có một nút lưu trên biểu mẫu bị tắt. Tôi muốn có thể kích hoạt nó khi bất kỳ hộp văn bản/hộp tổ hợp/hộp kiểm nào được thay đổi.Có sự kiện kích hoạt bất cứ khi nào có thay đổi đối với hộp văn bản, hộp tổ hợp, v.v. bên trong biểu mẫu

Có cách nào dễ dàng để thực hiện việc này mà không thêm trình xử lý sự kiện riêng biệt cho từng mục này không?

+0

có thể trùng lặp của [Cách phát hiện thay đổi trong bất kỳ điều khiển nào của biểu mẫu trong C#?] (Http://stackoverflow.com/questions/3571722/how-to-detect-changes-in-any-control -of-the-form-in-c) –

+0

Nó không thực sự có ý nghĩa để lập trình theo cách đó. Nếu người dùng kiểm tra thứ gì đó thì bỏ chọn lại lần nữa, bạn có định tắt nút này một lần nữa không? Sau khi tất cả, không có gì thay đổi. – LarsTech

Trả lời

5

Đây là đủ để giúp bạn nhìn chằm chằm. Bạn có thể cần phải thêm thêm foreach vòng cho các loại khác control nếu cần. Điều tuyệt vời là bạn chỉ cần một vài dòng mã trên mỗi loại Control, không phải mỗi trường hợp, với cách tiếp cận này.

private void addHandlers() 
{ 
    foreach (TextBox control in Controls.OfType<TextBox>()) 
    { 
     control.TextChanged += new EventHandler(OnContentChanged); 
    } 
    foreach (ComboBox control in Controls.OfType<ComboBox>()) 
    { 
     control.SelectedIndexChanged += new EventHandler(OnContentChanged); 
    } 
    foreach (CheckBox control in Controls.OfType<CheckBox>()) 
    { 
     control.CheckedChanged += new EventHandler(OnContentChanged); 
    } 
} 

protected void OnContentChanged(object sender, EventArgs e) 
{ 
    if (ContentChanged != null) 
     ContentChanged(this, new EventArgs()); 
} 

public event EventHandler ContentChanged; 

Sau khi sửa đổi phương pháp addHandlers để hỗ trợ tất cả các điều khiển của bạn, và gọi đó là sau khi thêm tất cả các nút điều khiển để hình của bạn, bạn chỉ có thể đăng ký vào các sự kiện ContentChanged để làm bất cứ điều gì có thể cần phải xảy ra bất cứ lúc nào một cái gì đó trên biểu mẫu đã thay đổi (tức là bật/tắt nút lưu).

+0

+1 để có câu trả lời hay nhất từ ​​trước tới nay –

0

Bạn có thể viết trình xử lý sự kiện có mục đích chung để xử lý sự kiện cho tất cả chúng, nhưng than ôi, không, không có cách nào để tự động tạo trình xử lý sự kiện trong Visual Studio (cũng không nên có).

0

Bạn có thể có tất cả các sự kiện được kết nối với một trình xử lý, chỉ cần yêu cầu tất cả chúng gọi cùng chức năng, ở đó bạn có cờ bool mbSomethingChanged = true và bật nút lưu. Kiểm tra cờ trên biểu mẫu đóng, nếu bạn muốn cảnh báo người dùng lưu.

2

Bạn phải trải qua các điều khiển và đính kèm sự kiện thay đổi vào mọi điều khiển. Điều này article thảo luận về tình huống tương tự.

private void AssignHandlersForControlCollection(
     Control.ControlCollection coll) 
    { 
     foreach (Control c in coll) 
     { 
      if (c is TextBox) 
       (c as TextBox).TextChanged 
       += new EventHandler(SimpleDirtyTracker_TextChanged); 

      if (c is CheckBox) 
       (c as CheckBox).CheckedChanged 
       += new EventHandler(SimpleDirtyTracker_CheckedChanged); 

      // ... apply for other desired input types similarly ... 

      // recurively apply to inner collections 
      if (c.HasChildren) 
       AssignHandlersForControlCollection(c.Controls); 
     } 
    } 
Các vấn đề liên quan