Frage

Zusammenfassung

Hallo zusammen,
OK, weiter zu meinen Abenteuern mit benutzerdefinierten Steuerelementen ...

Zusammenfassend lässt sich sagen, dass ich drei Hauptklassen benutzerdefinierter Steuerelemente kennengelernt habe.Bitte korrigieren Sie mich, wenn etwas davon falsch ist!

  1. Benutzersteuerelemente - Welche erben von Nutzerkontrolle und sind in einem enthalten ASCX Datei.Diese sind in ihren Möglichkeiten ziemlich begrenzt, stellen aber eine schnelle und einfache Möglichkeit dar, eine gewisse UI-Kombination mit der Designerunterstützung zu erreichen.
  2. Benutzerdefinierte zusammengesetzte Steuerelemente – Dies sind Steuerelemente, die von erben WebControl Hier fügen Sie bereits vorhandene Steuerelemente zum Steuerelement innerhalb hinzu CreateChildControls Methode.Dies bietet große Flexibilität, aber keine Designerunterstützung ohne zusätzliche Codierung.Sie sind jedoch sehr portabel, da sie in eine DLL kompiliert werden können.
  3. Benutzerdefinierte gerenderte Steuerelemente – Ähnlich wie benutzerdefinierte zusammengesetzte Steuerelemente werden diese einem Web-Steuerelement-Bibliotheksprojekt hinzugefügt.Die Darstellung des Steuerelements wird vollständig vom Programmierer gesteuert, indem er das überschreibt Machen Methode.

Meine Gedanken..

OK, beim Spielen mit benutzerdefinierten Verbundwerkstoffen habe ich Folgendes gefunden:

  • Sie haben kaum oder gar keine Kontrolle über die HTML-Ausgabe, was das „Debuggen“ erschwert.
  • Der CreateChildControls (und nachfolgende Methoden) können sehr beschäftigt sein Controls.Add(myControl) überall.
  • Ich fand das Rendern von Tabellen (sei es für das Layout oder den Inhalt) ziemlich umständlich.

Die Fragen)..

Ich gebe also zu, dass ich neu in diesem Bereich bin, sodass ich mit einigen meiner oben genannten Punkte möglicherweise völlig daneben liege.

  • Verwenden Sie Verbundwerkstoffe?
  • Haben Sie nette Tricks, um die HTML-Ausgabe zu steuern?
  • Sagen Sie einfach „zur Hölle damit“ und erstellen Sie ein benutzerdefiniertes gerendertes Steuerelement?

Es ist etwas, das ich unbedingt in meinem Kopf festigen möchte, da ich weiß, wie viel Gut Durch die Steuerungsentwicklung kann die Gesamtentwicklungszeit verkürzt werden.

Ich freue mich auf eure Antworten ^_^

War es hilfreich?

Lösung

Ich sage: Fahren Sie mit dem benutzerdefinierten gerenderten Steuerelement fort.Ich finde, dass die Zusammensetzung in den meisten Fällen einfacher erstellt und in einem UserControl verwendet werden kann, aber alles darüber hinaus und Sie benötigen ein feineres Maß an Kontrolle (Wortspiel unbeabsichtigt), um Ihre eigene Rendering-Strategie zu rechtfertigen.

Es gibt möglicherweise Steuerelemente, die einfach genug sind, um eine Kombination zu verdienen (z. B. ein Textfeld in Kombination mit einem auf Javascript/DHTML basierenden Datumswähler), aber abgesehen von diesem einen Beispiel sieht es so aus, als wären benutzerdefinierte gerenderte Steuerelemente die richtige Wahl.

Andere Tipps

Hier ist eine weitere Erweiterungsmethode, die ich für benutzerdefiniertes Rendering verwende:

 public static void WriteControls
        (this HtmlTextWriter o, string format, params object[] args)
 { 
    const string delimiter = "<2E01A260-BD39-47d0-8C5E-0DF814FDF9DC>";
    var controls  = new Dictionary<string,Control>();

    for(int i =0; i < args.Length; ++i)
    { 
       var c = args[i] as Control; 
       if (c==null) continue;
       var guid = Guid.NewGuid().ToString();
       controls[guid] = c;
       args[i] = delimiter+guid+delimiter;
    }

    var _strings = string.Format(format, args)
                         .Split(new string[]{delimiter},
                                StringSplitOptions.None);
    foreach(var s in _strings)
    { 
       if (controls.ContainsKey(s)) 
           controls[s].RenderControl(o);
       else 
           o.Write(s);
    }
}

