Определение контрола, вызвавшего событие
Необходимость определять контрол, вызвавший то или иное событие, возникает тогда, когда различные или одинаковые события различных контрол замыкаются на один обработчик, в котором действия обработчика специфичны в зависимости от контрола, вызвавшего событие.
Создадим Windows Application решение как показано в параграфе «Простейшие Windows Application решения» и поместим на форму два контрола Button. Создадим один обработчик события нажатия кнопки для контрола button1 (напомним, это можно сделать двойным кликом на кнопке в дизайнере формы), а обработчик события нажатия кнопки для button2 переопределим на обработчик для button1. Для этого выберем мышкой контрол button2 и в окне Proporties перейдем к вкладке Events, далее для события Сlick в выпадающем списке выберем button1_Click. Как результат при нажатии кнопки 1 и 2 будет вызываться один и тот же обработчик button1_Click.
Для того чтобы узнать какая именно кнопка нажата впишем в обработчик следующий код:
private void button1_Click(object sender, EventArgs e)
Запустив приложение, видим, что текст вывода соответствует надписи на кнопке.
Другой способ определить номер кнопки через статическое преобразование типов — это дополнительно присвоить свойствам Tag кнопок разные номера (например button1 Tag=1, button2 Tag=2);
Перепишем код обработчика следующим образом:
private void button1_Click(object sender, EventArgs e) < int k=Convert.ToInt32((sender as Button).Tag); string s="Вы нажали кнопку "; switch (k) < case 1: s+="номер 1"; break; case 2: s+="номер 2"; break; default: s="Да не могли Вы сюда попасть"; break; >MessageBox.Show(this,s,"Какая кнопка?"); >
Опять четко определяется нажатая кнопка.
Этот обработчик можно назначить сразу нескольким контролам, но только TButton. При попытке преобразования к другого типу контрола, программа выдаст исключение на преобразование типов. Если же необходимо выполнить преобразование из неизвестного класса, то можно использовать конструкции try. catch.
Определение через массив Controls
Все визуальные контролы на форме хранятся в массиве Controls. При переносе контрола на форму ему автоматически присваивается номер 0 в массиве, а остальные номера контрол увеличиваются на 1. Число контрол на форме хранится в свойстве Count. Используя это, следующий код ищет среди всех контрол формы контролы Button и если найден такой контрол выводит его имя.
for(int i=0; i < this.Controls.Count; i++) < //Ищем контролы Button if(Convert.ToString(this.Controls[i].GetType().Name) == "Button") < MessageBox.Show(this, Convert.ToString(this.Controls[i].Name), "Какие есть кнопки?"); >>
Условия поиска можно расширить на область всех кнопок (не зависимо от их типа):
if(Convert.ToString(this.Controls[i].GetType().BaseType) == "System.Windows.Forms.ButtonBase")
Уточнение конкретного элемента, как и в примере первого параграфа, можно вести по свойству Tag.
Поместим на форму, которая была испольозована в предыдущем параграфе, еще несколько контролов (например Button, RadioButton, CheckBox) и переопределим их события Click на button1_Click, код обработки которого перепищим на следующий:
private void button1_Click(object sender, EventArgs e) < string s; int a,b; for(int i=0; i < this.Controls.Count; i++) < //Tag контрола a=Convert.ToInt32(this.Controls[i].Tag); if(Convert.ToString(this.Controls[i].GetType().BaseType) == "System.Windows.Forms.ButtonBase") < //Tag источника события b=Convert.ToInt32((sender as Button).Tag); //Tag контрола в массиве совпал с Tag источника события if(a == b) < switch (b) < case 1: s="Вы нажали кнопку номер 1"; break; case 2: s="Вы нажали кнопку номер 2"; break; default: s="Да не могли Вы сюда попасть"; break; >>//if(a == b) MessageBox.Show(this,s,»Какая кнопка?»); >//if(Convert.ToString(this.Controls[i]. >//for(int i=0; i
В примере опять безошибочно определяется какая из двух кнопок нажата.
Отметим, что конструкции this.Controls[i]. доступны все свойства и методы контрола (если они определены). Такой доступ часто используется, и, в принципе, без этого и не обойтись, когда на форме много одинаковых контролов, а код обработчика каких либо событий одинаков или схож. К примеру если на форме 100 контролов ImageBox и надо изменить свойство (например Visible) одного из них по клику на нем мышки, то не писать же один и тот же код в 100 обработчиках.
Если на форме кроме Button-а, еще и другие контролы можно ставить такие как: RadioButton, CheckBox, то их можно использовать с одним обработчиком button1_Click, используя следующий код (прислал Фируз Икром).
using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication2 < public partial class Form2 : Form < public Form2() < InitializeComponent(); >private void button1_Click(object sender, EventArgs e) < string s; int a, b; for (int i = 0; i < this.Controls.Count; i++) < //Tag контрола a = Convert.ToInt32(this.Controls[i].Tag); if (Convert.ToString(this.Controls[i].GetType().BaseType) == "System.Windows.Forms.ButtonBase") < //Tag источник события b = Convert.ToInt32((sender as ButtonBase).Tag); //Tag контрола в массиве совпал с Tag источника события if (a == b) < switch (b) < case 1: s = "Вы нажали кнопку номер 1"; break; case 2: s = "Вы нажали кнопку номер 2"; break; case 3: s = "Вы нажали" + " " + Convert.ToString(this.Controls[i].GetType().Name) + " " + "номер 3"; break; case 4: s = "Вы нажали" + " " + Convert.ToString(this.Controls[i].GetType().Name) + " " + "номер 4"; break; default: s = "Да не мог ты сюда попасть"; break; >MessageBox.Show(this, s, "Какая кнопка?"); >// if(a == b) >// if(Convert.ToString(this.Controls[i] . >// for (int i = 0; i < this.Controls.Count; i++) >> >
Молчанов Владислав 25.06.2004г.
Проверена работоспособность в VS 2005 5.11.2006г.
Еcли Вы пришли с поискового сервера — посетите мою главную страничку
На главной странице Вы найдете программы комплекса Veles — программы для автолюбителей, программу NumberPhoto, созданную для работы с фото, сделанными цифровым фотоаппаратом, программу Bricks — игрушку для детей и взрослых, программу записную книжку, теоретический материал по программированию в среде Borland C++ builder, C# (C .Net).
Получение из sender’a кнопку
суть вопроса такова, получение из private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) кнопку для дальнейшего её перемещения на место другой кнопки. Делаю следующие действия Button buttonc = (Button)sender; для преобразования sender в Button . Но, выходит следующая ошибка : не существует подходящего определяемого пользователем преобразования из «System::Object^» в «System::Windows::Form::Button» , гуглил но ничего таки не нашёл.
Отслеживать
28.8k 12 12 золотых знаков 59 59 серебряных знаков 118 118 бронзовых знаков
Как сравнить button==button из массива в c#?

