C # - Как узнать, какая динамическая кнопка была нажата? - PullRequest
0 голосов
/ 15 ноября 2018

Я пишу программу, в которой я динамически добавляю кнопки, я делаю это, сохраняя их в словаре, чтобы потом получить от них определенное значение (цвет фона).

Мне нужно установить событие Click для каждого из них, но каждое событие Click должно немного отличаться, так как при нажатии кнопки появляется ColorDialog и изменяет фон кнопки.

Есть ли способ узнать, на какую кнопку я нажал? В следующем коде событие click1 добавляет другие кнопки и устанавливает EventHandler для каждой из них, каким должен быть код для EventHandler? Заранее большое спасибо, ребята.

int i = 0;
Dictionary<int, Button> buttonDictionary = new Dictionary<int, Button>();
Dictionary<int, ColorDialog> colorsDictionary = new Dictionary<int ColorDialog>();


public void button1_Click(object sender, EventArgs e)
{
    i++;
    buttonDictionary.Add(i, new Button());
    buttonDictionary[i].Click += new EventHandler(Click);
    this.Controls.Add(buttonDictionary[i]);
}

public void Click(object sender, EventArgs e)
{
    //Somehow get the int key of the button that was clicked???? (in this case: int j)

    int j;

    if (!colorsDictionary.ContainsKey(j))
    {
        colorsDictionary.Add(j, new ColorDialog());
    }

    if (colorsDictionary[j].ShowDialog() == DialogResult.OK)
    {
        buttonDictionary[j].BackColor = colorsDictionary[j].Color;
    }
}

Код сделан только для добавления кнопок, я буду рад любой помощи, спасибо, ребята!

1 Ответ

0 голосов
/ 15 ноября 2018

Ну, прямой ответ на ваш вопрос: приведите sender к Button

Button pressedButton = (Button) sender;

и затем проверьте, какой кнопке словаря соответствует:

foreach (var entry in buttonDictionary)
{
    if (entry.Value == pressedButton)
    {
        j = entry.Key;
        break;
    }
}

Однако это слишком сложно для того, чего вы хотите достичь. Было бы намного проще, если бы у вас была прямая связь между кнопкой и палитрой цветов:

Dictionary<Button, ColorDialog> buttonDictionary = new Dictionary<Button, ColorDialog>();

Затем заполните это так:

public void button1_Click(object sender, EventArgs e)
{
    i++;
    var button = new Button();
    this.Controls.Add(button);
    button.Click += new EventHandler(Click);

    buttonDictionary.Add(button, null);
}

А позже получите к нему доступ

public void Click(object sender, EventArgs e)
{
    Button pressedButton = (Button) sender;
    ColorDialog dialog = buttonDictionary[pressedButton];

    if (dialog == null)
    {
        dialog = new ColorDialog();
        buttonDictionary[pressedButton] = dialog;
    }

    if (dialog.ShowDialog() == DialogResult.OK)
    {
        pressedButton.BackColor = dialog.Color;
    }
}

Более того, вопрос в том, почему вам понадобится так много ColorDialgos, поскольку это возможно только в одном диалоге. Вы можете избавиться от i, j, всех словарей и большей части обработки. ИМХО, следующего должно быть достаточно:

public void button1_Click(object sender, EventArgs e)
{
    var button = new Button();
    Controls.Add(button);
    button.Click += Click;
}

public void Click(object sender, EventArgs e)
{
    Button pressedButton = (Button) sender;
    ColorDialog dialog = new ColorDialog {Color = pressedButton.BackColor};
    if (dialog.ShowDialog() == DialogResult.OK)
    {
        pressedButton.BackColor = dialog.Color;
    }
}

Информация о бонусе:

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

flowLayoutPanel1.Controls.Add(button);

Это обеспечит правильное расположение кнопок.

Buttons arranged

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...