是否有任何情况我宁愿使用控件'事件处理程序的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;
}
有没有任何好处?
答案 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;
}
}