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

本文关键字:控件 什么 参数 sender 访问 使用 | 更新日期: 2023-09-27 18:10:16

是否有任何情况下,我应该更愿意使用控件的事件处理程序的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;
    }

有什么好处吗?

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

正如LarsTech在评论中指出的,如果你有多个" click "被同一个函数处理,使用sender可以有利于防止重复代码。

糟糕的例子,但是如果你有:

<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个处理程序做同样的事情,但每个单独的按钮。

此外,当在repeatersdatagrid中使用controls时,您不一定能够直接通过其名称访问control,在这种情况下,sender可能比尝试通过行索引强制转换它更有吸引力。

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

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

在某个地方为控件的事件附加一个处理程序。

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);

那么这样使用:

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;
    }
}