Помощь в организации пользовательских событий .NET - PullRequest
3 голосов
/ 28 января 2010

Будучи относительно новым для C #, я недавно исследовал пользовательские события, и, хотя я думаю, что теперь понимаю базовые элементы, необходимые для настройки пользовательского события, у меня возникают проблемы с определением , где каждого элемента. принадлежит. В частности, вот что я пытаюсь сделать.

У меня есть древовидный элемент управления, представляющий макет внутренней структуры данных. Когда данные переупорядочиваются в дереве (с помощью перетаскивания), мне нужно изменить основную структуру данных для соответствия.

Итак, я пытаюсь запустить свое собственное пользовательское событие из обработчика событий «Drop» древовидного элемента управления (после того, как я проверил удаление). Идея заключается в том, что подписчик на мое событие будет обрабатывать переупорядочение базовых данных.

Я просто пытаюсь определить , где каждый элемент механизма событий должен быть создан и / или использован.

Если бы кто-то мог предоставить мне базовый образец вышеупомянутого, это было бы здорово. Например, может быть простой пример, который устанавливает и запускает пользовательское событие из существующего события button_click. Казалось бы, это хорошая симуляция того, что я пытаюсь сделать.

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

Ответы [ 2 ]

6 голосов
/ 28 января 2010

Вам необходимо объявить прототип для вашего обработчика событий, а переменная-член для хранения обработчиков событий, которые были зарегистрированы в классе, владеет представлением дерева.

// this class exists so that you can pass arguments to the event handler
//
public class FooEventArgs : EventArgs
{
    public FooEventArgs (int whatever) 
    { 
       this.m_whatever = whatever; 
    }

    int m_whatever;
}

// this is the class the owns the treeview
public class MyClass: ...
{
    ...

    // prototype for the event handler
    public delegate void FooCustomEventHandler(Object sender, FooEventArgs args);

    // variable that holds the list of registered event handlers
    public event FooCustomEventHandler FooEvent;

    protected void SendFooCustomEvent(int whatever)
    {
        FooEventArgs args = new FooEventArgs(whatever);
        FooEvent(this, args);
    }

    private void OnBtn_Click(object sender, System.EventArgs e)
    {
        SendFooCustomEvent(42);
    }

    ...
}

// the class that needs to be informed when the treeview changes
//
public class MyClient : ...
{
    private MyClass form;

    private Init()
    {
       form.FooEvent += new MyClass.FooCustomEventHandler(On_FooCustomEvent);
    }

    private void On_FooCustomEvent(Object sender, FooEventArgs args)
    {
       // reorganize back end data here
    }

}
1 голос
/ 28 января 2010

Все принадлежит классу, который выставляет событие:

public event EventHandler Drop;

protected virtual void OnDrop(EventArgs e)
{
    if (Drop != null)
    {
        Drop(this, e);
    }
}

Если у вас есть пользовательский тип EventArgs, вы захотите использовать общий делегат EventHandler<MyEventArgs> вместо EventHandler.

Есть ли еще что-то, в чем ты не был уверен?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...