2009-04-02 3 views
2

Ich bin ein User Control für jeden Datensatz Hinzufügen gezogen in einem Datenlesegerät auf, hier ist die grundlegende Schleife:Failing Kontrollen zu einer Seite hinzuzufügen dynamisch

while (dr.Read()) 
{ 
    ImageSelect imgSel = new ImageSelect(dr["Name"].ToString()); 
    myPanel.Controls.Add(imgSel); 
} 

Das Problem ist, dass es keine Kontrollen hinzugefügt Die Seite, ich überprüfe die HTML-Ausgabe und dort ist mein Panel, mit nichts drin.

Ich trat sogar durch den Code im Debugger, und verifiziert, dass myPanel.Controls ein Steuerelement in jeder Schleife hinzugefügt, mit der Zählung ist 6, keine Fehler, aber dann werden sie nicht auf der Seite angezeigt.

Ich habe den obigen Code in den Page_Init und Page_Load -Ereignissen ausgeführt, beide mit dem gleichen Ergebnis.

EDIT: Ok, damit ich zur Verwendung von Loadcontrol eingeschaltet haben („.... ascx“) meine Steuer Instanz zu erhalten, die jetzt funktioniert. Aber ursprünglich habe ich auch Daten über den Controls-Konstruktor übergeben. Ist das noch möglich oder muss ich sie nur über get/set setzen?

EDIT 2: Dank Freddy für den Hinweis auf, dass die Loadcontrol eine Überlastung, wo Sie in Konstruktor params siehe akzeptierte Antwort passieren können.

EDIT 3: Nach dem Versuch diese Methode sowohl mit als auch ohne den Konstruktor. Ich habe es besser gefunden, Setter nur für alle Eigenschaften zu verwenden, die das Steuerelement haben soll, anstatt zu versuchen, das übergebene Objektarray für meinen Konstruktor zu verwenden.

+0

@Neil ist es möglich, veröffentlichte ein Update auf meine Antwort. – eglasius

+0

Bedenken Sie, dass diese Überladung nicht auf die gleiche Weise funktioniert wie die andere, daher können Sie Null-Referenz-Ausnahmen erhalten, wenn Sie Designer-Elemente dort haben. Es gibt eine Erweiterungsmethode in meinem Blog, um es bei Bedarf zu umgehen. –

+0

Nachdem ich die bestandenen Params ausprobiert habe, habe ich entschieden, dass Freddies Ratschläge zur Verwendung von Settern ein besserer Weg sind. –

Antwort

4

Update: Wie Steve darauf hingewiesen hat, berücksichtigt die Überladung von LoadControl, die den Typ verwendet, nicht die Steuerelemente in der Ascx. Dies wird auch in dieser Antwort erwähnt: Dynamically Loading a UserControl with LoadControl Method (Type, object[]).

Wie ich bereits erwähnt habe, sind get/set mehr im Einklang mit dem asp.net-Modell, also empfehle ich, das mit der LoadControl-Variante zu verwenden, die den Benutzersteuerpfad empfängt. Allerdings ist die Version von Steve eine interessante Alternative: http://www.grumpydev.com/2009/01/05/passing-parameters-using-loadcontrol/.

Mein Take ist der LoadControl mit Typ ist gedacht, um stattdessen mit benutzerdefinierten Web-Steuerelemente verwendet werden.

Wenn es ein Benutzersteuerelement ist, sollten Sie LoadControl (usercontrolpath) verwenden, um die Instanz des Benutzersteuerelements abzurufen.

Sie können einen Konstruktor verwenden, indem Sie:

var name = dr["Name"].ToString(); 
var imgSel = LoadControl(typeof(ImageSelect), new object[]{ name }); 
myPanel.Controls.Add(imgSel); 

Beachten Sie, dass für das Projekt je nach Modell Sie verwenden, müssen Sie einen Verweis auf die aspx hinzufügen, um es mit dem typeof Variante zu verwenden:

<%@ Reference Control="~/somepath/myusercontrol.ascx" %> 

Ps. Normalerweise verwende ich set/get für Steuerelemente, da ich sie mehr in Übereinstimmung mit dem asp.net-Modell

+0

Können Sie das erweitern? .Load von was? Die Seite? –

+0

@Neil y, aktualisiert es, Speicher fehlgeschlagen, es ist LoadControl und Sie geben den Pfad zum Benutzersteuerelement, wie in: "~/somepath/mycontrol.ascx" – eglasius

+0

ok, hab es, jetzt kann ich Konstruktorparameter LoadControl verwenden, wie in meinem ursprünglichen Beispiel? –

3

finden Um Benutzersteuerelemente hinzuzufügen, müssen Sie die LoadControl-Methode aufrufen, die den Pfad zu der ASCX-Datei übergibt. Sie können sie nicht erstellen, indem Sie nur das Objekt instanziieren, von dem die ASCX-Datei erbt.

Ein UserControl besteht aus dem Markup und der Klasse im Code dahinter.Das Markup enthält eine Verknüpfung zu der Klasse dahinter, aber die Klasse dahinter weiß nicht, wo das Markup lebt und kann daher nicht für sich selbst erstellt werden.

+0

++; Danke für die Erklärung, das macht jetzt Sinn. –