2 Stimmen

Wie greift man auf die Felder und Methoden einer Benutzersteuerung zu, ohne die Steuerung zu registrieren?

Ich habe ein ASP.Net-Projekt, das so eingerichtet ist, dass es einfach in jede Website eingefügt und "einfach funktioniert". Alle Pfade sind relativ zur aktuellen Datei, nicht relativ zum "~". Die Pfade werden durch ThePath = this.TemplateSourceDirectory bestimmt;

Dies funktioniert für alles, außer beim Registrieren eines benutzerdefinierten Steuerelements, das erstellt und einer der Seiten hinzugefügt wurde. Ich kann das Steuerelement problemlos mit Page.LoadControl hinzufügen, aber ich kann es nicht als den richtigen Typ casten, um auf irgendetwas zuzugreifen.

Wie kann ich eine Referenz zur Klasse innerhalb des Codes selbst hinzufügen?

2voto

Rex M Punkte 138455

Wenn Sie den spezifischen Typ der Steuerung nicht im Voraus kennen, ist dies nicht möglich. Die Klasse muss von UserControl abgeleitet sein, damit Sie sie in ein UserControl umwandeln können und Zugriff auf alle Methoden und Eigenschaften dieser Klasse haben. Wenn Sie einige spezielle Informationen oder Funktionalitäten benötigen, die alle Steuerungen haben müssen, und Sie davon ausgehen müssen, dass diese immer vorhanden sind, müssen Sie Ihre eigene Klasse schreiben, die von UserControl abgeleitet ist, und verlangen, dass alle benutzerdefinierten Steuerungen stattdessen davon abgeleitet sind:

// alle benutzerdefinierten Steuerungen müssen von dieser Klasse erben
public abstract class SpecialControlBase : UserControl
{
    public abstract void DoSomethingSpecial();
}

Dann könnten Sie alle Steuerungen zur Laufzeit auf dieses SpecialControlBase umwandeln und Zugriff auf die Methode DoSomethingSpecial haben.

Aber was die spezifischsten Elemente einer zur Laufzeit geladenen Klasse betrifft, denken Sie darüber nach - wenn ich meine eigene Steuerung namens RexsUserControl schreibe und sie in Ihre Anwendung einfüge, gibt es keinen Weg für Sie zu wissen, welche Methoden und Felder ich auf meine Steuerung gesetzt habe, sodass Sie keinen Code schreiben können, der explizit auf diese Elemente verweist.

0 Stimmen

Ich kenne den Typ im Voraus, aber ich kenne den Pfad zur Steuerung im Voraus nicht, um eine Referenz in der .aspx-Datei hinzuzufügen.

0 Stimmen

@Justin warum glaubst du, dass du es auf der ASPX registrieren musst?

0 Stimmen

@Rex M - Der Beitrag von Dakine83 ist ein Beispiel für die Situation, in der ich mich befinde. Src="~/Test/Benutzer/Controls/UserCtrl.ascx" in der Registrierungszeile ist das Problem. Der Pfad ist mir unbekannt, bis zur Laufzeit, wenn ich den Pfad über die Programmierung erhalten kann.

1voto

Dakine83 Punkte 687

Rex M, Wenn Sie die Steuerung auf der ASPX-Seite registrieren, können Sie die Steuerung im Code-Behind casten.

In der ASPX:

<%@ Register TagPrefix="Mine" TagName="Ctrl" Src="~/Test/User/Controls/UserCtrl.ascx" %>

Dann, in der ASPX.CS:

User_Controls_UserCtrl myUserCtrl = LoadControl("~/Test/User/Controls/UserCtrl.ascx");

Wenn Sie die Steuerung jedoch nicht zuerst auf der ASPX registrieren, erhalten Sie diesen Fehler:

CS0246: Der Typ oder Namesraumname "User_Controls_UserCtrl" konnte nicht gefunden werden (fehlt Ihnen eine using-Anweisung oder eine Assembly-Referenz?)

0 Stimmen

Ja, genau das, was ich in meiner Antwort beschrieben habe - Sie müssen den Typ zur Compile-Zeit kennen, um ihn im Code zu referenzieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X