2010-10-22 32 views
7

Một người nào đó đã cho tôi mã này hoạt động tốt. Nhưng tôi thực sự muốn hiểu những gì đang xảy ra bên trong nó. Ai đó có thể giải thích được không? Ý nghĩa của từng phần của mã là gì? Mã nằm bên trong một điều khiển tùy chỉnh có hai nhãn bên trong một bảng điều khiển.Giải thích mã cho sự kiện tùy chỉnh trong điều khiển người dùng

Ngoài ra, tôi đã thấy một số sự kiện kiểm soát tùy chỉnh sử dụng cú pháp thêm/xóa, điều đó là gì? Sự khác biệt với những gì đang xảy ra ở đây?

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    public event EventHandler MyCustomClickEvent; 

    protected virtual void OnMyCustomClickEvent(EventArgs e) 
    { 
     // Here, you use the "this" so it's your own control. You can also 
     // customize the EventArgs to pass something you'd like. 

     if (MyCustomClickEvent != null) 
      MyCustomClickEvent(this, e); 
    } 

    private void label1_Click(object sender, EventArgs e) 
    { 
     OnMyCustomClickEvent(EventArgs.Empty); 
    } 
} 

Trả lời

8

Xem nhận xét của tôi bên dưới. Ngoài ra, để có một sự kiện chi tiết hơn, tôi blogged về khái niệm này một thời gian trở lại, nơi tôi đi vào chi tiết hơn về toàn bộ quá trình.

public partial class UserControl1 : UserControl 
{ 
    //This is the standard constructor of a user control 
    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    //This defines an event called "MyCustomClickEvent", which is a generic 
    //event handler. (EventHander is a delegate definition that defines the contract 
    //of what information will be shared by the event. In this case a single parameter 
    //of an EventArgs object. 
    public event EventHandler MyCustomClickEvent; 


    //This method is used to raise the event, when the event should be raised, 
    //this method will check to see if there are any subscribers, if there are, 
    //it raises the event 
    protected virtual void OnMyCustomClickEvent(EventArgs e) 
    { 
     // Here, you use the "this" so it's your own control. You can also 
     // customize the EventArgs to pass something you'd like. 

     if (MyCustomClickEvent != null) 
      MyCustomClickEvent(this, e); 
    } 

    private void label1_Click(object sender, EventArgs e) 
    { 
     OnMyCustomClickEvent(EventArgs.Empty); 
    } 
} 
2

Tôi khuyên bạn nên đọc lên trên Events for C# on MSDN. Điều này được đề cập chi tiết.

Về cơ bản, MyCustomClickEvent là sự kiện. Phương thức OnMyCustomClickEvent được sử dụng để nâng cao sự kiện, nhưng đang được thực hiện theo cách mà các lớp con cũng có thể nâng cao sự kiện này nếu được yêu cầu.

Khi bạn nhấp vào "label1", phương pháp OnMyCustomClickEvent sẽ chạy, điều này sẽ làm tăng sự kiện. Bất kỳ đại biểu nào được đăng ký tham gia sự kiện sẽ thực hiện tại thời điểm đó.

0

Về việc thêm/xóa, đây là triển khai sự kiện "thủ công". Hai đoạn mã sau làm tương tự.

tự động thực hiện:

public event EventHandler MyEvent; 

thực hiện bằng tay:

private EventHandler _myEvent; 

public event EventHandler MyEvent 
{ 
    add { _myEvent += value; } 
    remove { _myEvent -= value; } 
} 

Đây chính là ý tưởng cùng các thuộc tính như tự động nơi:

public string Property { get; set; }; 

Liệu chính xác giống như:

private string _property; 

public string Property 
{ 
    get { return _property; } 
    set { _property = value; } 
} 

Sự khác biệt giữa các đoạn mã này là với việc triển khai thủ công, bạn sẽ có nhiều quyền kiểm soát hơn. Ví dụ:

  • Thực hiện logic trong việc thêm/nhận và xóa/đặt;
  • Truy cập vào các trường cho phép bạn đặt, ví dụ: [NonSerializable];
  • Đặt các giá trị trong ví dụ: a Dictionary.

Lớp Form ví dụ: làm cái sau để giữ số trường trong lớp Biểu mẫu xuống.

+0

Cảm ơn Pieter! nó thực sự là mã bạn đã cho tôi, chỉ cần cố gắng để hiểu rõ hơn – VerizonW

+0

Tại sao phương pháp được bảo vệ ảo? – VerizonW

+0

Vâng, đó là phần lớn do quy ước, cũng như cách các tham số của phương thức được xác định. Bạn sẽ (hầu như) luôn thấy các phương thức này được định nghĩa là ảo được bảo vệ bởi vì điều này mang lại một lớp kế thừa tùy chọn ghi đè phương thức thay vì phải đăng ký sự kiện. Khi tạo một lớp con, nó được ưu tiên để ghi đè phương thức thay vì thêm các sự kiện trong hàm tạo. –

1

Bạn đã đề cập thấy cú pháp thêm/xóa cho các sự kiện trong một số ví dụ kiểm soát tùy chỉnh. Nhiều khả năng những ví dụ là using the UserControl class' Events property để lưu trữ xử lý sự kiện, chẳng hạn như trong ví dụ sau:

public event EventHandler MyEvent 
    { 
     add 
     { 
      Events.AddHandler("MyEvent", value); 
     } 
     remove 
     { 
      Events.RemoveHandler("MyEvent", value); 
     } 
    } 

Ý tưởng đó là thường là một người tiêu dùng của một điều khiển sẽ không muốn để xử lý tất cả các sự kiện duy nhất là phơi bày sự kiểm soát .Nếu mỗi sự kiện được định nghĩa là sự kiện "trường" (như trong ví dụ của bạn), thì mỗi sự kiện sẽ chiếm một phần bộ nhớ ngay cả khi không có người đăng ký cho sự kiện đó. Khi bạn có một trang phức tạp được xây dựng bởi hàng trăm điều khiển, mỗi điều có thể có hàng chục sự kiện, mức tiêu thụ bộ nhớ cho các sự kiện không được sử dụng không đáng kể.

Đây là lý do tại sao lớp System.ComponentModel.Component (lớp cơ sở của lớp System.Windows.Forms.Control) có thuộc tính Events, về cơ bản là từ điển để lưu trữ đại biểu xử lý sự kiện. Bằng cách này, mỗi sự kiện được triển khai giống một thuộc tính hơn là một trường. Trình xử lý thêm/xóa cho từng cửa hàng sự kiện hoặc xóa đại biểu khỏi từ điển Events. Nếu một sự kiện không được sử dụng, thì đó không phải là một mục nhập trong từ điển Events cho nó, và không có bộ nhớ bổ sung nào được tiêu thụ cho sự kiện đó. Đó là một sự cân bằng giữa việc làm nhiều hơn một chút (phải tìm trình xử lý sự kiện) để tiết kiệm bộ nhớ nhiều hơn một chút.

EDIT: cố định câu trả lời của tôi liên quan đến Windows Forms, thay vì ASP.NET, mặc dù các khái niệm đều giống nhau.

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