2011-06-23 44 views
10

Tôi đã tìm kiếm câu trả lời trong khoảng một giờ trên Google nhưng tôi không tìm thấy chính xác những gì tôi đang tìm kiếm.EventHandler với các đối số tùy chỉnh

Về cơ bản, tôi có một lớp Trợ giúp tĩnh giúp thực hiện nhiều việc tôi thường xuyên làm trong Ứng dụng của mình. Trong trường hợp này, tôi có một phương thức có tên là "CreateDataContextMenu" tạo ra một menu ngữ cảnh trên một điều khiển TreeView đã cho.

public static void CreateDataContextMenu(Form parent, TreeView owner, string dataType) 
{ ... } 

Chủ sở hữu TreeView là điều khiển trong đó tôi sẽ kết hợp menu ngữ cảnh của mình.

Rồi sau này tôi thêm một sự kiện Click vào một MenuItem như thế này:

menuItemFolder.Click += new System.EventHandler(menuItemFolder_Click); 

Tôi có vấn đề ở đây là tôi muốn vượt qua "chủ sở hữu" và "datatype" như các đối số sự kiện menuItemFolder_Click.

tôi thử như sau:

menuItemFolder.Click += new System.EventHandler(menuItemFolder_Click(sender,e,owner,dataType)); 
(...) 
private static void menuItemFolder_Click(object sender, System.EventArgs e, Treeview owner, string dataType) 
{...} 

Nhưng nó không hoạt động gì cả. Nó có thể rất ngây thơ của tôi để làm điều đó theo cách đó nhưng tôi "không phải là rất thoải mái với xử lý sự kiện được nêu ra.

Bất kỳ ý tưởng về cách tôi có thể làm điều đó? Đoán đầu tiên của tôi là tôi cần phải tạo EventHandler của riêng tôi đối với trường hợp cụ thể này tôi sẽ đi đúng hướng với điều đó

+0

Không chủ sở hữu ở đây chứa một tham chiếu đến TreeView? Hoặc nó sẽ dừng lại ở menu ngữ cảnh? – MPelletier

Trả lời

37

Bạn nên tạo một lambda expression mà các cuộc gọi một phương thức với các thông số bổ sung:.?

menuItemFolder.Click += (sender, e) => YourMethod(owner, dataType); 
+2

Phương pháp này hoạt động như một nét duyên dáng, nó ngắn và rất hiệu quả. Tôi càng hỏi, tôi càng học nhiều hơn :) Cảm ơn bạn rất nhiều SLaks! – Sasha

+0

Phương pháp rõ ràng hơn. Đối với những người không quen với các biểu thức lambda, giống như tôi, có lẽ sẽ là một ý tưởng tốt để cho thấy rằng 'người gửi' và 'e' có thể được chuyển cho YourMethod. –

+0

Làm cách nào để hủy đăng ký cùng một sự kiện? –

0

Honest nhập học lên phía trước: tôi đã không cố gắng mã dưới đây.

Tôi nghĩ lý do

menuItemFolder.Click += new System.EventHandler(menuItemFolder_Click(sender,e,owner,dataType)); 

sẽ không làm việc là vì bạn đang thực sự đi qua để System.EventHandler() là kết quả của những lời khẩn cầu menuItemFolder_Click() với các thông số được cung cấp. Bạn không truyền con trỏ tới chính hàm đó.

Cố gắng viết một hàm khác thực hiện chi tiết của menuItemFolder_Click(). Xem có điều gì đó giống như

private void menuItemFolder_Click_Helper (object sender, EventArgs e, object Owner, object DataType) { 
// implement details here 
} 

và sau đó gọi hàm từ bên trong menuItemFolder_Click().

0

Tôi nghĩ rằng mã đơn giản nhất sẽ là:

EventHandler myEvent = (sender, e) => MyMethod(myParameter);//my delegate 

    myButton.Click += myEvent;//suscribe 

    private void MyMethod(MyParameterType myParameter) 
    { 
    //Do something 

    //if only one time 
    myButton.Click -= myEvent;//unsuscribe 
    } 
Các vấn đề liên quan