Laden...

DataGrid als Suchmaske

Erstellt von oehrle vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.078 Views
O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 12 Jahren
DataGrid als Suchmaske

Hallo, bin gerade an einem Problem, wo ich nicht genau weiter weiss. Ich habe aus diversen SQL-Tabellen eine View erstellt. Diese rufe ich ab und visualisere diese in einem DataGrid in einem Window. Nun soll aus den vielen Daten gefiltert werden können, was auch schon funktioniert.

Dazu habe ich das identische DataGrid mit der gleichen Tabellenstruktur darunter gelegt, mit einer zusätzlichen Spalte am Anfang vom DataGrid, welche die Suchoperatoren angeben (≥ , ≤ , == , LIKE),und vier Zeilen eingefügt, in welche dann die Daten für die Suchabfrage eingetragen werden können. Wie gesagt, das klappt alles ganz toll.
Jetzt kommts aber. Ich muss das Ding erweitern, weil ich Dateien einlesen soll. Die Werte dieser Datei müssen dann automatisch in die Suchfelder eingetragen werden, und dann soll sofort angezeigt werden, ob Datensätze zu diesen Daten vorhanden sind. Das wäre auch noch nicht das Problem. Aber es soll so sein, das bei dem DataGrid mit den Suchdaten noch zusätzlich eine Zeile rein soll, und dort in jede Spalte eine CheckBox angezeigt wird. Damit kann man dann einfach das Feld für die Suche abwählen, um den Suchbereich vergrößern zu können.
Ich tu mir jetzt schwer mit den CHeckboxen in der Zeile. Meine Tabellenspalten haben ja eine Tyypisierung, und somit kann ich ja da in der letzten Zeile nicht etwa mit "bool" die CheckBoxen erzeugen. Gibts da eine Lösung das ich das in der gleichen Tabelle machen kann, oder muss ich da eine weitere Tabell drunter kleben?

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo oehrle,

wie flterst du denn?
Erzeugst du dynamsich ein SQL? Wenn ja, so kannst du dort die CheckBox ja berücksichtigen.
Wenn du mit Linq filterst, so könntest du den PredicateBuilder verwenden um die Query dynamisch und in Abhängigkeit von der Checkbox zu erstellen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 12 Jahren
CheckBox einbringen

Hi, ich baue einen SQL-String dynamisch zusammen. Natürlich ist mir klar das ich die Checkboxen abfragen kann und dann das betrefende Feld einach übergehe. Mein Problem ist: Wie kreig ich die CheckBox in das bestehende "Suchmasken-DataGrid" rein! Alle Spalten haben ja schon eine Typisierung. Kann ich das irgendwie machen, das trotzdem Checkboxen in der letztem Zeile angezeigt werden?

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo oehrle,

Dazu habe ich das identische DataGrid mit der gleichen Tabellenstruktur darunter gelegt,

Nimm hier nicht die Tabellenstruktur, sondern eine eigene Klasse welche die Tabellenstruktur + die CheckBox (in Form eines bool) wiederspiegelt.

Sonst könntest du auch nachdem die Daten gebunden sind das DataGrid erweitern, aber das ist eher Frickelei.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 12 Jahren

Hallo, danke für den Tipp. Das hört sich gut an. Aber eine Klasse anhand der Splatennamen einer SQL-Tabelle habe ich noch nie gemacht. Das wäre ne tolle Sache, könnte ich auch für andere Dinge brauchen. So könt ich mir ne flexible Klasse bauen. Nun das aber: Wie mach ich das dynamisch? Denn es könnte sein, es kommt mal noch ein Feld oder zwei ... dazu.

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo oehrle,

für diesen Fall würde ich das DynamicObject verwenden. Der Mehraufwand spielt keine Rolle, wenn eh eine Datenbankabfrage auch im Spiel ist.
D.h.: erstell ein dynamsiches Objekt anhand der Spaltennamen der Tabelle (kann ja per SQL ausgelesen werden) und ergänze die Tabellenstruktur um alles nötige für die Suche.

