Как узнать имя элемента, который вызвал событие?

160
30 апреля 2018, 23:16

У меня есть следующий код:

        PictureBox[] ncards = GetPictures();
        PictureBox[] ncards1 = GetPictures1();
        for (int it = 0; it <= ncards.Length - 1; it++)
        {
            ncards[it].Click += Form1_Click1;
        }
        for (int it1 = 0; it1 <= ncards.Length - 1; it1++)
        {
            ncards1[it1].Click += Form1_Click;
        }

Обработчик должен получить номер PictureBox'а, так как все боксы имеют один обработчик события, но sender.Name не работает. Есть идеи, товарищи?

Answer 1

Во всех обработчиках событий WinForms первым параметром идёт sender, в котором содержится объект, у которого было вызвано событие. Он имеет тип object потому сперва его нужно привести к нужному типу.

Сделать это можно разными способами, как уже написали в комментариях:

(PictureBox)sender
sender as PictureBox

Второй способ выглядит несколько изящнее. Но лучше использовать первый: в случае если каст не удастся (sender не является PictureBox) мы получим сообщение об ошибке в этой же строке. Во втором способе мы получим исключение NullReferenceException где-то ниже по коду, в итоге будет сложнее найти источник проблемы.

Тип Control, являющийся родителем всех графических компонентов WinForms, имеет свойство Name. При использовании дизайнера формы, в это свойство заносится то же имя, которое даётся переменной (полю).

Убедиться в этом можно, кинув какой-нибудь компонент на форму и открыв файл Form*.Designer.cs. В нём среди прочих будут строки наподобие

this.pictureBox1.Name = "pictureBox1";

При ручном создании контролов в коде нужно добавить аналогичную строку в свой код. После чего в обработчике события можно будет получить имя компонента из этого свойства.

На заметку: метод Find использует это же свойство для поиска.

READ ALSO
Как имитировать некоторые действия

Как имитировать некоторые действия

Помогите имитировать клик, х2 клик, правый клик, CTRL+V в C#У меня программа голосовое управление, надо чтобы эти действия обезательно были

219
Ограничения универсального типа

Ограничения универсального типа

Был взят за основу код из ответа на SOНужно была доработка класса MessageHandlerAdapter чтобы в качестве базового типа была команда ICommand<IMessage>, но при...

171
Примеры сверточных нейронных сетей

Примеры сверточных нейронных сетей

Где можно найти полноценные примеры сверточных нейронных сетей для C# без применения сторонних библиотек?

178
Проблема при расширении свойств класса

Проблема при расширении свойств класса

Создаю обёртку над SortedDictionary

185