Приветствую , проблема токая при нажатия Button сох. и выбрать второй Button и сравнить .
int a = 0; int k = 0; int[] mas = new int[30]; Random rand = new Random(); Button[,] S = new Button[15, 15]; public Form1() < InitializeComponent(); >private void новаяИграToolStripMenuItem_Click(object sender, EventArgs e) < for (int i = 0; i < 15; ++i) for (int j = 0; j < 15; ++j) < < for (k = 0; k < 15; k++) < mas[k] = k; >int f = rand.Next(25); a = mas[k]; mas[k] = mas[f]; mas[f] = a; S[i, j] = new Button(); S[i, j].Location = new Point(i * 40 + 350, j * 40 + 50); S[i, j].Size = new Size(45, 45); S[i, j].MouseClick += new MouseEventHandler(S_MouseClick); S[i, j].Text = mas[k].ToString(); Controls.Add(S[i, j]); > > > void S_MouseClick(object sender, MouseEventArgs e)
- Вопрос задан более трёх лет назад
- 397 просмотров
Комментировать
Решения вопроса 1

Алексей Немиро @AlekseyNemiro
full-stack developer
Кнопки сравнить просто так не получится, это разные экземпляры и они будут разными, даже если имеют одинаковый набор значений свойств.
Можно сравнить, например, Text.
Для этого достаточно сделать переменную на уровне класса, в которую помещать текст первой нажатой кнопки (или ссылку на саму кнопку). Когда будет нажата следующая кнопка, сравнивать её текст с сохраненным значением.
private Button FirstButton = null; void S_MouseClick(object sender, MouseEventArgs e) < var button = (sender as Button); if (this.FirstButton == null) < // это первая кнопка в текущей сессии, // запоминаем ссылку на кнопку this.FirstButton = button; >else < // это вторая кнопка в текущей сессии // сравниваем текст с первой if (this.FirstButton.Text == button.Text) < Console.WriteLine("Текст совпадает!"); // меняем свойства кнопок this.FirstButton.Text = button.Text = "--"; this.FirstButton.Enabled = button.Enabled = false; >else < Console.WriteLine("Текст не совпадает."); >// сбрасываем выбор, запуская тем самым новую сессию this.FirstButton = null; > >
Если понадобится сравнивать более двух кнопок, то придется делать коллекцию.
Вместо Text можно сравнивать по какому-нибудь другому признаку. У элементов есть свойство Tag, которое можно использовать для хранения любых дополнительных данных.
Если все будет совсем сложно, то можно расширить Button дополнительными свойствами путем наследования. В таком случае можно будет переопределить Equals и с операторами поиграть.
Button. Click Событие
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возникает при щелчке элемента управления Button.
public: event EventHandler ^ Click;
public: virtual event EventHandler ^ Click;
public event EventHandler Click;
member this.Click : EventHandler
Public Custom Event Click As EventHandler
Тип события
Реализации
Примеры
В следующем примере кода показано, как указать и закодировать обработчик событий для Click события, чтобы при щелчке элемента управления отображалось сообщение на веб-странице Button .
Untitled Page
Button Example
Комментарии
Событие Click возникает при щелчке Button элемента управления. Это событие обычно используется, если имя команды не связано с элементом Button управления (например, с кнопкой «Отправить»).
Дополнительные сведения об обработке событий см. в разделе Обработка и вызов событий.
Применяется к
См. также раздел
- OnClick(EventArgs)
- CommandEventHandler
- Кнопки Веб-серверные элементы управления