我正在编写一个程序,在其中动态添加按钮,方法是将它们存储在Dictionary中,以便以后从它们中获取特定值(背景颜色)。
我需要在每个事件上设置一个Click事件,但是每个Click事件都必须有所不同,例如,通过单击按钮,会弹出ColorDialog并更改按钮的背景。
有没有办法知道我单击了哪个按钮?在以下代码中,button1 click事件将添加其他按钮并为每个按钮设置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;
}
}
该代码仅用于添加按钮,我将为您提供任何帮助,谢谢大家!
答案 0 :(得分:2)
好吧,您的问题的直接答案是:将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);
这将确保您的按钮排列合理。