Pergunta

Estou trabalhando em um controle de servidor do cliente que estende outro controle.Não há problema em anexar outros controles no formulário.

em vb.net: Parent.FindControl(TargetControlName)

Gostaria de passar um método para o controle na marcação ASPX.

por exemplo: <c:MyCustomerControl runat=server InitializeStuffCallback="InitializeStuff">

Então, tentei usar a reflexão para acessar o nome do método fornecido no pai.

Algo como (em 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")

O método não foi encontrado porque simplesmente não faz parte da página.Para onde devo procurar?Tenho quase certeza de que isso é possível porque vi outros controles fazerem algo semelhante.


Esqueci de mencionar que minha solução alternativa é fornecer os eventos de controle e anexar a eles no Code-behind.

Foi útil?

Solução

Se você quiser passar um método na marcação ASPX, você precisa usar o método Browsable atributo em seu código no evento.

VB.NET

<Browsable(True)> Public Event InitializeStuffCallback

C#

[Browsable(true)]
public event EventHandler InitializeStuffCallback;

Referência:Atributos de tempo de design para componentes e Classe BrowsableAttribute

Todos os eventos, propriedades ou o que quer que seja, precisam estar no code-behind do controle com o atributo navegável para que você possa alterá-lo no código da tag.

Outras dicas

Normalmente você não precisaria obter o método via reflexão.Dentro do seu controle de usuário, defina um evento público (desculpe, não conheço a sintaxe vb, então será em c#)

public event EventHandler EventName;

Agora, dentro da sua página aspx, ou qualquer contêiner do controle de usuário, defina um método protegido que corresponda ao EventHandler:

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

Agora, dentro da sua marcação, você pode usar

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

Sua solução alternativa é na verdade a melhor resposta.Se você tiver código que deve ser executado em uma determinada parte do ciclo de vida do seu controle, você deve expor eventos para permitir que o contêiner estenda o ciclo de vida com funcionalidade personalizada.

buyutec e Jesse Dearing têm uma resposta aceitável.

[Browsable(true)]  

permite que você veja a propriedade na janela Propriedades.Porém, o evento não aparece, o que para mim não faz diferença.

O que esqueci anteriormente foi o fato de que quando você faz referência a um controle a partir da tag, ele termina em On.

Cada página ASP.NET é classe própria Herdado de Page como em:

class MyPage : Page

Portanto, para encontrar esse método via Reflection, você deve obter o tipo correto, que é o tipo da classe da página que armazena o código da página.

Suponho que você precise suportar múltiplas páginas para que esse controle seja instanciado. Acredito que você possa encontrar o tipo filho de qualquer instância de Page via Reflection, mas não me lembro como, mas você deve conseguir fazer isso.

mas...como todo mundo disse, esse caso é o que eventos são para.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top