Autor Beitrag
ralph71
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Mo 21.11.16 16:57 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Di 22.11.16 10:11 
Habs,
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

ausblenden C#-Quelltext
1:
sqlstring += " WHERE MeinFeld IN (" + string.Join("," conditions.ToArray()) + ")";					
ralph71 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Di 22.11.16 11:34 
Sehr gut! Danke.