获取事件的控件名称

8
在我的C# Windows Forms表单中,我有一些动态生成的按钮。我在点击事件上分配了以下方法。是否可能从触发事件的按钮获取按钮的名称?
private void btnBrowsDoc_Click(object sender, EventArgs e)
{
    try
    {
        if (openFileDialog1.ShowDialog().Equals(DialogResult.OK))
        {
            gbxDocument.Controls["txtDocument" + count].Text =
                openFileDialog1.FileName;
        }
        else
        {
            return;
        }
    }
    catch (Exception ex)
    {
        //handle the exception
    }
}

2
为什么要使用 try...catch?- 这通常是一种相当糟糕的编程风格,特别是如果您没有评估捕获的异常。 - Uwe Keim
1
@ Uwe Keim:我正在使用文本文件处理异常...在这里添加时,我只是删除了那行代码... - Nithesh Narayanan
2个回答

45
你可以使用 sender 参数,它指的是触发点击事件的控制元件(在这个例子中就是按钮):
var button = (Button)sender;
button.Name ...

注意:如果您已经订阅了其他控件(例如面板等)到同一个事件处理程序,您可以使用 as 运算符来检查发送者是否为按钮:

var button = sender as Button;
if (button != null)
{
    button.Name ...
    ...
}

在 N.B. 部分,我认为最好使用 'is' 参数进行检查,然后执行操作。否则,您将无法再次转换发送器。例如,如果 (sender is Button) return (sender as button).Name; else if (sender is Panel) return (sender as Panel).Name; 等等。 - Maverick Meerkat
@DavidRefaeli:这真的取决于你需要什么。如果你只需要检查是否为按钮,我会坚持使用 as,但这是个人偏好的问题。 - digEmAll

5
事件处理程序的第一个参数 "object sender" 包含引发/触发事件的对象/控件的引用。
var button = sender as Button;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接