Frage

verzeihen Sie bitte den psuedo-Code, aber es ist eine einfache Frage:

ich eine Benutzersteuerung (myControlBase: Usercontrol) mit einem Textfeld (id = "txtbox") in seiner Markup. In seinen Code-Behind schreibe ich eine Methode SayHello (string s) {txtbox.Text = s; }.

ich erstellen Sie eine andere Benutzersteuerung, die myControlBase (myControl: myControlBase) erstreckt. In page_load dieses Kind Kontrolle, nenne ich SayHello ( „Hallo“); und erhält einen Laufzeitfehler mir zu sagen, dass txtbox ist null (es ist noch nicht offenbar erstellt).

Wie also kann ich erben von einem Steuer Benutzer und haben Zugriff auf mein Kind steuert die Markup-Base Kontrolle? Ich habe versucht, für diese Kontrollen auf Event-Lebenszyklus zu lesen, aber ich denke, ich bekomme es nicht.

Irgendwelche Ideen?

-edit -

Es tut mir leid, es ist ASP.Net. Wenn dieser Code macht es noch klarer, dann muss ich beschreiben das Problem eine ziemlich schlechte Arbeit geleistet haben.

txtBox ist eine ASP. Textbox-Steuerelement, das im Markup myControlBase existiert

public partial class myControlBase : System.Web.UI.UserControl
{
  protected void SayHello(string s){
    txtBox.Text = s;
  }
}

public partial class myControl: myControlBase
{
    protected void Page_Load(object sender, EventArgs e)
    {
      SayHello("hello");
    }
}

Dies würde bei SayHello scheitern ( "Hallo"); weil txtBox zurück Null.

War es hilfreich?

Lösung

Ich verstehe das Problem jetzt, aber ich habe keine schöne Lösung.

Wenn Sie eine Benutzersteuerung wie diese erweitern, Sie völlig verlieren Zugriff auf die Markup-Base-Steuerung. Das Page_Load des Kindes wird, bevor genannt (möglicherweise statt?) Die Page_Load-Base Kontrolle.

Andere Tipps

Neben Methoden wie Page_Load gibt es die On* Methoden, wie OnInit und OnLoad . Dies sind virtuelle Methoden, so kann durch die abgeleitete Benutzersteuerung außer Kraft gesetzt werden.

public override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    SayHello("hello");
}

Es sieht aus wie Create noch nicht genannt worden.

Versuchen EnsureChildControls Hinzufügen () in Page_Load, oder rufen Sie SayHello vom OnPreRender Ereignis.

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