Frage

ich habe ein Problem, wenn LoadControl( type, Params ) verwenden. Lassen Sie mich erklären ...

Ich habe eine Super einfache Benutzersteuerung (ascx)

<%@ Control Language="C#" AutoEventWireup="True" Inherits="ErrorDisplay" Codebehind="ErrorDisplay.ascx.cs" EnableViewState="false" %>

<asp:Label runat="server" ID="lblTitle" />
<asp:Label runat="server" ID="lblDescription" />

mit Code (c #) hinter:

public partial class ErrorDisplay : System.Web.UI.UserControl
{

    private Message _ErrorMessage;    

    public ErrorDisplay()
    {
    }

    public ErrorDisplay(Message ErrorMessage)
    {
        _ErrorMessage = ErrorMessage;
    }    

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        if (_ErrorMessage != null)
        {
            lblTitle.Text = _ErrorMessage.Message;
            lblDescription.Text = _ErrorMessage.Description;
        }
    }
}

An andere Stelle in meiner Web-Anwendung, die ich eine Instanz der Usercontrol auf der Seite mit dem folgenden Code am hinzu:

divValidationIssues.Controls.Add(LoadControl(typeof(ErrorDisplay), new object[] { MessageDetails }));   

Ich bin mit der überladenen Version von Loadcontrol, weil ich die Nachricht Parameter an den Konstruktor übergeben werden soll. All dies erscheint in Ordnung zu arbeiten.

Wenn jedoch die OnPreRender() auf der ErrorDisplay gefeuert Usercontrol die lblTitle und lblDescription Variablen sind beide null trotz ihnen eine Markup-Äquivalent. Die Nachrichtenvariable wurde korrekt ausgefüllt.

Kann jemand Aufschluss über warum dies geschieht kann?

Danke

EDIT:

Nur für Klarheit werde ich auch hinzufügen, dass der Code, der programmatisch dem Usercontrol auf der Seite hinzugefügt wird, in Reaktion auf einen Tastendruck ausgeführt wird, so dass die ‚Hosting-Seite‘ fortgeschritten durch Init, Page_Load und jetzt ist die Verarbeitung des Ereignisses Handler.

Ich kann die Benutzersteuerelemente zu einem früheren asp Lifecycle Phase hinzufügen, wie sie in Reaktion auf eine Schaltfläche klicken Ereignis erstellt werden.

War es hilfreich?

Lösung

Ich habe den folgenden Code als auch versucht, - die das gleiche Ergebnis (d.h. sowohl lblTitle und lblDescription sind null)

ergibt
protected void Page_Load(object sender, EventArgs e)
{
    if (_ErrorMessage != null)
    {
        lblTitle.Text = _ErrorMessage.Message;
        lblDescription.Text = _ErrorMessage.Description;
    }
}

hatte ich das Verständnis, dass die Loadcontrol-Funktion die Kontrolle brachte es auf den aktuellen ‚Zustand‘ wird geladen auf der Seite, auf welche sie enthalten auf wird. daher der Init, Page_Load etc laufen alle als Teil des Loadcontrol Anruf.

Interessanter diese (unbeantwortet) asp.net Foren posten zeigt das gleiche Problem wie ich erlebe.

MSDN Foren Beitrag

Zusätzlich - Aus dem MSDN:

  

Wenn Sie ein Steuerelement in ein Containersteuer laden, hebt der Behälter alle Veranstaltungen der zusätzlichen Kontrolle, bis er zu dem aktuellen Ereignisse gefangen hat. Allerdings ist die zusätzliche Kontrolle nicht mit Postbacks Datenverarbeitung einzuholen. Für eine zusätzliche Kontrolle in Postbacks Datenverarbeitung, einschließlich der Validierung zu beteiligen, muss die Steuerung in dem Init-Ereignisse hinzugefügt werden, anstatt in dem Load-Ereignisse.

Deshalb sollte nicht richtig initalise die Steuerung Loadcontrol?

EDIT:

