2010-04-01 26 views
24

Tôi muốn tạo một phương thức lấy một sự kiện làm đối số và thêm eventHandler vào nó để xử lý đúng. Như thế này:Làm thế nào để chuyển một sự kiện đến một phương thức?

Tôi có hai sự kiện:

public event EventHandler Click; 
public event EventHandler Click2; 

Bây giờ tôi muốn vượt qua một sự kiện đặc biệt đến phương pháp của tôi như thế này (giả):

public AttachToHandleEvent(EventHandler MyEvent) 
{ 
    MyEvent += Item_Click; 
} 

private void Item_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show("lalala"); 
} 

ToolStripMenuItem tool = new ToolStripMenuItem(); 
AttachToHandleEvent(tool.Click); 

Có thể?

Tôi đã nhận thấy rằng mã này hoạt động tốt và quay lại dự án của tôi và nhận thấy rằng khi tôi vượt qua một sự kiện được khai báo trong lớp, nó hoạt động, nhưng khi tôi chuyển sự kiện từ lớp khác, nó vẫn không hoạt động.

Những gì tôi nhận được là lỗi này:

The event 'System.Windows.Forms.ToolStripItem.Click' can only appear on the left hand side of += or -=

+0

@OJ Vâng, bạn rất thông minh! –

+0

@Petar Minchev Tôi không biết tại sao ... Bạn là người đầu tiên và giúp tôi. Cảm ơn bạn. –

+0

Tôi đã cập nhật câu hỏi để phản ánh vấn đề tôi đang giao dịch với –

Trả lời

23

Câu trả lời ban đầu của tôi phù hợp với lớp đã xác định sự kiện, nhưng bạn đã cập nhật câu hỏi của mình để phản ánh rằng bạn muốn thực hiện điều này từ bên ngoài lớp xác định, vì vậy tôi đã làm điều đó.

Chỉ lớp xác định sự kiện mới có thể tham chiếu đến biến đại biểu ngầm mà sự kiện sử dụng. Từ bên ngoài lớp học đó, bạn chỉ có quyền truy cập vào các phương thức addremove, qua +=-=. Điều này có nghĩa là bạn không thể làm những gì bạn đang yêu cầu, trực tiếp. Tuy nhiên, bạn có thể sử dụng một cách tiếp cận chức năng.

class A{ 
    public event EventHandler Event1; 

    public void TriggerEvent1(){ 
     if(Event1 != null) 
      Event1(this, EventArgs.Empty); 
    } 
} 

class B{ 
    static void HandleEvent(object o, EventArgs e){ 
     Console.WriteLine("Woo-hoo!"); 
    } 

    static void AttachToEvent(Action<EventHandler> attach){ 
     attach(HandleEvent); 
    } 

    static void Main(){ 
     A a = new A(); 
     AttachToEvent(handler=>a.Event1 += handler); 
     a.TriggerEvent1(); 
    } 
} 
+0

Tôi đã kiểm tra phiên bản cập nhật sự cố của mình và tiếc là nó không hoạt động, bạn có thể giúp tôi không? –

+0

Tôi đã thử phương pháp này và nó đang hoạt động. – hakan

2

Chỉ cần viết tool.Click += Item_Click;

Edit: Từ MSDN "Sự kiện chỉ có thể được gọi từ bên trong lớp học hoặc struct nơi họ (nó) được khai báo". Vì vậy, những gì bạn đang cố gắng làm là không thể. Bạn có thể giải thích thêm về nhu cầu của mình không? Tại sao bạn muốn chuyển một sự kiện dưới dạng tham số?

+0

Ồ .. vì vậy mã của tôi bị lỗi ở nơi khác. Cảm ơn bạn! –

+1

Nó không phải là trừ tôi. Câu trả lời của bạn là câu trả lời đầu tiên và chính xác. Tôi đã thử phiên bản dài hơn của mã này và nó không muốn hoạt động. Tôi đã viết câu hỏi này ở đây để yêu cầu giúp đỡ, nhưng khi sau khi bạn trả lời tôi đã kiểm tra lại ví dụ đơn giản này từ đây nó xảy ra là chính xác như bạn đã viết. Cảm ơn . –

+1

Vẫn gặp sự cố. Xin lỗi cho câu hỏi missasking, không phải là pricese và tập trung vào tình hình khi tôi có một lỗi –

3

Không thể thực hiện được. Bạn có thể sử dụng một đại biểu thay vì một sự kiện nếu đáp ứng nhu cầu của bạn.

1
delegate void doIt(object sender, object data); 
    event doIt OnDoIt; 

    void add(doIt theDel) 
    { 
     OnDoIt += theDel; 
    } 

    void doIt1(object a, object b) 
    { 
    } 

    void doIt2(object a, object b) 
    { 
    } 

    void add() 
    { 
     add(doIt1); 
     add(doIt2); 
    } 
5

tôi đã làm nó như thế này:

public AttachToHandleEvent(Object obj, string EventName) 
{ 
    EventInfo mfi = obj.GetType().GetEvent(EventName); 
    MethodInfo mobj = mfi.GetAddMethod(); 
    mobj.Invoke(obj, new object[] { Item_Click}); 
} 

private void Item_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show("lalala"); 
} 

ToolStripMenuItem tool = new ToolStripMenuItem(); 
AttachToHandleEvent(tool "Click"); 

Cảm ơn tất cả các bạn để được tư vấn. Giải pháp này không thể được thực hiện nếu không có sự giúp đỡ của bạn.

+0

Mã này có một số vấn đề với nó. Có một giải pháp ở đây: http://msdn.microsoft.com/en-us/library/ms228976%28v=vs.95%29.aspx#Y899 – cbp

-1

Câu hỏi của bạn cho thấy rằng bạn có một số cơ chế sai: Bạn không thể vượt qua các sự kiện!

Bạn có thể muốn chuyển một hàm như một tham số, vì vậy phương thức gọi sẽ gọi phương thức đó tại một số điểm. Về mặt kỹ thuật, đây là một đại biểu. Tôi khuyên bạn nên sử dụng lớp Hành động đã được xác định. Dưới đây là một đoạn mã ví dụ:

void MyFunction (string otherArguments, Action onFinished){ 
    ... 
    if (onFinished != null) 
     onFinished.Invoke(); 
} 

Những điều tốt đẹp về việc này là khi gọi MyFunction bạn có thể tuyên bố hành động bằng cách sử dụng cú pháp inline:

MyFunction("my other argument",()=>{ 
    ///do stuff here, which will be execuded when the action is invoked 
}); 
Các vấn đề liên quan