C# WinForms:从其variablename获取某个按钮

C# WinForms:从其variablename获取某个按钮,c#,winforms,button,keylistener,C#,Winforms,Button,Keylistener,我正在用C Windows窗体编写计算器。我要听数字键并执行一个按钮。性能单击变量名中具有相同数字的按钮。我的按钮以模式命名:btn1、btn2、btn3等。 我的代码: 在代码方面,有什么比一次又一次地复制9次更好的方法吗?我试过以下方法但不起作用: foreach(Button btn in this.Controls){ if(btn.Text == c.ToString) //c is the KeyChar value { btn.PerformCli

我正在用C Windows窗体编写计算器。我要听数字键并执行一个按钮。性能单击变量名中具有相同数字的按钮。我的按钮以模式命名:btn1、btn2、btn3等。 我的代码:

在代码方面,有什么比一次又一次地复制9次更好的方法吗?我试过以下方法但不起作用:

foreach(Button btn in this.Controls){
    if(btn.Text == c.ToString)  //c is the KeyChar value
    {
        btn.PerformClick();
    }
}

我是做错了什么,还是有更好/更流畅的方法,还是我必须这样做?

你只需一行就可以得到你的按钮

 Button b = this.Controls.OfType<Button>()
                .FirstOrDefault(x => x.Name == "btn" + c.ToString());

 if(b != null) 
   b.PerformClick();

这假设您的按钮名为btn1、btn2等。。我说的是Name属性,而不是您给代表按钮的变量的名称。

您可以用一行代码获得按钮

 Button b = this.Controls.OfType<Button>()
                .FirstOrDefault(x => x.Name == "btn" + c.ToString());

 if(b != null) 
   b.PerformClick();
这假设您的按钮名为btn1、btn2等。。我说的是Name属性,而不是您给代表按钮的变量的名称。

我只需将10个按钮中的每个按钮的标记设置为其数值,并对所有10个按钮使用一个单击事件处理程序。然后在处理程序例程中,我只读取sender的标记

我建议您不要使用键盘输入来执行按钮单击。相反,您应该将键盘输入直接指向操作数变量。同样的事情也应该通过按钮的单击事件处理程序来完成。

我只需将10个按钮中的每个按钮的标记设置为其数值,并对所有10个按钮使用一个单击事件处理程序。然后在处理程序例程中,我只读取sender的标记

我建议您不要使用键盘输入来执行按钮单击。相反,您应该将键盘输入直接指向操作数变量。同样的事情也应该通过按钮的单击事件处理程序来完成。

使用Name属性没有错,但我个人不喜欢应用程序的属性和功能之间的这些秘密链接。相反,我将创建一个字典映射,并在InitializeComponent之后填充它

然后,您可以使用:

Button button;
if (mapping.TryGetValue(c, out button))
    button.PerformClick();
使用Name属性没有错,但我个人不喜欢应用程序的属性和功能之间的这些秘密链接。相反,我将创建一个字典映射,并在InitializeComponent之后填充它

然后,您可以使用:

Button button;
if (mapping.TryGetValue(c, out button))
    button.PerformClick();

每次都可以使用find控件来获取按钮,但是将已知按钮添加到按钮字典中会有更好的性能。如果重命名按钮并忘记更新代码,也不会中断

例如:


每次都可以使用find控件来获取按钮,但是将已知按钮添加到按钮字典中会有更好的性能。如果重命名按钮并忘记更新代码,也不会中断

例如:


您可能需要btn,而不是btn。这取决于它们在设计器中的命名方式。btn1是一个变量名,通常与属性名相同,但我在上面已经画了下划线。您可能想要的是btn,而不是btn。这取决于它们在设计器中的命名方式。btn1是一个变量名,通常与属性名相同,但我已经在上面的这个问题上画了下划线。非常好用,非常感谢。非常好用,非常感谢。