【问题标题】:WinForms: Get a certain button from its variablenameWinForms:从其变量名中获取某个按钮
【发布时间】:2017-02-24 15:35:35
【问题描述】:

我正在使用 C# Windows 窗体编写一个计算器。我想听数字键并在变量名中具有相同数字的 Button 上执行Button.PerformClick()。我的按钮以图案命名:btn1、btn2、btn3 等。 我的代码:

            switch (c) //c is the KeyChar Value of the pressed Key
            {
                case '1':
                    {
                        btn1.PerformClick();
                        break;
                    }
                case '2':
                    {
                        btn2.PerformClick();
                        break;
                    }
                case '3':
                    {
                        btn3.PerformClick();
                        break;
                    }

                ...

                case '9':
                    {
                        btn3.PerformClick();
                        break;
                    }

            }

有没有比一遍又一遍地复制所有内容 9 次更好的代码方式?我试过以下(没用):

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

我做错了什么还是有更好/更顺畅的方法来做这件事,还是我必须像以前那样做?

【问题讨论】:

    标签: c# winforms button keylistener


    【解决方案1】:

    我只需将 10 个按钮中的每个按钮的 Tag 设置为其数值,并对所有 10 个按钮使用单个 Click 事件处理程序。然后在处理程序例程中,我只需阅读senderTag

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

    【讨论】:

    • 工作得很好,欣赏它。
    【解决方案2】:

    你可以用一行得到你的按钮

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

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

    【讨论】:

    • 你可能想要“btn”,而不是“Btn”。
    • 这取决于它们在设计器中的命名方式。 btn1 是变量名称,通常与属性名称相同,但我在上面强调了这个问题。
    【解决方案3】:

    使用Name 属性并没有错误,但我个人不喜欢应用程序的属性和功能之间的这些秘密链接。相反,我会创建一个Dictionary&lt;char, Button&gt; mapping,并在InitializeComponent() 之后填充它。

    然后您可以使用:

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

    【讨论】:

      【解决方案4】:

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

      例如:

      private Dictionary<char, Button> _buttons;
      
      public Form1()
      {
          InitializeComponent();
      
          this.KeyUp += Form1_KeyUp;
      
          _buttons = new Dictionary<char, Button>();
      
          _buttons.Add('0', btn0);
          _buttons.Add('1', btn1);
          _buttons.Add('2', btn2);
          //etc
          _buttons.Add('*', btnMultiply);
          _buttons.Add('-', btnMinus);
      }
      
      private void Form1_KeyUp(object sender, KeyEventArgs e)
      {
          char key = '1'; // Get your key char however you are doing it now
      
          if (_buttons.ContainsKey(key))
              _buttons[key].PerformClick();
      }
      

      【讨论】:

        猜你喜欢
        • 2015-06-21
        • 1970-01-01
        • 2022-07-21
        • 2015-12-31
        • 1970-01-01
        • 1970-01-01
        • 2022-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多