Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > события и делегаты для кнопки (замена EventArgs)


Автор: AGENTxXx 22.4.2016, 11:56
Всем привет!
Пытаюсь вот до конца вникнуть в события и делегаты, и вроде как увидел след. информацию: 
Цитата

Этот делегат принимает всего лишь два параметра, что явно маловато для универсального делегата. Но все же оказывается, параметров с лихвой хватает для передачи любой информации. Сам по себе класс EventArgs не содержит ни одного интересного члена, способного передавать какую бы то ни было информацию. Он введен лишь для обобщения. Когда необходимо передать дополнительную информацию, вводится новый класс, производный от EventArgs, в котором уже и вводятся поля, передающие необходимую информацию. В одной общей библиотеке у класса EventArgs 100 потомков, и их количество от версии к версии среды исполнения неуклонно растет.

При обращении к событию, имеющему тип данного делегата, в качестве параметра необходимо передать ссылку на текущий объект (this), а во втором параметре экземпляр класса EventArgs или производного от него.

Это цитата из rsdn.

Решил вот сделать что-то подобное (т.е. унаследовать от EventArgs и добавить поля:
Код

public class EvClass : EventArgs
{
       public bool isTrue = false;
       public int second = 2;
}

private void btn_Method(object sender, EvClass e)
{
       textBox1.Text += "2";
}


Но в ответ получаю ошибку на след. строке:
Код

button1.Click += btn_Method;

Возвращаемая ошибка:
Error    1    No overload for 'btn_Method' matches delegate 'System.EventHandler'    c:\users\admin\documents\visual studio 2012\Projects\DelegateExmpl\DelegateExmpl\Form1.cs    23    30    DelegateExmpl

Хотел бы, чтобы пояснили всё же, реально ли это сделать, или такое можно сделать только на полностью "разработанном" объекте в ручную, а забитую информацию в .Net библиотеки уже не поменять и можно использовать только EventArgs? 

Только вроде начал понимать, и опять что-т запутался на этом месте.

Автор: infarch 22.4.2016, 13:41
Для начала, событие Клик у кнопки рассчитывает получить вторым параметром именно EventArgs, а не производный класс. Так что вам остается только привести стандартный класс к вашему:

Код

        private void btn_Method(object sender, EventArgs e)
        {
            EvClass ec = e as EvClass;
            System.Console.WriteLine("executed: {0}", ec.second);
        }


И теперь о грустном: в случае обычного клика по кнопке вы поймаете эксепшен. Фреймворк вызывает событие именно с EventArgs, а о ваших производных ему ничего не известно.

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

Автор: AGENTxXx 23.4.2016, 14:34
А встречались ли случаи, когда EventArgs как-то использовался в коде разработчиком. Просто на сколько я понял, там хранится в основном инфа вспомогательная для самой программы. Просто пока так и не увидел смысла, почему пришли разработчики .Net к такой идеологии... Или типа просто так реализовали и всё?...

Автор: infarch 25.4.2016, 10:36
Я использовал в своих поделках. По сути, в своих обработчиках событий вы можете вообще никаких аргументов не юзать, если не надо. Но если вы, например, наследуетесь от некоего стандартного класса и хотите кинуть его событие вручную со своими дополнительными данными, то наследование от EventArgs очень помогает. Ну и для красоты и расширяемости я предпочитаю чтоб все события имели стандартную форму аргументов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)