Динамическое создание кнопок и работа с ними C#

231
10 марта 2018, 16:11

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

я делаю так,

arr[i].Click += new EventHandler(button_1); //arr это массив кнопок

заместо button_1 нужно сделать например button_2,button_3 и т.д. кнопок очень много.

Answer 1

К примеру у нас есть такой код, который добавляет на нашу форму 10 кнопок:

int top = 10;
int left = 10;
for (int i = 0; i < 10; i++)
{
    Button button = new Button();
    button.Left = left;
    button.Top = top;
    this.Controls.Add(button);
    top += button.Height + 2;
}

Как мы можем узнать кнопку? Для этого нужен какой либо идентификатор, возьмем к примеру имя, пусть оно будет btn{порядковый номер}. Добавим после строки button.Top = top; еще одну строку button.Name = "btn" + i;.

Далее, как нам отследить нажатие? Для этого нужно подписаться на событие. Стандартный вариант - Click - событие, которое происходит при клике мышью по объекту. Для всех наших кнопок достаточно всего одного обработчика событий! Давайте добавим еще одну строку в свойство кнопки - button.Click += ButtonOnClick;.

Хорошо, с генерацией покончили, теперь наш код выглядит так:

int top = 10;
int left = 10;
for (int i = 0; i < 10; i++)
{
    Button button = new Button();
    button.Left = left;
    button.Top = top;
    button.Name = "btn" + i;
    button.Click += ButtonOnClick;
    this.Controls.Add(button);
    top += button.Height + 2;
}

Но! Мы не добавили то, что будет выполнятся при нажатие на кнопку, давайте напишем:

private void ButtonOnClick(object sender, EventArgs eventArgs)
{
}

Хорошо, ошибок нет, должно все работать. Но, нужно ведь наделить каким то функционалом наши кнопки... Давайте в ButtonOnClick добавим определение нажатой кнопки и ее удаление:

var button = (Button)sender;
if (button != null)
{
    MessageBox.Show("Прощай " + button.Name);
    button.Dispose();
}

Давайте по порядку:

  • var button = (Button)sender; - Событие Click выдает нам объект sender, который содержит в себе всю информацию о том, кто послал данное событие. Мы знаем, что клик по кнопке производят объекты типа Button, значит смело можем привести sender к типу Button и записать это в переменную.
  • if (button != null) Тут мы проверяем, все ли у нас хорошо и не равна ли полученная нами кнопка Null. Кстати, в новых версиях C# языка все это можно очень грамотно упростить (а именно заменив "шапку" if и первую строку на if (sender is Button button).
  • MessageBox.Show("Прощай " + button.Name); - Ну, обычный вывод сообщения, нечего сверхъестественного. Единственное, подобную "компоновку" string можно очень просто сократить (опять же, новые версии языка, но знать думаю будет полезно), а именно "Прощай " + button.Name мы меняем на $"Прощай {button.Name}".
  • button.Dispose(); - Здесь тоже довольно просто, говорим кнопке "пока!", а если быть точнее, то удаляем все занятые ей ресурсы (что приведет к ее удалению с формы).

Чтож, вроде все разложил "по полочкам" как мог, с этой частью думаю трудностей не возникнет. Удачи!

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

Создадим где нибудь приватный объект Button, который будет хранить информацию о последней нажатой кнопке:

private Button ClickedButton;

Далее, к примеру, при нажатие 2 раза на кнопку, сделаем так, что бы она удалялась. Для этого перепишем наше событие ButtonOnClick:

if (sender is Button button)
{
    if (ClickedButton != null)
    {
        if (ClickedButton.Name == button.Name)
        {
            button.Dispose();
        }
    }
    ClickedButton = button;
}
  • if (sender is Button button) - об этом я уже писал выше (приводим sender к типу Button и если он не Null, то выполняем код внутри.
  • if (ClickedButton != null) - Проверяем, что бы наша "сохраненная" кнопка, не была пустой.
  • if (ClickedButton.Name == button.Name) - Условие, которое проверяет имена на соответствен. Если они совпадают, то выполняем код внутри.
  • .Dispose(); - Тут тоже все ясно, удаляем объект.
  • ClickedButton = button; - После всех операций, сохраняем нашу кнопку в заранее созданную переменную, для будущего использования.
READ ALSO
Разница между assembly и nuget в asp.net core

Разница между assembly и nuget в asp.net core

Попробовал разделить типовое aspnet core 2

235
Текстовый формат для выборки данных из объекта javascript?

Текстовый формат для выборки данных из объекта javascript?

Есть объект data; И нужно через текстовый формат обращаться в его свойствамНапример

231
нужно обрезать и записать только слово после двоеточия регуляркой

нужно обрезать и записать только слово после двоеточия регуляркой

таким образом записываю с телеграмма сообщение в гугл таблицуСообщения приходят в таком виде:

269
Как сделать вертикальный зум в amCharts?

Как сделать вертикальный зум в amCharts?

Подскажите, как в amCharts(на графике) сделать вертикальный зум, при нажатии Ctrl+scrollЕсть метод, в котором можна установить зум по-дефолту

220