Laden...

HtmlTable mit colgroup, thead, tfoot und tbody

Erstellt von Urbain vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.865 Views
Urbain Themenstarter:in
77 Beiträge seit 2010
vor 12 Jahren
HtmlTable mit colgroup, thead, tfoot und tbody

Hallo,

ich bin gerade dabei ein ListView LayoutTemplate und ItemTemplate dynamisch zu generieren. Es wäre sehr hilfreich könnte ich die HTML-Elemente colgroup, thead, tfoot und tbody generieren, weil ich so die Tabellenelemente leichter auseinanderhalten und mit CSS stylen kann.
Zumindest thead, tfoot und tbody können durch ein normales Table-Objekt gerendert werden. Leider kann ich aber ein Table-Objekt bei der Generierung des Templates nicht verwenden, weil ich ansonsten folgende Fehlermeldung erhalte: "Table cannot have children of type ListViewDataItem."
Ich musste also auf das HtmlTable-Objekt zurückgreifen. Nun funktioniert eigentlich alles, nur wird von dieser Klasse das Rendern von colgroup, thead, tfoot und tbody nicht unterstützt.
Nun dachte ich, dass ich vielleicht mit LiteralControl-Objekten arbeiten könnte, aber ich glaube das könnte sehr umständlich werden.

Vielleicht wäre es hier hilfreich sich seine eigene HtmlTable-Klasse zu erzeugen, mit der man die gewünschte Tabelle rendern könnte. Sie könnte zum Beispiel Eigenschaften haben, die Listen aus HtmlTableRow-Objekten kapseln: HeaderRows, ContentRows und FooterRows (oder so, nur damit klar ist was gemeint ist).

Meine Frage nun ist, wie es möglich ist, sich eine solche von HtmlControl abgeleitete Klasse zu erstellen. Was muss man dabei beachten, was das Rendering betrifft (auch von in Zellen eingebetteten Steuerelementen). Ich hab leider im Netz dazu überhaupt nichts gefunden.
Falls es nicht optimal wäre hier meine eigene Klasse zu erstellen, was wären meine Alternativen, um den gewünschten HTML-Output zu bekommen?


<table>
	<colgroup>
			<col style="rownumColumn" />
			<col style="idColumn" />
            <col style="numericColumn" />
	</colgroup>
    <thead>
		<tr>
			<th>#</th>
			<th>ID</th>
			<th>Value</th>
        </tr>
    </thead>
	<tfoot>
		<tr>
			<td colspan="3"><!-- Pager --></td>
		</tr>
	</tfoot>
    <tbody>
		<tr>
			<td>1</td>
			<td>KB234</td>
			<td>293045,2093</td>
		</tr>
		...
    </tbody>
</table>

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo Urbain,

was Du vorhast kannst Du vermutlich mit HtmlGenericControl erreichen.
Allerdings muss dann die Table und sämtliche darunter geschachtelte Controls, die zur Tabelle gehören (tr,td,th), diesen Typ aufweisen, da Du sonst aufgrund der von Dir bereits festgestellten Beschränkungen keine Tabelle zusammenbasteln kannst.

Prinzipiell sollte es aber funktionieren:

      HtmlControl table = new HtmlGenericControl("table");
      HtmlControl tHead = new HtmlGenericControl("thead");
      HtmlControl tBody = new HtmlGenericControl("tbody");
      HtmlControl tFoot = new HtmlGenericControl("tfoot");
      table.Controls.Add(tHead);
      table.Controls.Add(tBody);
      table.Controls.Add(tFoot);
// weitere geschachtelte GenericControls nach belieben.
// Attribute können über die Attributes-Property gesetzt werden.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Urbain Themenstarter:in
77 Beiträge seit 2010
vor 12 Jahren

Hallo,

danke, mit dieser Klasse hat es geklappt den Output so hinzubekommen wie ich das wollte. Einzig für das Unterelement col des colgroup-Elements braucht man ein leeres Html-Element. Hierfür gibt es keine bereitgestellte Klasse wie HtmlGenericEmptyControl. Falls auch andere Leute mit demselben Problem auf diesen Thread stoßen, hier die Definition der benötigten Klasse:


    public class HtmlGenericEmptyControl : HtmlGenericControl
    {
        public HtmlGenericEmptyControl(string tagName)
            : base(tagName)
        {
        }

        protected override void Render(HtmlTextWriter writer)
        {
            writer.WriteBeginTag(this.TagName);

            foreach (string key in this.Attributes.Keys)
            {
                writer.WriteAttribute(key, this.Attributes[key]);
            }

            writer.Write(HtmlTextWriter.SelfClosingTagEnd);
        }
    }