Domanda

Sto lavorando su un controllo del server del cliente che estende un altro controllo.Non vi è alcun problema con l'associazione ad altri controlli nel modulo.

su vb.net: Parent.FindControl(TargetControlName)

Vorrei passare un metodo al controllo nel markup ASPX.

Per esempio: <c:MyCustomerControl runat=server InitializeStuffCallback="InitializeStuff">

Quindi, ho provato a utilizzare la riflessione per accedere al nome del metodo indicato dal Parent.

Qualcosa come (in 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")

Il metodo non è stato trovato perché semplicemente non fa parte di Page.Dove dovrei cercare?Sono abbastanza sicuro che ciò sia possibile perché ho visto altri controlli fare simili.


Ho dimenticato di menzionare che la mia soluzione è fornire gli eventi di controllo e allegarli nel Code-behind.

È stato utile?

Soluzione

Se vuoi essere in grado di passare un metodo nel markup ASPX, devi utilizzare il file Browsable attributo nel codice dell'evento.

VB.NET

<Browsable(True)> Public Event InitializeStuffCallback

C#

[Browsable(true)]
public event EventHandler InitializeStuffCallback;

Riferimento:Attributi in fase di progettazione per i componenti E Classe BrowsableAttribute

Tutti gli eventi, le proprietà o qualsiasi altra cosa devono essere nel code-behind del controllo con l'attributo browsable per poterlo modificare nel codice del tag.

Altri suggerimenti

Normalmente non avresti bisogno di ottenere il metodo tramite riflessione.All'interno del tuo controllo utente, definisci un evento pubblico (mi dispiace, non conosco la sintassi vb, quindi sarà in C#)

public event EventHandler EventName;

Ora, all'interno della tua pagina aspx, o qualunque contenitore del controllo utente, definisci un metodo protetto che corrisponda a EventHandler:

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

Ora, all'interno del tuo markup, puoi utilizzare

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

La tua soluzione alternativa è in realtà la risposta migliore.Se hai del codice che devi eseguire in una determinata parte del ciclo di vita del tuo controllo, tu Dovrebbe esporre eventi per consentire al contenitore di estendere il ciclo di vita con funzionalità personalizzate.

buyutec e Jesse Dearing hanno entrambi una risposta accettabile.

[Browsable(true)]  

ti consente di vedere la proprietà nella finestra Proprietà.Tuttavia, l'evento non viene visualizzato, il che per me non fa alcuna differenza.

La cosa che ho trascurato prima era il fatto che quando fai riferimento a un controllo anche dal tag, la fine è impostata su On.

Ogni pagina ASP.NET lo è classe propria ereditato da Page come in:

class MyPage : Page

Pertanto, per trovare quel metodo tramite Reflection, è necessario ottenere il tipo corretto, ovvero il tipo della classe della pagina che memorizza il codice della pagina.

Suppongo che sia necessario supportare più pagine affinché questo controllo venga istanziato. Credo che tu possa trovare il tipo figlio di qualsiasi istanza di Page tramite Reflection, ma non ricordo come, ma dovresti essere in grado di farlo.

Ma...come tutti gli altri hanno detto, questo caso è cosa eventi sono per.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top