2008-08-28 3 views
1

Я работаю над контроллером сервера клиентов, который расширяет другой элемент управления. Нет проблем с подключением к другим элементам управления в форме.Как передать имя метода пользовательскому серверному управлению в asp.net?

в vb.net: Parent.FindControl(TargetControlName)

Я хотел бы передать метод управления в разметке ASPX.

, например: <c:MyCustomerControl runat=server InitializeStuffCallback="InitializeStuff">

Итак, я попытался с помощью отражения доступ к данному имени метода из Родителя.

Нечто подобное (в VB)

Dim pageType As Type = Page.GetType 
Dim CallbackMethodInfo As MethodInfo = pageType.GetMethod("MethodName") 

'Also tried 
sender.Parent.GetType.GetMethod("MethodName") 
sender.Parent.Parent.GetType.GetMethod("MethodName") 

Метод не найден, потому что он просто не обособленно страницы. Где я должен искать? Я уверен, что это возможно, потому что я видел, что другие элементы управления аналогичны.


Я забыл упомянуть, что мой рабочий процесс - дать контроль над событиями и привязать их к коду.

ответ

2

Если вы хотите иметь возможность передать метод в разметке ASPX, вам необходимо использовать атрибут Browsable в вашем коде события.

VB.NET

<Browsable(True)> Public Event InitializeStuffCallback 

C#

[Browsable(true)] 
public event EventHandler InitializeStuffCallback; 

Ссылка: Design-Time Attributes for Components и BrowsableAttribute Class

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

0

Ваше обходное решение - на самом деле лучший ответ. Если у вас есть код, который вы должны запустить в определенной части жизненного цикла вашего элемента управления, вы должны должны выставить события, чтобы контейнер расширял жизненный цикл с помощью пользовательских функций.

+0

Это все еще возможно. Он просто позволяет настроить его из тега управления вместо того, чтобы делать это из кода. –

2

Обычно вам не нужно получать метод с помощью отражения. Внутри вашего пользовательского элемента управления, определить публичное мероприятие (жаль, что я не знаю синтаксис VB, так что это будет в C#)

public event EventHandler EventName; 

Теперь внутри вашей страницы ASPX, или любой другой контейнер пользовательского элемента управления, определить защищенный метод, который соответствует EventHandler:

protected void MyCustomerControl_MethodName(object sender, EventArgs e) { } 

Теперь внутри вашей разметки, вы можете использовать

<c:MyCustomerControl id="MyCustomerControl" runat=server OnEventName="MyCustomerControl_MethodName"> 
0

Каждый ASP.NET страница класса своих унаследовали от Page как в:

class MyPage : Page 

Поэтому, чтобы найти этот метод с помощью отражения, вы должны получить правильный тип, который является типом класса страницы, которая хранит страницу код.

Я предполагаю, что вам нужно поддерживать несколько страниц для этого элемента управления, который должен быть создан. Я считаю, что вы можете найти дочерний тип любого экземпляра страницы через Reflection, но я не помню, как, но вы должны это сделать ,

но ... как и все остальные сказал, такой случай - это то, что события для.

0

buyutec и Jesse Dearing оба имеют приемлемый ответ.

[Browsable(true)] 

позволяет увидеть свойство в окне свойств. Однако событие не появляется, что не имеет для меня никакого значения.

То, что я упускал из виду ранее, заключалось в том, что когда вы ссылаетесь на элемент управления даже из тега, он готовится к включению.

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