Um dann einen benutzerdefinierten Verbund in der RenderContents()-Methode zu rendern, schreibe ich Folgendes:

protected override void RenderContents(HtmlTextWriter o)
{ 
    o.WriteControls
         (@"<table>
               <tr>
                    <td>{0}</td>
                    <td>{1}</td>
               </tr>
             </table>"
            ,Text
            ,control1);
 }

Rob, du hast recht.Der von mir erwähnte Ansatz ist eine Art Hybrid.Der Vorteil der Verfügbarkeit von ASCX-Dateien besteht darin, dass sich Designer bei jedem Projekt, das ich gesehen habe, am wohlsten fühlen, wenn sie das eigentliche Markup bearbeiten, und mit ASCX können Sie und ein Designer getrennt arbeiten.Wenn Sie später keine tatsächlichen CSS-/Markup-/Designänderungen an den Steuerelementen selbst planen, können Sie ein benutzerdefiniertes gerendertes Steuerelement verwenden.Wie gesagt, mein Ansatz ist nur für kompliziertere Szenarien relevant (und hier braucht man wahrscheinlich einen Designer :))

Ich verwende häufig zusammengesetzte Steuerelemente.Anstatt Render oder RenderContents zu überschreiben, weisen Sie einfach jedem Control eine CssClass zu und verwenden Sie Stylesheets.Für mehrere Controls.Add verwende ich eine Erweiterungsmethode:

//Controls.Add(c1, c2, c3)
static void Add(this ControlCollection coll, params Control[] controls)
 { foreach(Control control in controls) coll.Add(control);
 }

Für schnelles und schmutziges Rendern verwende ich so etwas:

writer.Render(@"<table>
                   <tr><td>{0}</td></tr>
                   <tr>
                       <td>", Text);
control1.RenderControl(writer);
writer.Render("</td></tr></table>");

Zum Initialisieren von Steuerelementeigenschaften verwende ich die Eigenschaftsinitialisierer-Syntax:

childControl = new Control {  ID="Foo"
                            , CssClass="class1"
                            , CausesValidation=true;
                           };

Die Verwendung benutzerdefinierter zusammengesetzter Steuerelemente ist sinnvoll, wenn Sie über eine große Webanwendung verfügen und große Teile an vielen Stellen wiederverwenden möchten.Dann würden Sie nur die untergeordneten Steuerelemente derjenigen hinzufügen, die Sie entwickeln, anstatt sich zu wiederholen.An einem großen Projekt, an dem ich kürzlich gearbeitet habe, haben wir Folgendes getan:

  • Jedes zusammengesetzte Steuerelement verfügt über einen Container.Wird als Hülle für alles im Inneren der Steuerung verwendet.
  • Jedes zusammengesetzte Steuerelement verfügt über eine Vorlage.Eine ASCX-Datei (ohne die <%Control%>-Direktive), die nur das Markup für die Vorlage enthält.
  • Der Container (der selbst ein Steuerelement ist) wird über die Vorlage initialisiert.
  • Der Container stellt Eigenschaften für alle anderen Steuerelemente in der Vorlage bereit.
  • Sie verwenden this.Controls.Add([the_container]) nur in Ihrem zusammengesetzten Steuerelement.

Tatsächlich benötigen Sie eine Basisklasse, die sich um die Initialisierung eines Containers mit der angegebenen Vorlage kümmert und außerdem Ausnahmen auslöst, wenn in der Vorlage kein Steuerelement gefunden wird.Natürlich ist dies in einer kleinen Anwendung wahrscheinlich ein Overkill.Wenn Sie keinen wiederverwendeten Code und Markup haben und nur einfache Steuerelemente schreiben möchten, ist die Verwendung von Benutzersteuerelementen besser geeignet.

Möglicherweise können Sie diese Technik nutzen, um die Entwurfszeit zu vereinfachen:

http://aspadvice.com/blogs/ssmith/archive/2007/10/19/Render-User-Control-as-String-Template.aspx

Grundsätzlich erstellen Sie zur Laufzeit mit der LoadControl-Methode eine Instanz eines Benutzersteuerelements, übergeben ihr dann eine Art Statebag und hängen es dann an den Steuerbaum an.Ihr zusammengesetztes Steuerelement würde also eher wie ein Controller funktionieren und die ASCX-Datei wäre wie eine Ansicht.

Dies würde Ihnen die Mühe ersparen, den gesamten Kontrollbaum zu instanziieren und das Steuerelement in C# zu formatieren!

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