0

这是我的情况。我有一个 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 得到它下面的波浪线),运行页面只会抛出错误。我记得一个朋友能够做到这一点,但他将他的用户控件转换为一个对象并且能够访问它。我试过没有运气。

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

4

3 回答 3

0

您需要明确地将用户控制权转换为特定的,因为常规UserControl没有TaskChanged事件。

像这样的东西-

Dim Uc = TryCast(e.Row.FindControl("TaskResourceAssignment"), 
   TaskResourceAssignment)
于 2013-06-27T17:01:57.173 回答
0

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

您的朋友将 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
于 2013-06-27T17:05:18.747 回答
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
于 2013-06-27T18:11:14.997 回答