2016-02-16 2 views
0

У меня есть пользовательский элемент управления ASCX, который используется примерно на 60 страницах веб-форм. Этот элемент управления в основном предоставляет серию вложенных выпадающих списков.Переопределить метод управления ASCX на родительской странице

Внутри управления, метод для заполнения окончательного списка, как это:

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 меню Intellisense не содержат никаких ссылок на пользовательском элемент управления, или метод , Я предполагаю, что это происходит потому, что на самом деле элемент управления не наследуется страницей?

Это возможно, или есть другой способ пожалуйста?

ответ

1

Вы не можете «переопределить» метод на родительской странице, потому что страница не наследуется от класса вашего элемента управления.

Возможно, вы можете создать обработчик событий или передать делегат, чтобы изменить поведение метода.

Например:

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 

Выборочная ARGS событий класса:

Public Class MyCustomEventArgs 
    Inherits EventArgs 

    Public Property Handled As Boolean 
    Public Property ListObject As DropDownList 
End Class 

Handled на странице:

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 
+0

Это интересно спасибо. Я не знал, что это можно сделать. Единственная проблема заключается в том, что 'PopulateList' вызывается внутри элемента управления, поэтому мне нужно будет разрешить заполнение списка, а затем вручную вызвать его снова из страницы (I * think *), чтобы заменить ListItems новыми. – EvilDr

+0

В этом случае создайте свойство и установите это свойство на своей странице где-нибудь на жизненном цикле (возможно, инициализируйте), прежде чем ваш контроль вызовет PopulationList. Тогда ваш метод PopulateList будет использовать свойство вместо параметра. Но вы должны убедиться, что он установлен до вызова PopulateList. – Eric

+0

Или, как я упоминал в своем сообщении, вы можете использовать Событие. Поднимите событие, чтобы получить нужный источник данных и все, что требуется для создания вашего настраиваемого списка. Я вскоре обновлю свой пример – Eric

Смежные вопросы