C# 为什么要将事件的发送者强制转换为控件类型?

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

我是ASP.NET开发新手,我试图理解为什么在处理事件处理时需要对象转换

我在阅读《ASP.NET4释放版》时偶然发现了这段代码,但我根本不理解它的用途。我无法通过以下方法了解演员阵容的要点:

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