C#-如何找出单击了哪个动态按钮?

时间:2018-11-15 20:28:25

标签: c# visual-studio button dynamic

我正在编写一个程序,在其中动态添加按钮,方法是将它们存储在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;
    }
}

该代码仅用于添加按钮,我将为您提供任何帮助,谢谢大家!

1 个答案:

答案 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,因为只有一个对话框才可能实现。您可以摆脱ij,所有字典以及大多数处理方法。恕我直言,以下内容应足够:

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