Question

Je travaille sur un contrôle serveur client qui étend un autre contrôle.Il n’y a aucun problème à s’attacher à d’autres contrôles du formulaire.

dans vb.net : Parent.FindControl(TargetControlName)

Je voudrais transmettre une méthode au contrôle dans le balisage ASPX.

Par exemple: <c:MyCustomerControl runat=server InitializeStuffCallback="InitializeStuff">

J'ai donc essayé d'utiliser la réflexion pour accéder au nom de méthode donné à partir du parent.

Quelque chose comme (en 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")

La méthode est introuvable, car elle ne fait tout simplement pas partie de la page.Où dois-je chercher ?Je suis presque sûr que cela est possible car j'ai vu d'autres contrôles faire de même.


J'ai oublié de mentionner que ma solution consiste à donner les événements de contrôle et à les attacher dans le Code-behind.

Était-ce utile?

La solution

Si vous souhaitez pouvoir passer une méthode dans le balisage ASPX, vous devez utiliser le Browsable attribut dans votre code sur l'événement.

VB.NET

<Browsable(True)> Public Event InitializeStuffCallback

C#

[Browsable(true)]
public event EventHandler InitializeStuffCallback;

Référence:Attributs au moment du design pour les composants et Classe BrowsableAttribute

Tous les événements, propriétés ou tout autre élément doivent être dans le code-behind du contrôle avec l'attribut consultable pour que vous puissiez le modifier dans le code de la balise.

Autres conseils

Normalement, vous n'auriez pas besoin d'obtenir la méthode par réflexion.Dans votre contrôle utilisateur, définissez un événement public (désolé, je ne connais pas la syntaxe vb donc ce sera en c#)

public event EventHandler EventName;

Maintenant, dans votre page aspx, ou dans n'importe quel conteneur du contrôle utilisateur, définissez une méthode protégée qui correspond à EventHandler :

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

Maintenant, dans votre balisage, vous pouvez utiliser

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

Votre solution de contournement est en fait la meilleure réponse.Si vous avez du code que vous devez exécuter à une certaine partie du cycle de vie de votre contrôle, vous devrait exposez des événements pour permettre au conteneur de prolonger le cycle de vie avec des fonctionnalités personnalisées.

buyutec et Jesse Dearing ont tous deux une réponse acceptable.

[Browsable(true)]  

vous permet de voir la propriété dans la fenêtre Propriétés.Cependant, l'événement n'apparaît pas, ce qui ne fait aucune différence pour moi.

La chose que j'ai négligée plus tôt était le fait que lorsque vous faites référence à un contrôle même à partir de la balise, il se termine par On.

Chaque page ASP.NET est classe à part hérité de Page un péché:

class MyPage : Page

Par conséquent, pour trouver cette méthode via Reflection, vous devez obtenir le type correct, qui est le type de la classe de page qui stocke le code de la page.

Je suppose que vous devez prendre en charge plusieurs pages pour que ce contrôle soit instancié. Je pense que vous pouvez trouver le type enfant de n'importe quelle instance de Page via Reflection, mais je ne me souviens pas comment, mais vous devriez pouvoir le faire.

mais...comme tout le monde l'a dit, c'est ce genre de cas événements sont pour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top