Ну, прямой ответ на ваш вопрос: приведите 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);
Это обеспечит правильное расположение кнопок.