GridView dynamisch erstellen

8

Ich möchte eine GridView erstellen, die Datensätze für PDF-Dateien anzeigt. Für diese Datensätze können Metadaten angehängt werden, die vom Benutzer angepasst werden können, sodass sie ihre eigenen Spalten erstellen und dort ihre eigenen Informationen eingeben können. Ich möchte dann, dass es in einer GridView angezeigt wird, so dass sie jede Spalte und die Reihenfolge der Spalten bestellen können, wenn die Spaltenreihenfolge -1 ist, wird es nicht in der GridView angezeigt.

Zum Beispiel gibt es eine statische Tabelle

%Vor%

Dann gibt es eine weitere Tabelle, in der Benutzer ihre eigenen Spalten für

erstellen können %Vor%

und die Tabelle, die die Werte enthält

%Vor%

Jetzt ist das Problem, ich muss die Spalten von der MetaDataColumn abrufen, um die GridView zu erstellen und sie dann mit den Werten in MetaDataValue-Tabelle aufzufüllen. Mein ursprünglicher Plan ist, eine Funktion zu haben, die die GridView dynamisch erstellt und ihr Spalten hinzufügt, aber ich bin fest, wie man die Werte im MetaDataValue als Spalten verwendet. Alternativ könnte ich nur die GridView AutoGenerate-Spalten haben, aber ich muss das SQL anpassen, um die benutzerdefinierten Daten anzuzeigen. Ich bin ein bisschen fest daran, wie ich mich dem nähern kann.

Ein Ansatz, den ich mir ausgedacht habe, ist dieser Pseudocode:

%Vor%

Eines der Dinge, die ich an diesem Design nicht mag, ist, dass für jede Zeile in der Dokumententabelle eine weitere Abfrage erstellt wird. Ich bin nicht sicher, ob das ein Problem mit SQL ist?

    
michael 11.07.2012, 05:22
quelle

3 Antworten

2

Ihr Problem ist hauptsächlich auf das Design der Datenbank zurückzuführen. Sie müssen Spalten dynamisch hinzufügen, weil Sie eine Spalte ( in 3NF ) in eine Zeile in Ihren Tabellen übersetzt haben . Offensichtlich ist dies, weil Sie Benutzern erlauben, ihre eigenen Spalten hinzuzufügen - mein Verstand schaudert, aber so funktioniert die App: -).

Aufgrund der Struktur von MetaDataColumns gehe ich davon aus, dass ein Benutzer die Möglichkeit hat, eine Reihe von Spaltennamen zu definieren, die er nach Belieben auf ein einzelnes Dokument anwenden kann.

Ich denke, das Problem besteht darin, dass Sie sich in einer vollständig ent normalisierten Datenbank alles mühsam zurechtgelegt haben, um alles richtig zu normalisieren. Meine Lösung wäre, Ihre Tabelle MetaDataValues zu denormalisieren. Sie erwähnen nicht, welche RDBMS Sie verwenden, aber MySQL hat eine harte Grenze von 4096 Spalten oder 65 KB. Das Limit in Oracle ist 1000 und 1024 in SQL Server .

Wenn Sie die Struktur von MetaDataValues folgendermaßen ändern, sollten Sie in der Lage sein, mindestens 332 Informationsmengen einzupassen. Dies wäre für UserID , DocumentID separat eindeutig, so dass Sie theoretisch den Ersatzschlüssel ID entfernen könnten.

%Vor%

Dies setzt natürlich eine Obergrenze für die Anzahl der Spalten, die ein einzelner Benutzer erstellen darf, bis zu 332; aber es ist normal, die Fähigkeiten von Benutzern einzuschränken, verrückt zu werden, und jeder, der 332 einzelne Teile von Metadaten denken kann, um sie in einem einzigen PDF zu speichern, verdient es, irgendwie eingeschränkt zu werden.

Wenn Sie besonders informationsbesessene Benutzer haben, können Sie immer eine zweite Tabelle mit der gleichen Struktur deklarieren und weiter ausfüllen.

