Ändern Sie die GridView-Elementvorlage dynamisch

8

Ich habe eine ziemlich große asp.net-Website, die GridView an das gleiche Objekt an vielen Orten gebunden verwendet. Ich verwende eine Elementvorlage, um jede Zeile anzupassen. Um jedoch die gleiche Vorlage in allen Seiten zu haben, die ich kopieren muss Fügen Sie die Artikelvorlage auf jeder Seite ein. Offensichtlich ist dies nicht die beste Lösung. Darüber hinaus möchte ich in der Lage sein, die von GridView verwendete Vorlage zu ändern, indem ich eine Konfigurationsdatei ändere. Eine Option wäre, ein Benutzersteuerelement mit dem DataGrid zu erstellen und die erforderlichen Eigenschaften für jede Seite verfügbar zu machen. Dies erfüllt jedoch nicht die zweite Voraussetzung, um die Vorlage dynamisch ändern zu können. Im Grunde suche ich nach einer Möglichkeit, dem GridView zu sagen, eine Vorlage zu verwenden und dies dynamisch zu tun. Jede Idee wäre hilfreich.

    
Albert 03.06.2009, 11:27
quelle

2 Antworten

9

Um zu erreichen, was Sie wollen, haben Sie zwei Möglichkeiten, wie ich es sehe:

1.) Erstellen Sie jedes TemplateField dynamisch im Code und wechseln Sie diese basierend auf einer Konfiguration.
2.) Erstellen Sie Benutzersteuerelemente für Ihre benutzerdefinierten Raster und verwenden Sie diese stattdessen.

Ich weiß, dass du gesagt hast, du willst kein UserControl benutzen, weil das deine Fähigkeit, dein Layout dynamisch zu ändern, wegnehmen würde, aber lass mich diese Voraussetzung mit einem Beispiel hinterfragen.

Sie können die integrierten ASP.Net-Funktionen verwenden, um Benutzersteuerelemente nach Ihren Wünschen dynamisch zu wechseln, indem Sie ein PlaceHolder-Steuerelement .

%Vor%

Ihre benutzerdefinierten Grids können deklarativ in .ascx-Dateien erstellt und dann dynamisch zur Laufzeit wie folgt geladen werden:

%Vor%

Wenn Sie Ihr Leben wirklich vereinfachen möchten, können Sie eine abstrakte Basisklasse erstellen, von der alle benutzerdefinierten Rastersteuerelemente abgeleitet werden. Auf diese Weise können Ihre Steuerelemente beim Laden allgemein behandelt werden.

%Vor%

Ein einfaches Gitter kann im Markup definiert werden:

%Vor%

Und Ihr Code hinter diesem Steuerelement würde etwa so aussehen:

%Vor%

Jetzt muss die Seite oder das Steuerelement, das dies verwendet, nur in die Basisklasse umgewandelt werden, und Sie können sie generisch verwenden. Das Folgende ist ein einfaches Beispiel, wie Sie das verwenden könnten, aber ich denke, es macht den Punkt deutlich:

%Vor%

Also, da hast du es. Benutzerdefinierte Steuerelemente mit Vorlagen, die nicht so viele Probleme bereiten, dass sie manuell im Code erstellt werden. Ich werde den vollständig manuellen Weg, dies in einer anderen Antwort zu tun, aber sobald Sie es sehen, ich denke, Sie werden zustimmen, dass diese Methode bevorzugt wird.

    
Josh 03.06.2009, 15:38
quelle
5

Alles klar, also hier ist das Beispiel für das manuelle Erstellen von Vorlagen mit Vorlagen.

Der erste Schritt beim Erstellen dynamischer Vorlagenspalten besteht darin, eine Klasse zu erstellen, die die System.Web.UI.ITemplate Schnittstelle. Für unser einfaches Beispiel werde ich nur ein Etikett verwenden.

%Vor%

Beachten Sie, dass Sie, um DataBinding zu unterstützen, dieses Ereignis manuell mit den Steuerelementen behandeln müssen, die Sie hinzufügen möchten. Sobald Sie Ihre Vorlage entwickelt haben, können Sie diese als ItemTemplate für jedes TemplateField verwenden, das Sie verwenden möchten.

Nehmen wir an, dass wir eine Sammlung von benutzerdefinierten Geschäftsobjekten haben, an die wir unser Raster binden wollen.

%Vor%

Wir müssen jede Spalte manuell als TemplateField erstellen und dann unsere Sammlung an GridView binden. Um das zu vereinfachen und zu vereinfachen, habe ich das Erstellen der TemplateField-Auflistung in eine statische Hilfsklasse gekapselt:

%Vor%

Wenn Sie dies in Ihrem Code verwenden, sieht das etwa so aus:

%Vor%

Am Ende wird dann eine Ausgabe erzeugt, die mit dem Beispiel für dynamische Benutzersteuerelemente identisch ist, aber wie Sie sehen können, ist es viel mühsamer. Dies ist auch ein sehr einfaches Beispiel, das keine CSS-Attribute oder mehrere Arten von Steuerelementen enthält. Du könntest das tun, aber es wäre schmerzhaft und könnte dazu führen, dass du aufhören möchtest, alles zusammen zu programmieren. Gehen Sie mit der Benutzersteuerungslösung und machen Sie Ihr Leben leichter.

    
Josh 03.06.2009 15:59
quelle