使用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;
}
有什么好处吗?
正如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个处理程序做同样的事情,但每个单独的按钮。
此外,当在repeaters
或datagrid
中使用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;
}
}