Steuerelemente Hinzugefügt, in der designer sind null, während Page_Load

Alle der unten genannten Namen sind generische und nicht die tatsächlichen Namen verwendet.

Habe ich eine benutzerdefinierte UserControl mit einem Panel enthält ein paar Etiketten, die beiden .aspx-controls.

.aspx:

<asp:Panel runat="server">
    <asp:Label ID="label1" runat="server">
    </asp:Label>
</asp:Panel>
<asp:Panel runat="server">
    <asp:Label ID="label2" runat="server">
    </asp:Label>
</asp:Panel>

Codebehind:

private readonly Object object;
protected void Page_Load(object sender, EventArgs e)
{
    //These are the lines that are failing
    //label1 and label2 are null
    label1.Text = object.Value1;
    label2.Text = object.Value2;
}
public ObjectRow(Object objectToDisplay)
{
    object = objectToDisplay;
}

Auf einer anderen Seite in der code-behind erstelle ich eine neue Instanz des benutzerdefinierten Steuerelements.

protected void Page_Load(object sender, EventArgs e)
{
    Usercontrol control = new UserControl(object);
    Controls.Add(control);
}

Dem Benutzer die Kontrolle übernimmt die parameter und versuche, die Etiketten auf Basis des Objekt übergeben.

Den Etiketten, dass es versucht zu zuweisen, die Werte sind jedoch null.

Ist das ein ASP.net lifecycle Problem, dass ich nicht verstehen? Mein Verständnis basiert auf der Microsoft ASP.net lifecycle-Seite war, dass die Seite Steuerelemente zur Verfügung standen, nachdem die Page_Initialization.

Was ist der richtige Weg, dies zu tun? Gibt es einen besseren Weg?

EDIT: Von unten habe ich versucht, mit Seite.LoadControl.

Wenn ich die Last der Kontrolle auf Basis des string-Darstellung der Pfad-und Datei-Namen, die es verbietet, die übergabe eines Parameters. Ich kann dies umgehen, indem Sie hinzufügen einer Methode, die mir erlaubt, das Objekt. Während dies funktioniert, es fühlt sich hackish. Ich wäre lieber in der Lage, übergeben Sie den Wert an den Konstruktor, wenn dies möglich ist.

Verwendung der überladenen Methode gibt das gleiche Ergebnis wie das laden nur den code hinter die Etiketten, die zugeordnet sind null.

EDIT: Offenbar ist die überladene Methode nicht instanziieren der untergeordneten Steuerelemente Hinzugefügt, auf die .ascx-Datei ist "by design". Ich fand das in den Kommentaren bei Microsoft-Seite für Seite.LoadControl(type, object[])

  • Sie sind mit verwirrender Terminologie. Ein Benutzerdefiniertes Steuerelement, und ein Benutzer Steuern sind völlig unterschiedliche Dinge. Ein Benutzer-Steuerelement verfügt über eine ascx und eine code-behind, in der Erwägung, dass ein custom control ist einfach eine Klasse, die inhertis aus dem System.Web.UI.Control-Klasse. Die Sie erstellen möchten, und wie werden Sie indem Sie auf die Seite. Was versuchen Sie zu verwenden.
  • Ich bin erstellen Sie ein Benutzersteuerelement. Ich werde den code aktualisieren, zu reflektieren. So, wie Sie sind, die Hinzugefügt wird, bin ich erstellen Sie eine Instanz des Steuerelements, und klicken Sie dann hinzufügen auf der Seite über die controls-Auflistung.
InformationsquelleAutor mwright | 2010-03-24
Schreibe einen Kommentar