Обработчики событий в c# - синтаксис / шаблон

Я новичок в c# , поэтому извиняюсь, если это вопрос noob. Я пытаюсь получить ясность вокруг синтаксиса или шаблона для обработки событий в c#.

Итак, у меня есть Form объект Form1 и Button button1 в форме. Я обрабатываю событие Click с помощью такого метода в Form1.cs:

private void button1_Click(object sender, EventArgs e)
{
    Debug.WriteLine("click!");
}

, которая работает нормально. Теперь в другой форме Form2 у меня есть TreeView treeView1 и я хочу, чтобы обрабатывать BeforeExpand событие. Поэтому я предположил, что это будет:

private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
     Debug.WriteLine("Hello!");
}

что на самом деле не работает: этот метод никогда не вызывается при развертывании узла. Но несколько ответов так подразумевают это is лучший способ сделать это, электронная.G Этот один.

в любом случае я нашел альтернативный подход, который работает для меня. В конструкторе формы свяжите обработчик событий следующим образом:

treeView1.BeforeExpand += new TreeViewCancelEventHandler(anyMethodNameYouLike);

так в чем же разница между этими двумя подходами? Почему синтаксис _event не работает для treeview? Есть ли какая-то разница между событием типы?

спасибо

8 ответов


Я предполагаю, что вы дважды щелкнули кнопку в конструкторе Visual Studio. The button1_Click обработчик был добавлен автоматически, так же, как вы создали BeforeExpand обработчик вручную.

проверьте свой Form1.Дизайнер.cs-файл, вы найдете строку примерно так:

this.button1.Click += new System.EventHandler(this.button1_Click);

нужны обе вещи:
1) метод, который может обрабатывать тип события. Для TreeViewCancelEventHandler(MSDN) делегировать правильную подпись метода:

public void MyMethodNameGoesHere(Object sender,TreeViewCancelEventArgs e)
{
  // do some impressive stuff here
}

2) вы должны зарегистрироваться на мероприятие:

treeView1.BeforeExpand += new TreeViewCancelEventHandler(MyMethodNameGoesHere);

вы также можете использовать только имя метода:

treeView1.BeforeExpand += MyMethodNameGoesHere;

и в качестве последней альтернативы вы можете использовать этот "встроенный" синтаксис для небольших функций:

treeView1.BeforeExpand += (sender, e) =>
{
    // do a bit of magic here
};

что, возможно, хорошо знать, что регистрации обработчиков не "стек" (извините за плохую формулировку, предложения по улучшению очень приветствуются!). То есть, когда вы сделаете следующее, Вы будете не получить дальнейшие события после выполнения последней строки:

treeView1.BeforeExpand += MyMethodNameGoesHere;
treeView1.BeforeExpand += MyMethodNameGoesHere;
treeView1.BeforeExpand += MyMethodNameGoesHere;
treeView1.BeforeExpand -= MyMethodNameGoesHere; // note the MINUS sign

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

должна быть такая строка:

button1.Click += button1_Click;

(возможно с new EventHandler() обертка) где-то в вашем Form1 код, скорее всего, в .дизайнер.cs файл.


первый синтаксис, который вообще не является синтаксисом, - это просто соглашение об именах для обработчиков событий. То, что вы делаете со вторым синтаксисом, - это настройка делегата обработчику событий и добавление его к этому событию.

Если вы проверите Form1 и нажмите кнопку Выбрать и посмотрите на его свойства событий, событие, скорее всего, подключено через конструктор. Вы можете сделать то же самое с TreeView на его форме, через дизайнера.


система обработки событий C# не работает ни на каком соглашении об именах (я думаю, вы можете поверить, что это так?). Метод называется treeView1_BeforeExpand не будет вызываться в событии BeforeExpand treeview1, если вы не скажете ему вызвать этот метод для этого конкретного события.

в приведенном ниже коде говорится: "при запуске события BeforeExpand вызовите метод anyMethodNameYouLike.

treeView1.BeforeExpand += new TreeViewCancelEventHandler(anyMethodNameYouLike);

вы должны написать свой anyMethodNameYouLike метод.


этой ссылке должно помочь вам понять, как установить определенные обработчики событий для определенных событий в конструкторе форм.


в WinForms вы можете привязать обработчики событий из конструктора с помощью панели инструментов "свойства" и нажав кнопку lightning вверху. Это позволит открыть вкладку "события". Просто дважды щелкните имя события, чтобы создать обработчик в коде, или выберите существующий метод с правой подписью из раскрывающегося списка. Это фактически создаст код "+ = " для вас в .файл конструктора.

имя Control_Event генерируется автоматически. Однако, вы можете использовать любое имя для ваших обработчиков и даже зарегистрировать более одного.


Это правильный способ подписаться на событие. Конструктор автоматически добавляет эту строку .дизайнер.cs-файл при подписке на мероприятие через него.

в любом случае, эта строка кода где-то записывается. Разница в том, что одно событие подписывается через конструктор, а на другое вы подписываетесь вручную.