使用sender参数而不是直接访问所需控件有什么好处

时间:2015-08-27 14:40:56

标签: c# winforms

是否有任何情况我宁愿使用控件'事件处理程序的sender参数而不是直接访问所需控件?

所以而不是

    private void okButton_Click(object sender, EventArgs e)
    {
      okButton.Enabled = false;
    }

我应该使用

    private void okButton_Click(object sender, EventArgs e)
    {
      (sender as Button).Enabled = false;
    }

有没有任何好处?

2 个答案:

答案 0 :(得分:4)

正如LarsTech在评论中指出的,如果你有多个“点击”由同一个功能处理,使用发送者可以有利于防止重复的代码。

可怕的例子,但如果你有:

<asp:Button ID="Button1" runat="server" Text="Not Clicked" OnClick="Button_Click" />
<asp:Button ID="Button2" runat="server" Text="Not Clicked" OnClick="Button_Click" />
<asp:Button ID="Button3" runat="server" Text="Not Clicked" OnClick="Button_Click" />

你的经纪人:

protected void Button_Click(object sender, EventArgs e)
{
  (sender as Button).Text = "Totes clicked";
}

vs有3个处理程序执行相同的操作,但对于每个单独的按钮。

此外,在controls内或repeaters内使用datagrid时,您无需直接通过其名称访问control实例像这样sender可能比尝试按行索引强制转换它更具吸引力。

答案 1 :(得分:1)

主要用途是使用一个处理程序方法来处理多个对象的事件。这样,您可以将代码集中在一个中心方法中。

另一种用法是在运行时创建控件并为其分配事件处理程序。在这种情况下,您必须使用此方法。

某处将处理程序附加到控件的事件上。

this.NewToolStripButton.Click += new System.EventHandler(this.ToolStripButton_Click);
this.EditToolStripButton.Click += new System.EventHandler(this.ToolStripButton_Click);
this.DeleteToolStripButton.Click += new System.EventHandler(this.ToolStripButton_Click);
this.DetailsToolStripButton.Click += new System.EventHandler(this.ToolStripButton_Click);

Thene以这种方式使用它:

private void ToolStripButton_Click(object sender, EventArgs e)
{
    var toolstripItem = sender as ToolStripItem;
    if (toolstripItem == null)
        return;

    switch(toolstripItem.Name)
    {
        case "NewToolStripItem":
            //Do New stuff here
            break;
        case "EditToolStripItem":
            //Do Edit stuff here
            break;
        case "DeleteToolStripItem":
            //Do Delete stuff here
            break;
        case "DetailsToolStripItem":
            //Do Details stuff here
            break;
        default:
            break;
    }
}