Autor Beitrag
chip777
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Fr 23.04.10 08:04 
Hat sich geklärt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
// Get the DefaultViewManager of a DataTable.
DataView view = table.DefaultView;

// By default, the first column sorted ascending.
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: 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.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
// Get the DefaultViewManager of a DataTable.
DataView view = table.DefaultView;
// By default, the first column sorted ascending.
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: Fr 23.04.10 13:17 
Hallo Martin,
user profile iconchip777 hat folgendes geschrieben Zum zitierten Posting springen:
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).

user profile iconchip777 hat folgendes geschrieben Zum zitierten Posting springen:
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):
ausblenden C#-Quelltext
1:
RobName = (string)table.Rows[k]["NameRoboter"];					

Das Standardverfahren geht sonst so:
ausblenden C#-Quelltext
1:
2:
3:
4:
int i = 123;
string output = i.ToString();
// übrigens geht auch dies:
output = 2010.ToString();

Damit ginge es auch so:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Mo 26.04.10 09:33 
Hi,

ich hab immer noch ein Problem:

So starte ich die Sortierung:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
// Get the DefaultViewManager of a DataTable.
DataView view = table.DefaultView;

// By default, the first column sorted ascending.
view.Sort = "NameRoboter";


Danach folgt diese Schleife: (Convert.ToString bitte ignorieren, dass änder ich noch)
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Mo 26.04.10 12:09 
Ich hab es mit Hilfe eines Workarounds geschafft, das ganze ist nicht schön aber es funktioniert.