2014-10-22 2 views
0

Обновлено: Извинения за краткость, я быстро сбил пример, надеясь, что это было что-то простое в определении. Я по существу есть компонент, который наследуется от DataGridView:Нестандартное событие не создано

public partial class MyGrid: DataGridView 
{ 
    public MyGrid() 
    { 
     InitializeComponent(); 
    } 

    public delegate void MyEventHandler(object myObject); 

    public event MyEventHandler MyEvent; 

    public void MyMethod() 
    { 
     if (MyEvent != null) 
     { 
      object someObject = "[it varies what I supply here]"; 
      MyEvent(someObject); 
     } 
    } 
} 

В моей форме я перетащить компонент на форму и проволоки до события через окно событий для MyGrid1 таким образом, что класс дизайнер форме имеет эту запись:

this.MyGrid1.MyEvent += new MyGrid.MyEventHandler(this.MyGrid1_MyEvent); 

и в самой форме:

private void MyGrid1_MyEvent(object myObject) 
{ 
    //do something.... 
} 

Но MyEvent всегда null и как таковой даже никогда не срабатывает.

Я уверен, что мне никогда не приходилось создавать экземпляр MyEvent специально раньше.

Любые идеи?

ответ

2

Ваш код снайпера слишком короткий, чтобы рассказать вам, как это сделать в вашем случае, вот полный пример.

using System; 
namespace MyCollections 
{ 
    using System.Collections; 

    // A delegate type for hooking up change notifications. 
    public delegate void ChangedEventHandler(object sender, EventArgs e); 

    // A class that works just like ArrayList, but sends event 
    // notifications whenever the list changes. 
    public class ListWithChangedEvent: ArrayList 
    { 
     // An event that clients can use to be notified whenever the 
     // elements of the list change. 
     public event ChangedEventHandler Changed; 

     // Invoke the Changed event; called whenever list changes 
     protected virtual void OnChanged(EventArgs e) 
     { 
     if (Changed != null) 
      Changed(this, e); 
     } 

     // Override some of the methods that can change the list; 
     // invoke event after each 
     public override int Add(object value) 
     { 
     int i = base.Add(value); 
     OnChanged(EventArgs.Empty); 
     return i; 
     } 

     public override void Clear() 
     { 
     base.Clear(); 
     OnChanged(EventArgs.Empty); 
     } 

     public override object this[int index] 
     { 
     set 
     { 
      base[index] = value; 
      OnChanged(EventArgs.Empty); 
     } 
     } 
    } 
} 

namespace TestEvents 
{ 
    using MyCollections; 

    class EventListener 
    { 
     private ListWithChangedEvent List; 

     public EventListener(ListWithChangedEvent list) 
     { 
     List = list; 
     // Add "ListChanged" to the Changed event on "List". 
     List.Changed += new ChangedEventHandler(ListChanged); 
     } 

     // This will be called whenever the list changes. 
     private void ListChanged(object sender, EventArgs e) 
     { 
     Console.WriteLine("This is called when the event fires."); 
     } 

     public void Detach() 
     { 
     // Detach the event and delete the list 
     List.Changed -= new ChangedEventHandler(ListChanged); 
     List = null; 
     } 
    } 

    class Test 
    { 
     // Test the ListWithChangedEvent class. 
     public static void Main() 
     { 
     // Create a new list. 
     ListWithChangedEvent list = new ListWithChangedEvent(); 

     // Create a class that listens to the list's change event. 
     EventListener listener = new EventListener(list); 

     // Add and remove items from the list. 
     list.Add("item 1"); 
     list.Clear(); 
     listener.Detach(); 
     } 
    } 
} 

Это MSDN example. ЕСЛИ что-то непонятно, вы можете читать, это больше объяснений.

+0

Спасибо, я полагаю, что можно явно назначить событие а не через дизайнера, мне просто никогда не приходилось делать это раньше. – mattpm

1

Вы создали свой обработчик событий, но вы никогда не придавали методы к нему (насколько я могу видеть из кода) Попробуйте следующее:

class test{ 
    Foo myobject = new Foo(); //since you didn't specify your class names 
    myobject.MyEvent += myobject.MyEventHandler(method_to_call); 

    public void methodToCall(String s){ 
     //your logic on event trigger 
    } 
} 
Смежные вопросы