Hinweise zum Erstellen eines dynamischen Steuerelements für die erweiterte Suche in ASP.NET

Alternativtext http://img3.imageshack.us/img3/1488/advancedsearch.png

Ich erstelle eine "Erweiterte Suche" -Schnittstelle in einer ASP.NET-Anwendung. Ich brauche SO nicht, um dieses Ding für mich zu schreiben, aber ich stecke bei einem bestimmten Problem in Bezug auf dynamische Steuerelemente und ViewState fest. Ich hätte gerne eine Anleitung, wie ich das angehen soll. Hier ist meine Situation:

Zutaten:

Ein zu wartender Satz von API-Objekten, die Entitäten, Felder und Suchvorgänge darstellen. Dieser Satz behandelt das Erstellen einer Suche, das Generieren von SQL und das Zurückgeben der Ergebnisse. Das ist also alles erledigt.ASP.NET 3.5

Gewünschte Schnittstellenfunktionalität:

(1) Beim ersten Laden der Seite erhält die Benutzeroberfläche ein vorkonfiguriertes Suchobjekt mit einer Reihe von SearchCriterion-Objekten. Es bindet sie in eine Reihe von Steuerelementen (siehe Abbildung oben).

Einige Suchbegriffe sind einfacher:

Feld (DropDownList) | Operator (DropDownList) | Wert (TextBox)

Suchkriterien-Steuerelemente für einige Feldtypen enthalten wichtige Informationen in viewstate, z.

Feld (DropDownList) | Operator (DropDownList) | Wert (DropDownList), bei dem die Dropdown-Liste "Wert" von einer Datenbankabfrage ausgefüllt wird.

Einige Felder sind Lookups für andere Entitäten, was eine Kette von Feldauswahlelementen zur Folge hat, wie z.

Feld (DropDownList) Feld (DropDownList) | Operator (DropDownList) | Wert

(2) Der Benutzer ändert die Suche durch:

Hinzufügen und Entfernen von Suchkriterien durch Klicken auf die entsprechenden SchaltflächenKonfigurieren vorhandener Kriterien durch Ändern von Feld, Operator oder Wert. Änderungen an Feld oder Operator erfordern eine Neukonfiguration des Steuerelements durch Ändern der verfügbaren Operatoren, Ändern des Eingabesteuerelements "Value" auf einen anderen Typ oder Hinzufügen / Entfernen von DropDownLists aus dem Abschnitt "Fields", wenn Felder vom Typ Lookup ausgewählt / nicht ausgewählt sind .

(3) Schließlich klickt der Benutzer auf "Suchen", um die Ergebnisse anzuzeigen.

Das Problem:

Wie Sie wahrscheinlich bereits wissen, wenn Sie diese Frage beantworten, verschwinden dynamisch zur Seite hinzugefügte Steuerelemente beim Zurücksetzen. Ich habe ein UserControl erstellt, das die Steuerelementsammlung bearbeitet und Schritt (1) ordnungsgemäß ausführt, wie Sie im angehängten Bild sehen können. (Ich mache mir an dieser Stelle offensichtlich keine Sorgen um den Stil.)

Bei Postback sind jedoch alle Steuerelemente verschwunden und mein Such-API-Objekt ist verschwunden. Wenn ich die dynamisch generierte Steuerelementsammlung dazu bringen könnte, einfach gut zu spielen und in ViewState zu bleiben, könnte ich die Steuerelemente beim Postback untersuchen, das Suchobjekt neu erstellen und dann Steuerelementereignisse ordentlich behandeln.

Mögliche Lösungen

Ich könnte das Suchobjekt serialisierbar machen und es in viewstate speichern. Beim Laden der Seite konnte ich sie dann abrufen und die Steuerelementsammlung zum Zeitpunkt des Ladens der Seite rekonstruieren. Ich bin mir jedoch nicht sicher, ob dies gut mit Steuerelementen funktioniert, die Ereignisse auslösen, und was passiert mit dem Anzeigestatus von Dropdown-Listen, die Daten aus der Datenbank enthalten. Kann ich diese zurückholen? Es ist höchst unerwünscht, dass ich die Datenbank bei jedem Postback erneut abfragen muss.

Ich könnte ein benutzerdefiniertes Serversteuerelement entwickeln (siehe diesen Link) für diese Art von Dingen ... aber das ist ein neues Thema für mich und würde einiges an Lernen erfordern. Außerdem bin ich mir nicht ganz sicher, ob ein benutzerdefiniertes Serversteuerelement mit nicht festgelegten Steuerelementauflistungen besser funktionieren würde. Weiß jemand davon?

Ich dachte, ich könnte dies mit datengebundenen Steuerelementen erreichen - zum Beispiel könnte ich meine Kriteriensammlung an einen Repeater mit einer festen Steuerungssammlung binden (möglicherweise die nicht verwendeten "Wert" -Steuerelemente ausblenden, einen inneren Repeater für die verwenden Dropdown-Listen "Feld"). Dann würden alle Informationen in ViewState bleiben ... richtig?

Über neue Ideen würde ich mich sehr freuen.

danke für Ihre Hilfe. b.Fandango

Antworten auf die Frage(4)

Ihre Antwort auf die Frage