如何将事件处理程序附加到嵌套的自定义用户控件? VB.net

时间:2013-06-27 16:32:29

标签: 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.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获取其下的波浪线),并且运行该页面只会引发错误。我记得有一个朋友可以做到这一点,但他把他的用户控件作为一个对象并且能够访问它。我试过没有运气。

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

3 个答案:

答案 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