Dies würde bedeuten, dass MetaDataColumns nicht für irgendetwas verwendet wird, sondern für die Benutzeroptionen. Sie hätten jedes Mal, wenn eine Änderung vorgenommen wurde, MetaDataValues zu aktualisieren, und sicherzustellen, dass Sie bereits vorhandene Informationen nicht überschrieben haben, kann ein wenig schmerzhaft sein. Ich würde vermuten, dass Sie etwas tun müssen, wie den Datensatz auszuwählen, bevor Sie ihn aktualisieren, indem Sie KeyName1 .. KeyNameN durchlaufen und den ersten Datensatz eingeben, der keine Daten enthält. Alternativ könnten Sie einfach eine absolut schreckliche SQL-Abfrage schreiben. In jedem Fall würde dies zum "Engpass" werden.

Die andere Option wäre das Hinzufügen einer Additionsspalte zu MetaDataColumns , die anzeigt, auf welche N Spalte es sich bezieht, aber dies beschränkt den Benutzer auf 332 Spalten anstatt auf 332 pro Dokument.

Aber Ihre Auswahl aus der Datenbank ist jetzt wahnsinnig einfach:

%Vor%

Es muss nicht versucht werden, dynamisch durch die Tabellen zu iterieren, indem 1.000 Spaltenauswahlanweisungen generiert werden. Alle Informationen sind genau dort und leicht zugänglich für Sie.

Am Ende des Tages hängt die "richtige" Antwort auf Ihre Frage davon ab, wo Sie die Zeit verbringen möchten. Möchten Sie, dass es eine halbe Sekunde länger dauert, um ein Dokument oder eine halbe Sekunde (wahrscheinlich mehr) zu erstellen oder zu aktualisieren, um die Informationen zu diesem Dokument auszuwählen.

Persönlich denke ich, dass Nutzer verstehen, dass das Erstellen von etwas Zeit kostet, aber nichts ist ärgerlicher, als ewig warten zu müssen, bis etwas erscheint.

Es gibt eine andere, soziale Lösung als eine Datenbanklösung. Erlauben Sie Ihren Benutzern nicht, eigene Spalten zu erstellen. Wählen Sie die häufigsten Metadaten aus, die Ihre Benutzer wünschen, und erstellen Sie sie in einer normalisierten Form in der Datenbank. Sie wären in der Lage, Spalten mit dem richtigen Datentyp zu erstellen (was Ihnen auf lange Sicht viel Ärger erspart) und haben es viel einfacher. Ich bezweifle, dass du das Glück haben wirst, dass das passiert ist; aber es lohnt sich, daran zu denken.

    
Ben 14.07.2012, 23:09
quelle
1

Meinst du

? %Vor%

und erstellen Sie eine Klasse im Code hinter wie

%Vor%     
Nathan 13.07.2012 07:49
quelle
1

Ich sehe definitiv ein Problem mit Ihrem Pseudocode-Ansatz, bei dem jede Datenzeile eine separate Abfrage darstellt. Wenn Sie 1.000 Datenzeilen haben, würden Sie mit mehr als 1.000 Abfragen auf die Datenbank stoßen, Ihre Seite wäre extrem langsam.

Sie könnten mindestens zwei der SQL-Abfragen als unmittelbaren Schritt kombinieren, um die Situation zu verbessern, wie zum Beispiel:

%Vor%

Ich bevorzuge im Allgemeinen nicht die "SELECT *" - Methode, sondern zwingt die Datenbank, zusätzliche Abfragen durchzuführen, um alle Spalten auszufüllen. Wenn der Benutzer in Ihrem Fall auf die Spalten beschränkt ist, die er sehen kann, würde das SQL in vielerlei Hinsicht mehr Daten als nötig einbringen. So könnte Ihr Code weiter konsolidiert und optimiert werden wie:

%Vor%     
Tianzhen Lin 14.07.2012 16:08
quelle

Tags und Links