2010-08-26 40 views
5

Ai đó có thể giúp tôi phát hiện những thay đổi trong bất kỳ sự kiểm soát nào của biểu mẫu trong C#? Tôi có nhiều điều khiển trên một biểu mẫu và tôi cần phải vô hiệu hóa nút nếu giá trị điều khiển trong biểu mẫu thay đổi. Tôi đang tìm kiếm một số chức năng/sự kiện/bộ xử lý tích hợp sẵn và không muốn thực hiện một chức năng tùy chỉnh cho điều đó.Làm cách nào để phát hiện các thay đổi trong bất kỳ điều khiển nào của biểu mẫu trong C#?

Vui lòng hướng dẫn tôi.

+0

Sự hài lòng cho việc gắn nhãn sai - giống như cách bạn làm trong VB.NET hoặc trong khi ăn pizza. Bạn nói về điều khiển nào? WPF hoặc WinForms? – TomTom

+0

Ý tôi là, tôi cần phát hiện các thay đổi i các hộp văn bản/combobox/các giá trị hộp kiểm tra, nếu có bất kỳ thay đổi nào được phát hiện từ các giá trị biểu mẫu đã điền trước đó, chỉ vô hiệu hóa một nút. – Asad

+0

Ứng dụng này là một ứng dụng dạng cửa sổ được xây dựng bằng cách sử dụng VS C# .net – Asad

Trả lời

11

Không, tôi không biết bất kỳ sự kiện nào xảy ra bất cứ khi nào kiểm soát bất kỳ điều khiển nào về thay đổi biểu mẫu.

Lời khuyên của tôi là đăng ký từng sự kiện riêng lẻ (nếu biểu mẫu của bạn có quá nhiều điều khiển thực sự khó thực hiện thì bạn có thể muốn nghĩ lại UI của mình).

Nếu bạn hoàn toàn phải đăng ký thay đổi cho tất cả các điều khiển sau đó bạn có thể muốn xem xét một cái gì đó tương tự như sau:

foreach (Control c in this.Controls) 
{ 
    c.TextChanged += new EventHandler(c_ControlChanged); 
} 

void c_ControlChanged(object sender, EventArgs e) 
{ 

} 

Lưu ý rằng điều này sẽ không làm việc đặc biệt tốt tuy nhiên nếu bạn tự động thêm và loại bỏ các điều khiển vào biểu mẫu khi chạy.

Ngoài ra, sự kiện TextChanged có thể không phải là sự kiện phù hợp cho một số loại điều khiển (ví dụ: Hộp văn bản) - trong trường hợp này, bạn cần phải truyền và kiểm tra loại điều khiển để có thể đăng ký sự kiện chính xác, ví dụ: :

foreach (Control c in this.Controls) 
{ 
    if (c is CheckBox) 
    { 
     ((CheckBox)c).CheckedChanged += c_ControlChanged; 
    } 
    else 
    { 
     c.TextChanged += new EventHandler(c_ControlChanged); 
    } 
} 
+3

bạn cũng gặp phải sự cố mà phương pháp này không xử lý các điều khiển phụ, chẳng hạn như hộp văn bản trong bảng điều khiển/flowLayoutPanel/tableLayoutPanel, v.v. – Pondidum

4

Thay vì truy cập trực tiếp vào điều khiển, bạn có thể databind cho đối tượng mô hình thực hiện INotifyPropertyChanged.

Bất cứ khi nào người dùng thực hiện điều gì đó khiến dữ liệu trong mô hình thay đổi, bạn sẽ được thông báo và có thể thực hiện hành động thích hợp.

Nó cũng có thể sẽ cắt giảm số lượng mã bạn cần để nhận các giá trị trong và ngoài các điều khiển biểu mẫu.

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