Frage

Ich arbeite an einem Kundenserver-Steuerelement, das ein anderes Steuerelement erweitert.Das Anhängen an andere Steuerelemente im Formular ist kein Problem.

in vb.net: Parent.FindControl(TargetControlName)

Ich möchte dem Steuerelement im ASPX-Markup eine Methode übergeben.

Zum Beispiel: <c:MyCustomerControl runat=server InitializeStuffCallback="InitializeStuff">

Also habe ich versucht, mithilfe von Reflection auf den angegebenen Methodennamen vom übergeordneten Element zuzugreifen.

Etwas wie (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")

Die Methode wird nicht gefunden, da sie einfach nicht Teil der Seite ist.Wo soll ich suchen?Ich bin mir ziemlich sicher, dass dies möglich ist, da ich andere Steuerelemente gesehen habe, die ähnliches tun.


Ich habe vergessen zu erwähnen, dass mein Workaround darin besteht, die Kontrollereignisse anzugeben und sie im Code-Behind anzuhängen.

War es hilfreich?

Lösung

Wenn Sie eine Methode im ASPX-Markup übergeben möchten, müssen Sie die verwenden Browsable Attribut in Ihrem Code für das Ereignis.

VB.NET

<Browsable(True)> Public Event InitializeStuffCallback

C#

[Browsable(true)]
public event EventHandler InitializeStuffCallback;

Referenz:Entwurfszeitattribute für Komponenten Und BrowsableAttribute-Klasse

Alle Ereignisse, Eigenschaften oder was auch immer müssen sich im Code-Behind des Steuerelements mit dem durchsuchbaren Attribut befinden, damit Sie es im Tag-Code ändern können.

Andere Tipps

Normalerweise müssten Sie die Methode nicht über Reflektion erhalten.Definieren Sie in Ihrem Benutzersteuerelement ein öffentliches Ereignis (leider kenne ich die VB-Syntax nicht, daher erfolgt dies in C#).

public event EventHandler EventName;

Definieren Sie nun innerhalb Ihrer ASPX-Seite oder einem anderen Container des Benutzersteuerelements eine geschützte Methode, die dem EventHandler entspricht:

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

Jetzt können Sie es in Ihrem Markup verwenden

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

Ihr Workaround ist tatsächlich die bessere Antwort.Wenn Sie über Code verfügen, den Sie in einem bestimmten Teil des Lebenszyklus Ihres Steuerelements ausführen müssen, sind Sie sollen Stellen Sie Ereignisse bereit, damit der Container den Lebenszyklus mit benutzerdefinierten Funktionen verlängern kann.

Buyutec und Jesse Dearing haben beide eine akzeptable Antwort.

[Browsable(true)]  

ermöglicht es Ihnen, die Eigenschaft im Eigenschaftenfenster anzuzeigen.Allerdings wird das Ereignis nicht angezeigt, was für mich keinen Unterschied macht.

Was ich zuvor übersehen habe, war die Tatsache, dass, wenn Sie ein Steuerelement auch vom Tag aus referenzieren, das Prep-End aktiviert ist.

Jede ASP.NET-Seite ist Klasse für sich geerbt von Page wie in:

class MyPage : Page

Um diese Methode über Reflection zu finden, müssen Sie daher den richtigen Typ ermitteln, nämlich den Typ der Seitenklasse, die den Seitencode speichert.

Ich nehme an, Sie müssen mehrere Seiten unterstützen, damit dieses Steuerelement instanziiert werden kann. Ich glaube, Sie können den untergeordneten Typ jeder Instanz von Page über Reflection finden, aber ich weiß nicht mehr, wie, aber Sie sollten es können.

Aber...Wie alle anderen schon gesagt haben, ist das ein solcher Fall Veranstaltungen sind für.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top