【问题标题】:Windows Forms - get Text value from object of type buttonWindows 窗体 - 从按钮类型的对象获取文本值
【发布时间】:2013-01-30 18:33:46
【问题描述】:

我有一个名为Form1 的Windows 窗体和该窗体中名为panel1 的面板。我只使用面板来放置按钮,以便我可以将它们分组并与Form1 中的其他按钮分开使用它们。就我的程序而言,我需要处理由panel1 内的按钮进行的​​每个按钮点击。为此,我使用相同的代码 sn-p:

  public Form1()
        {
            InitializeComponent();

            // Set a click event handler for the button in the panel
            foreach (var button in panel1.Controls.OfType<Button>())
            {

                button.Click += HandleClick;
            }
        }

我需要做的是找到一种方法来识别确切点击了哪个按钮。为此,我使用了我的处理程序方法:

private void HandleClick(object o, EventArgs e)
{
    MessageBox.Show("HI" + o.ToString());
}

这给了我一些希望,因为我明白了:

这是第二部分 - Text: button4 这实际上是足够的信息来继续我的工作。但是如果没有一些复杂的字符串操作,我找不到获取这条信息的方法。那么,鉴于我编写代码的方式,有没有办法获取有关单击按钮的此或其他独特信息?

【问题讨论】:

    标签: c# winforms visual-studio-2010


    【解决方案1】:
        private void HandleClick(object sender, EventArgs e)
        {
            var btn = sender as Button;
            if (btn != null)
            {
                MessageBox.Show(btn.Text);
            }
        }
    

    【讨论】:

    • 如果您不将其结果与null 进行比较,我会避免使用as。在这种情况下,如果sender 不是Button,则显式转换将抛出InvalidCastException,这比NullReferenceException 更明确,您将收到as
    • @FrédéricHamidi With OfType
    • 你说得对,sender 在这里被保证是Button(假设HandleClick() 没有在其他地方使用),但在这种情况下,为什么还要麻烦as?使用普通演员,因为你确定:)
    • 在隐式转换的相同场景中它不会抛出 InvalidCastException 吗?
    • 可能我已经修好了:),理论上你也可以把这个hander附加到一个复选框上,这样普通的演员就会坏掉……
    【解决方案2】:

    一种选择是将对象转换为Button,但您可以更改事件处理程序的分配方式,而不是进行转换,这样您就不需要首先进行转换:

    foreach (var button in panel1.Controls.OfType<Button>())
    {
        button.Click += (_,args)=> HandleClick(button, args);
    }
    

    那就把HandleClick的签名改成:

    private void HandleClick(Button button, EventArgs e);
    

    【讨论】:

    • 感谢服务。又快又准。真的很感激。
    • +1。这也是我的首选方法。不过,我通常只是完全删除无意义的EventArgs 参数。
    • @Ginosaji 如果我不使用它我会,但不知道我留下的方法的实现。
    【解决方案3】:

    您需要将sender 转换为Button 类,以便访问其属性:

    Button b = (Button)sender;
    MessageBox.Show(b.Text);
    

    【讨论】:

      猜你喜欢
      • 2020-06-30
      • 2012-01-19
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 2011-06-11
      • 2020-03-04
      相关资源
      最近更新 更多