Autor |
Beitrag |
chip777
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: Fr 23.04.10 07:44
Hi,
Ich habe einen DataTable, bzw. zu Testzwecken momentan auch ein DataGridView. In der ersten Spalte sind einige Einträge doppelt vorhanden. Leider sind alle Einträge unsortiert. Ich würde jetzt gerne bewerkstelligen das alle Einträge die gleich sind, hintereinander geordnet sind, diese Operation sollte direkt im DataTable möglich sein, da das DataGridView im fertigen Programm nicht mehr vorhanden sein soll.
Die erste Spalte heißt NameRoboter, mein DataTable table. Um die Funktionalität nochmal zu erklären: wenn ich im DataGridView auf die Spalte klicke wird diese geordnet, und genau das würde ich gerne schon im Programm realisieren und zwar schon im DataTable.
Martin
|
|
chip777 
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: Fr 23.04.10 08:04
Hat sich geklärt:
C#-Quelltext 1: 2: 3: 4: 5:
| DataView view = table.DefaultView;
view.Sort = "NameRoboter"; |
Edit: Ich muss die Frage nochmal öffnen, der Code den ich gefunden habe, ordnet nur das View, nicht aber die Daten. Ich vergebe danach eine ID, die bei Zeile 1 startet und dann weiterlaufen soll, die arbeitet aber immernoch so, als ob der DataTable nicht sortiert ist. Wie kann ich diesen also "richtig" sortieren.
|
|
chip777 
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: Fr 23.04.10 09:22
laut Internet gibt es keine Möglichkeit den DataTable zu ordnen, sondern nur das View -.-
kann ich dieses dann wenigstens wieder als DataTable speichern? Ansonsten müsste ich nämlich ziemlich viel im Programmcode ändern, um alle Operationen auf das DataGridView anzuwenden.
Eigentlich war das DataGridView nur zu Testzwecken da, und ich wollte es später löschen, aber scheinbar geht es nicht ohne.
Edit: vor einer Weile hab ich mal etwas über DataBinding oder so gelesen, wäre es denn möglich das Problem darüber in den Griff zu bekommen, sodass die Daten aus dem DataGridView automatisch an den DataTable übergeben werden?
Zuletzt bearbeitet von chip777 am Fr 23.04.10 09:29, insgesamt 1-mal bearbeitet
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Fr 23.04.10 09:26
Hast du das DataGridView (oder, sofern verwendet, eine BindingSource) noch an die DataTable oder inzwischen an die DataView gebunden? Letzteres ist nötig, damit die Sortierung auch sichtbar ist.
Jürgen
|
|
chip777 
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: Fr 23.04.10 09:31
Sichtbar ist die Sortierung im DataGridView. Das Problem ist, dass eben nur das DGV sortiert wird und nicht der DataTable. Wie funktioniert das mit der bindingSource? Vielleicht hilft das ja.
Hier mal noch ein weiteres Stück Code um mein Problem zu verdeutlichen.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| DataView view = table.DefaultView; view.Sort = "NameRoboter";
string RobName = ""; for (int k = 0; k != table.Rows.Count; k++) { if (RobName == Convert.ToString(table.Rows[k]["NameRoboter"])) { table.Rows[k]["NameRoboter"] = ""; } RobName = Convert.ToString(table.Rows[k]["NameRoboter"]); } |
Mit der Schleife ist es möglich alle doppelten Namen zu löschen, allerdings nur wenn der DataTable geordnet ist, außerdem muss ich ihn sowieso für die spätere Nutzung ordnen und da würde sich das an dieser Stelle anbieten.
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Fr 23.04.10 11:38
Hallo,
da musst wohl noch etwas umdenken. Eine DataTable ist (ebenso wie eine Datenbank-Tabelle) grundsätzlich eine unsortierte Datenmenge. Wenn du aus logischen Gründen eine bestimmte Sortierung benötigst, dann gehört sie bereits in den SELECT-Befehl mit ORDER BY.
Die Sortierung zur Laufzeit ändert, wie du gemerkt hast, die Reihenfolge in der DataTable überhaupt nicht. Es handelt sich - wie der Name DataView auch sagt - um eine spezielle (sortierte) Sicht auf die Daten. Aber du kannst damit (fast) genauso gut arbeiten wie mit der DataTable: Die DataView enthält eine Menge von Zeilen, die als DataRowView bezeichnet werden und auf die genauso wie auf eine DataRow zugegriffen werden kann. Also kannst du z.B. die IDs der doppelten Datensätze holen und damit die doppelten Zeilen in der DataTable löschen.
Übrigens ist in dieser Situation die Konvertierung durch (string) besser als Convert.ToString (Letzteres ist fast nie sinnvoll, da es ToString für jedes Objekt gibt). In der Tabelle steht schließlich ein String; das ist dem Compiler nur mitzuteilen, aber eine wirkliche Konvertierung ist nicht erforderlich.
Gruß Jürgen
|
|
chip777 
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: Fr 23.04.10 12:55
Ok,
dann muss ich wohl doch ziemlich große Codesegmente nochmal ändern, um alles an das DataGridView anzupassen, anstelle des DataTable.
Aber bitte erkläre mir nochmal wie die Konvertierung durch (string) anstelle von Convert.ToString funktioniert, denn im Moment nutze ich immer Convert.ToString. Am besten mal ein Beispiel posten.
Danke,
Martin
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Fr 23.04.10 13:17
Hallo Martin,
chip777 hat folgendes geschrieben : | dann muss ich wohl doch ziemlich große Codesegmente nochmal ändern, um alles an das DataGridView anzupassen, anstelle des DataTable. |
Das wäre ein übles Missverständnis. Wenn die Daten behandelt werden sollen, sind die Datenklassen zu benutzen (DataTable oder ggf. DataView, allenfalls BindingSource). Du meinst hoffentlich, dass das DGV an die Daten-Objekte anzupassen ist (nicht umgekehrt).
chip777 hat folgendes geschrieben : | Aber bitte erkläre mir nochmal wie die Konvertierung durch (string) anstelle von Convert.ToString funktioniert, denn im Moment nutze ich immer Convert.ToString. |
Ganz einfach (von dir kopiert):
C#-Quelltext 1:
| RobName = (string)table.Rows[k]["NameRoboter"]; |
Das Standardverfahren geht sonst so:
C#-Quelltext 1: 2: 3: 4:
| int i = 123; string output = i.ToString(); output = 2010.ToString(); |
Damit ginge es auch so:
C#-Quelltext 1:
| RobName = table.Rows[k]["NameRoboter"].ToString(); |
Aber wie gesagt: Wenn (mit Sicherheit) keine wirkliche Konvertierung nötig ist, dann benutze die direkte Umwandlung.
Gruß Jürgen
|
|
chip777 
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: Mo 26.04.10 09:33
Hi,
ich hab immer noch ein Problem:
So starte ich die Sortierung:
C#-Quelltext 1: 2: 3: 4: 5:
| DataView view = table.DefaultView;
view.Sort = "NameRoboter"; |
Danach folgt diese Schleife: (Convert.ToString bitte ignorieren, dass änder ich noch)
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| for (int k = 0; k != dataGridView2.Rows.Count; k++) { if (RobName == Convert.ToString(dataGridView2[0, k].Value)) { dataGridView2[0, k].Value = ""; } RobName = Convert.ToString(dataGridView2[0, k].Value); } |
Das Problem ist folgendes, eigentlich sollte die Liste einmal sortiert werden, danach wollte ich dann die Schleife ausführen, allerdings wird die Liste ständig wieder neu sortiert, kann ich die Sortierung auch wieder ausschalten?
|
|
chip777 
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: Mo 26.04.10 12:09
Ich hab es mit Hilfe eines Workarounds geschafft, das ganze ist nicht schön aber es funktioniert.
|
|