Entwickler-Ecke

WinForms - Select auf DataGridView + SQL Select


ralph71 - Mo 21.11.16 16:57
Titel: Select auf DataGridView + SQL Select
Hallo,

ich habe einen DataGridView. Mittels DataGridViewElementStates.Selected wähle ich die gewünschten Zeilen aus und übergebe über den Index (SelectedRows[i].Index) den Primärschlüssel der jeweiligen Zeile in eine lokale Variable.
Anschließend sollen über einen SELECT auf die Datenbank die restlichen Felder nachgeladen werden.
Meine Idee:
Ich baue mir eine dynamische WHERE-Bedingung im SELECT auf, der mir am Ende mit einem einzigen SELECT die gewünschten Daten aus der Datenbank holt und zB in eine DataTable schreibt.
Das würde ich auch zum fliegen bringen. Meine Frage wäre: geht das auch einfacher?

Danke euch!

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Ralf Jansen - Mo 21.11.16 20:58

Zitat:
Anschließend sollen über einen SELECT auf die Datenbank die restlichen Felder nachgeladen werden.


Und in der selben DataTable landen um sie im gleichen DataGridView anzuzeigen? Also du sieht erstmal ganze viele Zeilen deren Columns leer sind um sie später gezielt einzeln (je row) nachzuladen?
Klingt nach'ner schrägen UI. Ich würde mich da unwohl füllen wenn ich Daten im selben Grid von verschiedenen Zeitpunkten sehe könnte. Aka der erste Datensatz enthält Daten von vor 10 Minuten die Daten des 2.ten Datensatzes habe ich gerade geholt. Die des ersten Datensatz haben sich aber z.b. mittlerweile schon geändert ich sehe jetzt also etwas aus der Datenbank was es nie in dieser Kombination gegeben hat.

Nicht desto trotz es hilft dir vielleicht zu wissen das DataAdapter.Fill Daten merged. Heißt wenn du eine Fill Methode aufrufst und die DataTable die du übergibst enthält bereits Daten werden die schon in der Datatable enthaltenen Rows mit korrelierendem PK durch die aktuellen Daten ersetzt.


ralph71 - Di 22.11.16 08:40

Nix schräge UI.
Hintergrund: Das DataGridView ist nur zur Auswahl der Datensätze gedacht. D.h. der Benutzer wählt 5 Sätze aus, das Programm holt sich die restlichen Daten aus der Datenbank und bildet damit die Grundlage für einen Serienbrief.
Der Benutzer sieht von alledem nichts. Er sieht nur das fertige Word-Serienbriefdokument, das natürlich deutlich mehr Inhalte aus der Datenbank anzeigt als der DataGridView.

Ich muss also nichts ersetzen, sondern temporär die Basis für den Serienbrief erstellen. Und das geht ja über zB eine DataTable.


ralph71 - Di 22.11.16 10:11

Habs,

C#-Quelltext
1:
2:
3:
4:
5:
6:
...
List<string> conditions = new List<string>();
....
conditions.Add(lokID); //  --> die lokID ist der Rückgabewert aus der markierten Row
.....
sqlstring += " WHERE MeinFeld= " + string.Join(" OR MeinFeld= ", conditions.ToArray());

:-)

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Ralf Jansen - Di 22.11.16 10:53

Ok, war wohl verwirrt von "restlichen Felder nachgeladen werden."
Im Prinzip ist das das was du tun musst. Ich würde aber eher eine IN Klausel verwenden anstatt die Or Verknüpfung.


C#-Quelltext
1:
sqlstring += " WHERE MeinFeld IN (" + string.Join("," conditions.ToArray()) + ")";                    


ralph71 - Di 22.11.16 11:34

Sehr gut! Danke.