Frage

Ein Teil der Reihe von Kontrollen ich natürlich bin auf mich beinhaltet einige von ihnen zusammen in einen Topf zu werfen, um Komposite. Ich beginne zu schnell zu lernen, dass diese Rechnung trägt (das ist alles neu für mich!):)

I hat grundsätzlich eine StyledWindow Steuerung, die im wesentlichen ein verherrlichter Panel mit der Fähigkeit ist, andere Bits zu tun (wie Hinzufügen von Rahmen etc.).

Hier ist der Code, der die untergeordneten Steuerelemente innerhalb es instanziiert. Bis zu diesem Punkt scheint es richtig mit banalen statischen Kontrollen gearbeitet hat:

    protected override void CreateChildControls()
    {
        _panel = new Panel();

        if (_editable != null)
            _editable.InstantiateIn(_panel);

        _regions = new List<IAttributeAccessor>();
        _regions.Add(_panel);
    }

Die Probleme heute kam, als ich versuchte, in ihr eine komplexere Steuerung nisten. Diese Steuerung verwendet, um die Seite einen Verweis, da sie JavaScript spritzt in es ein bisschen mehr bissig und reaktionsfähiger zu machen (der RegisterClientScriptBlock ist der einzige Grund, warum ich die Seite ref benötigen).

Nun, dies verursacht wurde „Objekt null“ Fehler, aber ich lokalisierte dies dem Verfahren machen nach unten, was natürlich versucht, das Verfahren gegen die [null] Page Objekt aufzurufen.

Was ich ist verwirrend ist, dass die Steuerung als eigenständiges funktioniert gut, aber wenn es in dem StyledWindow es geht alles schief gelegt!

So sieht es aus wie ich bin etwas fehlt entweder meine StyledWindow oder ChildControl. Irgendwelche Ideen?

Update

Wie Brad Wilson ganz Recht darauf hingewiesen, , Sie nicht sehen, die Kontrollen an den Controls Sammlung hinzugefügt werden. Dies ist, was die _panel für ist, dies war das für mich zu handhaben, im Grunde dann Controls außer Kraft setzen (ich habe diese von einem Führer irgendwo):

    Panel _panel;    // Sub-Control to store the "Content".
    public override ControlCollection Controls
    {
        get
        {
            EnsureChildControls();
            return _panel.Controls;
        }
    }

Ich hoffe, dass hilft, die Dinge zu klären. Apologies.

Update Nach Longhorn213 Antwort-

Richtig, ich habe mit der Kontrolle einig Spiele getan, innerhalb des Verbunds eine Platzierung und eine außerhalb. Ich habe dann den Status der Seite zu Fall wichtigen Ereignisse in der Steuer Lifecycle und machte es auf der Seite.

Die Standalone funktioniert gut und die Seite inited wird wie erwartet. Allerdings ist die verschachtelt in dem Verbund anders. Es ist OnLoad Ereignis wird überhaupt nicht gefeuert zu werden! Also ich vermute, Brad, dass wahrscheinlich recht ist, ich bin nicht die Steuerungshierarchie korrekt einrichten, kann jemand ein paar Ratschläge bieten, was mir fehlt? Ist das Gremium Methode nicht genug? (Na ja, es ist offensichtlich nicht, ist es ?!): D

Vielen Dank für Ihre Hilfe Jungs, geschätzt:)

War es hilfreich?

Lösung 3

Gelöst!

Richtig, war ich entschlossen, diese geknackt heute zu erhalten! Hier waren meine Gedanken:

  • Ich dachte, die Verwendung von Panel ein bisschen wie ein Hack war, also sollte ich es entfernen und herausfinden, wie es wirklich geschehen ist.
  • Ich wollte nicht so etwas wie MyCtl.Controls[0].Controls tun, um die Kontrollen zu dem Verbund hinzugefügt zuzugreifen.
  • Ich wollte das verdammte Ding arbeiten!

Also, ich habe die Suche und klicken Sie MSDN , diese Artikel anzu war wirklich hilfreich (dh wie fast kopieren 'n' Paste, und erklärt gut - etwas MSDN ist traditionell schlecht). Nice!

Also riss ich die Verwendung von Panel und folgte so ziemlich den Artikel anzu und nahm es als Evangelium, machte sich Notizen, als ich ging.

