c# - C# - 如何找出点击了哪个动态按钮?
问题描述
我正在编写一个程序,在其中动态添加按钮,我通过将它们存储在字典中以便稍后从它们中获取特定值(背景颜色)来做到这一点。
我需要为它们中的每一个设置一个 Click 事件,但每个 Click 事件都必须有所不同,因为通过单击按钮,会弹出一个 ColorDialog 并更改按钮的背景。
有没有办法知道我点击了哪个按钮?在下面的代码中,button1点击事件添加了其他按钮并为每个按钮设置了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;
}
}
该代码仅用于添加按钮,我将很高兴获得任何帮助,谢谢你们!
解决方案
好吧,对您的问题的直接回答是: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;
}
}
更重要的是,问题是为什么你需要这么多 ColorDialgo,因为它应该只用一个对话框就可以了。您也可以摆脱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);
这将确保您的按钮排列整齐。
推荐阅读
- java - 如何指示 yum 安装特定版本的 OpenJDK
- python - 在python中进行网络爬行时不响应
- excel - 在 iframe 中引用 HTML 文档时遇到问题
- graphviz - Graphviz - 如何分隔自引用边缘以避免造成视觉混乱?
- reactjs - 添加输入字段 onClick 无状态组件 React Electron
- python - 使用正则表达式检查字符串中的每个字符 - python
- svg - 以不同角度旋转 svg 中的元素
- java - 与 java Pattern 一起使用时,Spring + mongodb 的正则表达式查询失败
- java - 将模型层分离为库时,JPA 注释映射是一种不好的方法吗?
- winapi - 如何创建可写 VSS 快照?