如何确定哪个按钮称为事件处理程序?

时间:2010-11-05 17:14:16

标签: c# winforms

我有一个带有两个按钮的表单:btn_oldFile和btn_newFile。点击两个按钮调用函数btnOnClick:

btn_oldFile.Click += btnOnClick;
btn_newFile.Click += btnOnClick;

protected void OldFileBrowse_Click(object sender, EventArgs args)
        {
            //if btn_oldFile called
                // print to tbx_OldFile
            //else
                //print to tbx_NewFile
        }

在大多数情况下,除了为变量赋值之外,btnOnClick都是做同样的事情,无论哪个按钮自己调用。如果btn_oldFile调用该方法,我将一些文本打印到文本框:tbx_OldFile,而如果btn_newFile调用它,则文本将打印到tbx_NewFile。

如何确定哪个按钮是调用该方法的按钮?

3 个答案:

答案 0 :(得分:9)

引发事件的对象作为sender参数传递给事件处理程序,因此您可以将其强制转换为正确的类型以进行访问。

protected void OldFileBrowse_Click(object sender, EventArgs args)
{
    Button btn = (Button)sender;
}

编辑:然后您可以使用基本的if语句来检查它是哪个按钮。

if (btn == btn_oldFile) // etc..

答案 1 :(得分:2)

您需要检查发件人是否为btn_oldFile或btn_newFile。

你可以这样做:

if (sender == btn_oldFile)
{ // print to tbx_oldFile }
else
{ // blah }

答案 2 :(得分:0)

正如Fara指出发生点击时,导致点击的Button将成为第一个参数。但是,此解决方案需要强制转换,并且可以通过调用该方法的派生类型进行挫败,而不是在Button插槽中传递sender类型。

更加类型安全的方法是使用lambda表达式以类型安全的方式传递相关按钮。

btn_oldFile.Click += delegate { OldFileBrowse_Click(btn_oldFile); };
btn_newFile.Click += delegate { OldFileBrowse_Click(btn_newFile); };

protected void OldFileBrowse_Click(Button sender) {
  //if btn_oldFile called 
    // print to tbx_OldFile 
  //else 
    //print to tbx_NewFile 
}