重写父页中的 ASCX 控件方法



我有一个ASCX用户控件,该控件正在大约60个Web表单页面中使用。 此控件基本上呈现一系列嵌套下拉列表。

在控件内部,填充最终列表的方法如下所示:

Public Sub PopulateList()
   Dim dt as DataTable = MyDAL.GetListValues()
   For each dr as DataRow in dt.Rows
      Dim li as new ListItem
      ' ... 
      myDDL.Items.Add(li)
   Next
End Sub

在少数几个页面中,我需要此方法的工作方式略有不同(列表项填充了来自不同表的更多详细信息(。

控件的父页是否有可能以某种方式重写该方法? 我在各种 MSDN 页面上阅读了有关覆盖的信息,但无法弄清楚这一点。 我可以将该方法声明为...

 Public Overridable Sub PopulateList()

。但是在VS2015中,当我尝试使用Public Overrides创建重写方法时,智能感知菜单不包含对用户控件或方法的任何引用。 我认为这是因为控件实际上并没有被页面继承?

这是可以做到的,还是有其他方法?

不能"重写"父页中的方法,因为该页不会继承自控件的类。

您可以创建事件处理程序,或传入委托来修改方法的行为。

例如:

Public Class Test1
    Dim t2 As New Test2
    Sub New()
        ' Call populateList with an action handler
        t2.PopulateList(Sub(ddl)
                        ' Do your logic here
                        Dim dt As DataTable = MyDAL.GetListValues()
                        For Each dr As DataRow In dt.Rows
                            Dim li As New ListItem
                            ' ... 
                            ddl.Items.Add(li)
                        Next
                    End Sub)
    End Sub

End Class
Public Class Test2
    Public Sub PopulateList(Optional handler As Action(Of DropDownList) = Nothing)
        If handler Is Nothing Then
            ' Default behavior
            Dim dt As DataTable = MyDAL.GetListValues()
            For Each dr As DataRow In dt.Rows
                Dim li As New ListItem
                ' ... 
                myDDL.Items.Add(li)
            Next
        Else
            ' Invoke action handler and pass a reference to the dropdown you want to add items to
            handler(myDDL)
        End If
    End Sub
End Class

使用事件的示例:

Event MyCustomEvent As EventHandler(Of MyCustomEventArgs)
Public Sub PopulateList()
    Dim args As New MyCustomEventArgs()
    args.ListObject = myDDL
    RaiseEvent MyCustomEvent(Me, args)
    ' Do default behavior if not handled by event code
    If Not args.Handled Then
        Dim dt As DataTable = MyDAL.GetListValues()
        For Each dr As DataRow In dt.Rows
            Dim li As New ListItem
            ' ... 
            myDDL.Items.Add(li)
        Next
    End If

End Sub

自定义事件参数类:

Public Class MyCustomEventArgs
    Inherits EventArgs
    Public Property Handled As Boolean
    Public Property ListObject As DropDownList
End Class

在您的页面上处理:

Protected Sub MyControl_MyCustomEvent(sender As Object, e As MyCustomEventArgs) Handles MyControl.MyCustomEvent
    e.Handled = True
    ' Do work on your list
    Dim mylist = e.ListObject

End Sub

最新更新