这是我的情况。我有一个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获取其下的波浪线),并且运行该页面只会引发错误。我记得有一个朋友可以做到这一点,但他把他的用户控件作为一个对象并且能够访问它。我试过没有运气。
自定义控件正在引发事件而不是冒泡事件。我可以通过冒泡事件让它工作,但我真的想通过将事件处理程序附加到控件来实现。帮助任何人??
答案 0 :(得分:0)
您需要明确地将用户控件强制转换为特定的控件,因为常规UserControl
没有TaskChanged
事件。
像这样 -
Dim Uc = TryCast(e.Row.FindControl("TaskResourceAssignment"),
TaskResourceAssignment)
答案 1 :(得分:0)
问题是UserControl没有TaskChanged事件。类型Control也没有,FindControl返回。
您的朋友将Control转换为特定控件,以便能够附加正确的事件。
在这种情况下,我相信您正在寻找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
答案 2 :(得分:0)
我喜欢将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