Asp.net 如何将事件处理程序附加到嵌套的自定义用户控件?图书管理系统
这是我的情况。我有一个gridview(gridview1),每行嵌套一个自定义用户控件(UC1)。自定义用户控件有一个名为“TaskChanged”的自定义公共事件,单击按钮时会引发该事件。在父页面(default.aspx)上,我试图访问要将事件处理程序附加到的用户控件,但没有成功。这是我试图做到的 在父页面上: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
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,这是我问题的解决方案。一旦我将类型名更改为类名,一切都正常了。谢谢!!