首页 > 解决方案 > 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;
    }
}

该代码仅用于添加按钮,我将很高兴获得任何帮助,谢谢你们!

标签: c#visual-studiobuttondynamic

解决方案


好吧,对您的问题的直接回答是:senderButton

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);

这将确保您的按钮排列整齐。

排列的按钮


推荐阅读