Asp.net 如何将事件处理程序附加到嵌套的自定义用户控件?图书管理系统

Asp.net 如何将事件处理程序附加到嵌套的自定义用户控件?图书管理系统,asp.net,vb.net,events,gridview,user-controls,Asp.net,Vb.net,Events,Gridview,User Controls,这是我的情况。我有一个gridview(gridview1),每行嵌套一个自定义用户控件(UC1)。自定义用户控件有一个名为“TaskChanged”的自定义公共事件,单击按钮时会引发该事件。在父页面(default.aspx)上,我试图访问要将事件处理程序附加到的用户控件,但没有成功。这是我试图做到的 在父页面上: Protected Sub GridViewTasks_RowDataBound(sender As Object, e As System.Web.UI.WebControls

这是我的情况。我有一个gridview(gridview1),每行嵌套一个自定义用户控件(UC1)。自定义用户控件有一个名为“TaskChanged”的自定义公共事件,单击按钮时会引发该事件。在父页面(default.aspx)上,我试图访问要将事件处理程序附加到的用户控件,但没有成功。这是我试图做到的

在父页面上:

 Protected Sub GridViewTasks_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridViewTasks.RowDataBound
 If e.Row.RowType = DataControlRowType.DataRow Then
        'Get the User Control
        Dim Uc As UserControl = e.Row.FindControl("TaskResourceAssignment")
        'Attatch event handler
        AddHandler Uc.TaskChanged, AddressOf Uc_OnTaskChanged


    End If
End Sub
问题在于,在这条线上:

AddHandler Uc.TaskChanged, AddressOf Uc_OnTaskChanged
它找不到控件的“TaskChanged”事件(Uc.TaskChanged获取它下面的曲线),运行该页面只会抛出一个错误。我记得一个朋友能够做到这一点,但他将他的用户控件转换为一个对象,并能够访问它。我试过了,运气不好


自定义控件正在引发事件而不是冒泡事件。我可以通过冒泡事件让它工作,但我真的希望通过将事件处理程序附加到控件来实现。帮助任何人???

您需要将用户控件显式转换为特定的控件,因为常规的
UserControl
没有
TaskChanged
事件

像这样的-

Dim Uc = TryCast(e.Row.FindControl("TaskResourceAssignment"), 
   TaskResourceAssignment)

问题是UserControl没有TaskChanged事件。FindControl返回的类型控件也没有

您的朋友将该控件强制转换为特定控件,以便能够附加正确的事件

在本例中,我相信您正在查找ITaskService.OnTaskChanged事件。所以我想试试这个:

Protected Sub GridViewTasks_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridViewTasks.RowDataBound
 If e.Row.RowType = DataControlRowType.DataRow Then
        'Get the User Control
        Dim Uc As UserControl = DirectCast(e.Row.FindControl("TaskResourceAssignment"), ITaskService)
        'Attatch event handler
        AddHandler Uc.OnTaskChanged, AddressOf Uc_OnTaskChanged


    End If
End Sub

我喜欢用
Trycast
做这种工作。将
MyUserControl
替换为您的UserControl的名称

Protected Sub GridViewTasks_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridViewTasks.RowDataBound
  If e.Row.RowType = DataControlRowType.DataRow Then
    'Get the User Control
    Dim Uc As MyUserControl = TryCast(e.Row.FindControl("TaskResourceAssignment"), ITaskService)
    If Not Uc Is Nothing Then
      AddHandler Uc.OnTaskChanged, AddressOf Uc_OnTaskChanged
    End If
  End If
End Sub

事件是否标记为
朋友
公共
?因此可以在此处访问它。它标记为Public:Public Event TaskChanged As System.eventhandler尝试将类型-Dim Uc转换为UserControl=TryCast(e.Row.FindControl(“TaskResourceAssignment”),UserControl)…类型必须是用户控件的确切名称。感谢jtseng,但我想提出一个定制的活动,而不一定是现有的。通过将强制类型更改为类名,我能够找到控件的事件。谢谢Win,这是我问题的解决方案。一旦我将类型名更改为类名,一切都正常了。谢谢!!