C# 为什么要将事件的发送者强制转换为控件类型?
我是ASP.NET开发新手,我试图理解为什么在处理事件处理时需要对象转换 我在阅读《ASP.NET4释放版》时偶然发现了这段代码,但我根本不理解它的用途。我无法通过以下方法了解演员阵容的要点:C# 为什么要将事件的发送者强制转换为控件类型?,c#,asp.net,visual-studio,casting,C#,Asp.net,Visual Studio,Casting,我是ASP.NET开发新手,我试图理解为什么在处理事件处理时需要对象转换 我在阅读《ASP.NET4释放版》时偶然发现了这段代码,但我根本不理解它的用途。我无法通过以下方法了解演员阵容的要点: protected void Button_Click(object sender, EventArgs e) { Button btn = (Button)sender; btn.Text = (Int32.Parse(btn.Text) + 1).ToString(); } HTM
protected void Button_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;
btn.Text = (Int32.Parse(btn.Text) + 1).ToString();
}
HTML如下所示:
First Counter:
<asp:Button
id=”Button1”
Text=”0”
OnClick=”Button_Click”
Runat=”server” />
<br /><br />
Second Counter:
<asp:Button
id=”Button2”
Text=”0”
OnClick=”Button_Click”
Runat=”server” />
第一个计数器:
第二个柜台:
我不明白将
btn
转换为按钮的意义。有人能解释一下吗?在您了解C#事件
关键字和委托
类型之前,您很难完全理解这里的推理。也就是说
请注意,方法声明中的sender
参数的类型为object
。这是由于.NET中事件的标准模式:委托类型始终使用对象
参数作为委托签名的第一个参数
通过这种方式,可以将少量委托类型重新用于各种各样的事件。最常用的委托类型可能是EventHandler
,您可以在任意数量的类中的各种事件上找到它(在.NET中有数百个,如果不是1000个或更多的话)
方法签名只使用对象
,而不是让框架包含每个可能发送者的委托类型。然后由事件处理程序(例如,您的按钮\u Click()
方法)将该对象
引用转换为预期的实际类型
请注意,在许多情况下,事件处理程序根本不需要使用sender
参数。要么它只附加到一个事件,在一个可以通过类中的实例字段引用的对象上,要么它根本不需要发送对象来处理该事件(对于Click
events非常常见…此处需要按钮
对象的唯一原因是,事件处理程序是一个人为的示例,用于您正在阅读的引用).在了解C#事件
关键字和委托
类型之前,您将很难完全理解此处的推理。也就是说
请注意,方法声明中的sender
参数的类型为object
。这是由于.NET中事件的标准模式:委托类型始终使用object
参数作为委托签名的第一个参数
通过这种方式,可以将少量委托类型重新用于各种事件。最常用的委托类型可能是EventHandler
,也就是说,您可以在任何数量的类中的各种事件上找到它(在.NET中有数百个,如果不是一千个或更多的话)
方法签名只使用对象
,而不是让框架为每个可能的发送者包含委托类型。然后由事件处理程序(例如,您的按钮单击()
方法)将该对象
引用转换为预期的实际类型
请注意,在许多情况下,事件处理程序根本不需要使用sender
参数。要么它仅附加到单个事件,对象上可以通过类中的实例字段引用,要么根本不需要发送对象来处理事件(对于Click
events非常常见…此处需要按钮
对象的唯一原因是,事件处理程序是一个人为的示例,用于您正在阅读的引用).在了解C#事件
关键字和委托
类型之前,您将很难完全理解此处的推理。也就是说
请注意,方法声明中的sender
参数的类型为object
。这是由于.NET中事件的标准模式:委托类型始终使用object
参数作为委托签名的第一个参数
通过这种方式,可以将少量委托类型重新用于各种事件。最常用的委托类型可能是EventHandler
,也就是说,您可以在任何数量的类中的各种事件上找到它(在.NET中有数百个,如果不是一千个或更多的话)
方法签名只使用对象
,而不是让框架为每个可能的发送者包含委托类型。然后由事件处理程序(例如,您的按钮单击()
方法)将该对象
引用转换为预期的实际类型
请注意,在许多情况下,事件处理程序根本不需要使用sender
参数。要么它仅附加到单个事件,对象上可以通过类中的实例字段引用,要么根本不需要发送对象来处理事件(对于Click
events非常常见…此处需要按钮
对象的唯一原因是,事件处理程序是一个人为的示例,用于您正在阅读的引用).在了解C#事件
关键字和委托
类型之前,您将很难完全理解此处的推理。也就是说
请注意,方法声明中的sender
参数的类型为object
。这是由于.NET中事件的标准模式:委托类型始终使用object
参数作为委托签名的第一个参数
通过这种方式可以将少量委托类型重新用于各种各样的事件。最常用的委托类型可能是EventHandler
,您会发现
Private Sub gvSomeGridView_RowDataBound(sender As Object, e As GridViewCommandEventArgs) Handles gvSomeGridView.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim this As GridView = sender
Dim drv As DataRowView = e.Row.DataItem
Dim dk as DataKey = this.DataKeys( e.Row.RowIndex )
Dim lbl as WebControl = e.Row.FindControl("SomeLabel") // <asp:Label ID="SomeLabel">
// AttributeCollection is common to all WebControls
lbl.Attributes("data-rowidx") = e.Row.RowIndex
lbl.Attributes("data-whatever") = dk.Value
// Now here an explicit Cast in required
DirectCast(lbl, Label).Text = drv("SomeFieldName")
...
End If
End Sub