2013-03-20 31 views
5

Tôi đang gặp sự cố với nhà thiết kế VS2012. Tôi có một điều khiển người dùng mà tôi thiết kế và trong đó là một hộp văn bản (trong số những thứ khác), nơi người dùng có nghĩa là để nhập một IPv4, IPv6, hoặc DNS. Tôi cần phải xác nhận rằng văn bản là hợp lệ (TextChanged sự kiện) báo cáo trở lại chương trình chính. Xét đoạn mã sau:C# Được thiết kế không nhận ra sự kiện tùy chỉnh trong điều khiển người dùng tùy chỉnh

private bool addressError; 

public EventHandler ErrorChanged; 

public bool Error 
{ 
    get 
    { 
     return addressError; 
    } 
    set 
    { 
     if (this.Error != value) 
     { 
      addressError = value; 
      OnErrorChanged(this, EventArgs.Empty); 
     } 
    } 
} 

protected virtual void OnErrorChanged(object sender, EventArgs e) 
{ 
    if (ErrorChanged != null) 
    { 
     ErrorChanged(sender, e); 
    } 
} 

Sau đó tôi thêm các xử lý sự kiện để các nhà thiết kế chương trình chính (tên điều khiển là "Com"):

this.Com.ErrorChanged += new System.EventHandler(this.Com_ErrorChanged); 

Tôi có vấn đề là mặc dù các mã hoạt động chính xác như tôi muốn, nhà thiết kế nghĩ rằng không có sự kiện ErrorChanged. Thông báo chính xác báo cáo là

"Loại 'ModbusCom.Communications' không có sự kiện nào được đặt tên 'ErrorChanged'."

Tôi có thể bỏ qua lỗi và trình thiết kế hiển thị biểu mẫu ok. Tôi có thể chạy chương trình và mọi thứ đều ổn, nhưng hơi khó chịu khi phải nói với nó để bỏ qua vấn đề. Tôi có thể làm gì để giải quyết vấn đề này không? Trợ giúp được đánh giá cao!

+0

Bạn có thực sự cố gắng để giao tiếp qua Modbus? (Tôi chỉ đang băn khoăn) –

+0

Vâng, tôi. Modbus RTU qua TCP/IP –

Trả lời

7

Bạn không khai báo nó như là một sự kiện

Thay đổi:

public EventHandler ErrorChanged; 

thành:

public event EventHandler ErrorChanged; 
+2

Daniel là chính xác. Những gì bạn đang làm, bằng cách không sử dụng từ khóa sự kiện, đang tạo một thể hiện của đại biểu EventHandler là một trường công khai. Điều này sẽ làm việc, khá nhiều, cùng một cách trong mã C#, nhưng nó sẽ cho phép bạn ghi đè lên tất cả các trình xử lý sự kiện đang đăng ký với nó nếu bạn không sử dụng + = hoặc - = để đăng ký hoặc hủy đăng ký. Từ khóa sự kiện chỉ cho phép bạn thêm (+ =) hoặc xóa (- =) trên chính sự kiện. –

+1

ah facepalm. Cảm ơn bạn rất nhiều. –

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