Es gibt auch andere Möglichkeiten:*mit T4 den Code für die Klasse zur Compiletime erstellen lassen *sonstige Möglichkeiten zur dynamsiche Codegenerierung zur Laufzeit (wie CodeDOM)

Ich denke aber dass hier das DynamicObject am einfachsten ist.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 12 Jahren
Wie krieg ich die Felder rein

Hi, habe mir das gestern angesehen un dprobiert. Bin immer noch dabei, aber ich raff es nicht. Ich habe ja die View, die auf einer DataTable beruht. Die durchlaufe ich in einer Schleife und hole mir alle Spaltennamen. Gleichzeitig möchte ich diese in die dynamische Klasse eintragen, als Member. Werte brauch ich erst mal keine, aber wenn ich weiss wie ich die auch noch rein krieg ists für sonstige Anwendungen nicht verkehrt.
Ich krieg die Member nicht rein. In dem Besipiel bei MS ist ein Dictionary dabei, das brach ich doch gar nicht. Kannst mir mal einen Ansatz geben?

mal einfach so ein Beispiel:




            dynamic per = new HeliTest();

            for (int i = 0; i < tblHeli.Columns.Count; i++)
            {
                per.SetMember(tblHeli.Columns[i].ColumnName);

            }

Für meine Anwendung müßte eigentlich das ExpandoObject reichen. Aber da seh ich wieder das Problem, wie ich die Spaltennamen als Membernamen in die Klasse bekomme.


          dynamic per = new ExpandoObject();

            for (int i = 0; i < tblHeli.Columns.Count; i++)
            {
                //// Hier muss ich irgendwie den Membernamen rein kriegen
                per[tblHeli.Columns[i].ColumnName] = "";

            }

Nun wie mach ich das, aus dem MS-Code werd ich noch nicht schlau.

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo oehrle,

ich muss zugeben mit der DLR hab ich mich bisher nicht befasst. Nur das DynamicObject hatte ich in den Bookmarks für alle Fälle.

Du hast aber recht, dass das ExpandoObject besser geeignet ist. Dieses implementiert die IDictionary<string, object>-Schnittstelle und somit kannst du wie folgt verwenden:


dynamic myView             = new ExpandoObject();
var myViewAsDictionary     = myView as IDictionary<string, object>;
myViewAsDictionary["Id"]   = 42;
myViewAsDictionary["Name"] = "gfoidl";

int id      = myView.Id;
string name = myView.Name;

Die Eigenschaften können also dem Dic. als String hinzugefügt werden und das ist genau die Ausgangsituation die du mit den Spaltennamen hast. Auch Werte können gesetzt werden. Wenn kein richtiger vorhanden ist, so nimm einfach null (wegen dem Typ object kein Problem).

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 12 Jahren
Klasse für Tabelle

Hallo gfoidl, das mit der dyn. Klasse hat geklappt. Habe Freitag mittag noch etwas mit DataGrid experimentiert. So wie ich das geschildert habe, 4 Rows in das "SuchGrid" einfügen, jede Row ist für einen Operator gedacht(≥, ≤, == , like) und dann kann in jeder Spalte der 4 Rows je nach Suchkriterieum etwas eingegeben werden (Bereichseinschränkung, Like für ähnlichen Dateinamen ...) wird wohl nicht funktionieren, wenn ich dann noch eine fünfte Row einfügen möchte, die mir nur CheckBoxen (typeof(Boolean)) darstellt zum an oder abwählen der Spalte. Die Typisierung der Spalten lässt das ja nicht zu, da ich bei den oberen 4 Rows mit den Operatoren "double" oder "string" als Spaltentyp festlegen muss.
Dazu muss ich dann ein weiteres DataGrid einfügen, das im Window im gleichen Stackpanel unter dem "SuchGrid" angeordnet ist.