我有一个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