Hier ist, was ich habe jetzt:

  • Ich lernte ich den falschen Begriff verwendet hat. Ich habe es sollte eine Aufruf Templated Kontrolle . Während Templat-Kontrollen technisch Komposite sind, gibt es einen deutlichen Unterschied. Templated Kontrollen können die Schnittstelle für Elemente definieren, die sie hinzugefügt werden.
  • Templated Kontrollen sind sehr leistungsfähig und eigentlich ziemlich schnell und einfach einrichten, sobald Sie Ihren Kopf zu bekommen um sie!
  • Ich werde einige mehr mit dem Designer Unterstützung spiele ich voll und ganz zu gewährleisten, verstehen sie alle, dann ein Blog erhalten post up:)
  • Ein „Template“ Steuerung wird verwendet, um die Schnittstelle für die Templat-Daten angeben.

Zum Beispiel, hier ist der ASPX-Markup für ein Steuerelement mit Vorlagen:

<cc1:TemplatedControl ID="MyCtl" runat="server">
    <Template>
        <!-- Templated Content Goes Here -->
    </Template>
</cc1:TemplatedControl>   

Heres der Kodex Ich habe jetzt

public class DummyWebControl : WebControl
{
    // Acts as the surrogate for the templated controls.
    // This is essentially the "interface" for the templated data.
}

In TemplateControl.cs ...

    ITemplate _template;
    // Surrogate to hold the controls instantiated from 
    // within the template.
    DummyWebControl _owner;

    protected override void CreateChildControls()
    {
        // Note we are calling base.Controls here
        // (you will see why in a min).
        base.Controls.Clear();
        _owner = new DummyWebControl();

        // Load the Template Content
        ITemplate template = _template;
        if (template == null)
            template = new StyledWindowDefaultTemplate();
        template.InstantiateIn(_owner);

        base.Controls.Add(_owner);
        ChildControlsCreated = true;
    }

Dann einfachen Zugang zu den Bedienungselementen des [Surrogate] Objekts zu bieten:

(aus diesem Grund wir klar benötigt / addieren sich zu den base.Controls)

    public override ControlCollection Controls
    {
        get
        {
            EnsureChildControls();
            return _owner.Controls;
        }
    }

Und das ist ziemlich viel es, einfach, wenn Sie wissen, wie es geht! :)

Weiter: Design Time Region Unterstützung

Andere Tipps

Ich sehe nicht, dass Sie Ihre Kontrollen der Controls-Auflistung hinzufügen überall, was erklären würde, warum sie nicht auf die Seite zugreifen können (da sie noch nie auf der Seite offiziell platziert worden ist).

Ich habe immer setzen die JavaScript auf der OnLoad-Funktion aufruft. Wie unten.

protected override void OnLoad(EventArgs e)
{

    // Do something to get the script
    string script = GetScript();

    this.Page.ClientScript.RegisterClientScriptBlock(this.Page.GetType(), "SomeJavaScriptName", script);

    // Could also use this function to determine if the script has been register. i.e. more than 1 of the controls exists
    this.Page.ClientScript.IsClientScriptBlockRegistered("SomeJavaScriptName");

    base.OnLoad(e);
}

Wenn Sie noch tun wollen das machen, dann können Sie einfach das Skript in der Antwort schreiben. Das ist, was der RegisterScriptBlock tut, bringt es nur das Skript inline auf der Seite.

Richtig, ich habe zu spielen und ich dachte, dass es etwas falsch mit meiner Kontrolle Instanziierung war, da Longhorn richtig war, soll ich in der Lage seinen Skriptverweis auf OnLoad zu erstellen (und ich konnte es nicht) und Brad war richtig, dass ich muss meine Controls Hierarchie gewährleisten, indem zu der Controls Sammlung des Verbund gehalten wurde.

So hatte ich zwei Dinge hier:

  1. hatte ich die Controls Eigenschaftenaccessor für den Verbund außer Kraft gesetzt dies Panel die Controls-Auflistung zurück, da ich mag nicht ctl.Controls[0].Controls[0] gehen müssen, um die tatsächliche Kontrolle zu bekommen was ich will. Ich habe diese entfernt, aber ich brauche diese sortiert werden.
  2. Ich hatte die Panel zur Controls Sammlung nicht hinzugefügt, Ich habe dies nun getan.

Also, es funktioniert jetzt aber Wie bekomme ich die Controls Eigenschaft für das Verbund der Elemente in den Panel zurückzukehren, anstatt den Panel selbst?

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