Ok, so meine eigene Frage Ich beantworte hier ..

fand ich ein angenommenes Version des Forums Beitrag habe ich oben verknüpft Hier

Im Wesentlichen ist die Antwort, dass der LoadControl( type, params ) nicht das ‚Seite infront‘ ascx ableiten kann zu analysieren und somit ist es nicht die Mühe eines des Steuerelemente initalising. Wenn Sie die LoadControl( "ascx path" ) Version verwenden wird die Seite infront gegeben und damit macht die ganze Parsing und initalision.

Also zusammenfassend muss ich den Code ändern, die die Steuerung initalising und spaltete es in einzelne Teile. D.

Control ErrorCntrl = LoadControl("ErrorDisplay.ascx");
ErrorCntrl.ID = SomeID;
(ErrorCntrl as ErrorDisplay).SetErrorMessage = MessageDetail;
divErrorContainer.Controls.Add(ErrorCntrl);

Und es soll ok arbeiten .. Es ist nicht so ordentlich wie mein früherer Versuch, aber zumindest wird es funktionieren.

Ich bin nach wie vor offen für Vorschläge, die oben zu verbessern.

Prost

Andere Tipps

mit Mitchel Einigung sollten Sie in der Lage sein, eine page_load in dem Steuercode zu setzen selbst, die nach den Kontrollen vollständig verfügbar sind feuern würde.

Nun, es ist immer Ihr eigenes Ladeereignis des Hinzufügen und nennt es, nachdem Sie den Konstruktor ran und hinzugefügt, um die Steuerung an der Seite, aber es ist nicht viel anders als das, was Sie haben, obwohl ich es Artgründen wählen könnte.

Gut, dass Sie eine Antwort auf Ihre Frage gefunden!

Hier ist ein Blog-Eintrag geschrieben von Steven Robbins. Der Beitrag erläutert, wie Parameter für eine Benutzerkontrolle passieren LoadControl verwenden, ähnlich dem, was LoadControl(Type, object[]) tun würde, außer es funktioniert :)

Ich hatte ein ähnliches Problem mit dem Kalender-Steuerelement DayRender Ereignisse, dass ich einen Benutzer der Steuerung an die e.Cell.Controls Sammlung hinzufügen wollte. Nach dem Versuch, fand ein paar gescheiterten Ansätze mit der Benutzersteuerung page_load nicht feuern oder die Listbox auf der ascx eine Null-Ausnahme zu werfen, ich, wenn ich meine Kontrolle über die Form mit Loadcontrol (ASCX) initialisiert und auf die den Markup-Steuerelemente zugreifen dann starten ascx, alles hat gut funktioniert. Dieser Ansatz hängt nicht von dem Ereignis Page Load auf dem ascx überhaupt.

ASCX Markup

    

Code hinter

Public Class CPCalendarCell     Erbe System.Web.UI.UserControl

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

End Sub

Public Sub Add(txt As String)
    Dim li As New ListItem(txt, txt)
    lstDay.Items.Add(li)
End Sub

End Class

Seite ASPX-Markup

     

Code hinter Kalender DayRender Ereignisse auf dem Formular

Private Sub Calendar1_DayRender(sender As Object, e As System.Web.UI.WebControls.DayRenderEventArgs) Handles Calendar1.DayRender
    Dim div As CPCalendarCell = LoadControl("~/UserControls/CPCalendarCell.ascx")
    div.ID = "dv_" & e.Day.Date.ToShortDateString.Replace(" ", "_")

    **e.Cell.Controls.Add(div)**

    div.Add(e.Day.Date.Month.ToString & "/" & e.Day.Date.Day.ToString)
    div.Add("Item 1")
    div.Add("Item 2")
    e.Cell.Style.Add("background-color", IIf(e.Day.IsWeekend, "whitesmoke", "white").ToString)
End Sub

Per den asp.net Seite Lebenszyklus Ihrer Kontrollen sind nicht vollständig in dem Nachspiel vorrendern, warum Sie nicht nur die Werte in page_load laden?

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