ich habe ein DataTable mit einer Spalte, 3 Zeilen und mit folgenden Inhalt
erzeugt:
1,0
2,0
11,00
und einem DataGridView als Quelle zugewiesen:
DataGridView1.DataSource = DataTable
Wenn ich jetzt diese Spalte im DataGridView1 aufsteigend sortiere, kommt
folgende Reihenfolge heraus:
1,0
11,00
2,0
Sicherlich logisch, da die 1 vor der 2 kommt. Für mich sich es aber Zahlen
(Millimeter) und keine Zeichen.
Wie kann ich das DataGridView1 einstellen, dass aufsteigend folgende
Reihenfolge erscheint:
1,0
2,0
11,00
Danke im Voraus
Grüße Thomas
P.S. Auch wenn ich das Komma durch einen Punkt ersetze wird es nicht besser.
Thomas Eisenmann schrieb:
> ich habe ein DataTable mit einer Spalte, 3 Zeilen und mit folgenden Inhalt
> erzeugt:
> 1,0
> 2,0
> 11,00
welchen Datentyp hat die Spalte - hier vermutlich String.
> und einem DataGridView als Quelle zugewiesen:
>
> DataGridView1.DataSource = DataTable
>
> Wenn ich jetzt diese Spalte im DataGridView1 aufsteigend sortiere, kommt
> folgende Reihenfolge heraus:
Das DataGridView sortiert nicht selbst, sondern verwendet die
Sortieroptionen der DataView (IBindingList.ApplySort, die wiederum
die Sortierung entsprechend dem Datentyp vornimmt.
> Sicherlich logisch, da die 1 vor der 2 kommt. Für mich sich es aber Zahlen
> (Millimeter) und keine Zeichen.
Wenn es Zahlen sind, so verwende den entsprechenden Datentyp
in der DataTable (z. B. Single/Double).
Sollten die Daten als Zeichenkette geliefert werden, konvertiere
sie beim Abruf.
Geht das überhaupt nicht (sollte aber normalerweise), kannst Du
eine berechnete Spalte an die DataTable anhängen. Die sich dann
aber nicht für die Eingabe im Grid eignet:
Dim table As New DataTable("Tabelle")
table.Columns.Add("Wert", GetType(String))
table.Rows.Add("1,0")
table.Rows.Add("2,0")
table.Rows.Add("11,0")
table.Rows.Add("9,87654321")
table.Columns.Add("Wert numerisch", GetType(System.Double), "CONVERT(Wert, 'System.Double')")
Dim view As DataView = New DataView(table, "", "[Wert numerisch] ASC", DataViewRowState.CurrentRows)
For Each row As DataRowView In view
Console.WriteLine("{0} {1}", row(0), row(1))
Next
> P.S. Auch wenn ich das Komma durch einen Punkt ersetze wird es nicht besser.
Daten sollte im nativen Format gespeichert, ein Komma oder Punkt wird
dann durch die Anzeige anhand der Kultur des Clients bei der
Ausgabeformatierung ausgewählt.
Gruß Elmar
> ich habe ein DataTable mit einer Spalte, 3 Zeilen und
> mit folgenden Inhalt erzeugt:
> 1,0
> 2,0
> 11,00
>
> und einem DataGridView als Quelle zugewiesen:
>
> DataGridView1.DataSource = DataTable
>
> Wenn ich jetzt diese Spalte im DataGridView1 aufsteigend
> sortiere, kommt folgende Reihenfolge heraus:
> 1,0
> 11,00
> 2,0
Das bedeutet, dass Du Deine Zahlenwerte nicht als
numerische Werte (Typ integer, single, double usw.)
sondern als Strings in Deiner DataTable speicherst.
Damit bekommst Du das Problem mit der "alphabetischen"
Sortierung und bei einer evtl. Weiterverarbeitung mit
Rechenoperationen müsstest Du diese Strings auch
erst noch in Werte mit numerischen Datentypen umwandeln.
Besser also gleich die Zahlen richtig speichern.
> Sicherlich logisch, da die 1 vor der 2 kommt. Für mich
> sich es aber Zahlen (Millimeter) und keine Zeichen.
Wenn Du diese Zahlendarstellungen als Strings gespeichert
hast, sind es eben keine num. Werte sondern eben Strings
mit einer bestimmten Anzahl von Zeichen.
>
> Wie kann ich das DataGridView1 einstellen, dass aufsteigend
> folgende Reihenfolge erscheint:
> 1,0
> 2,0
> 11,00
Hier mal ein Beispiel, welches eine DataTable erstellt,
dessen Daten in einem DataGridView angezeigt werden
und bei num. Feldwerten auch richtig sortiert werden.
' /// Code in einer leeren Form1
Public Class Form1
Private WithEvents DGV As DataGridView
Private mDT As DataTable
Private mDV As DataView
Private Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.Load
CreateData()
DGV = New DataGridView
With DGV
.Dock = DockStyle.Fill
.DataSource = mDV
End With
Me.Controls.Add(DGV)
DGV.AutoResizeColumns()
End Sub
Private Sub CreateData()
Dim Rnd As New Random(Now.Millisecond)
Dim i As Integer
Dim DR As DataRow
mDT = New DataTable
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns.Add("Text", GetType(String))
.Columns.Add("Num", GetType(Double))
For i = 1 To 12
DR = .NewRow
DR.Item(0) = i
DR.Item(1) = MonthName(i, True)
DR.Item(2) = _
Rnd.Next(10, 100) _
+ Rnd.NextDouble
.Rows.Add(DR)
Next
.AcceptChanges()
mDV = New DataView(mDT)
End With
End Sub
End Class
' \\\ E N T E
Nach dem Programmstart wird eine DataTable (mDT) mit
3 Spalten (ID=Integer, Text=String, Num=Double) und
über eine zur DataTable (mDT) erzeugte DataView (mDV)
an das DataGridView (DGV) gebunden.
Durch Klick auf die jeweiligen Spaltenköpfe werden
die numerischen Spalten 0 (ID) und 2 (Num) entspr. ihrem
Zahlenwert sortiert, die Spalte 1 (Text) dagegen wird
alphabetisch sortiert.
Mehr zum DataGridView, zu DataTables und DataViews
findest Du unter
www.gssg.de -> Visual Basic -> VB.net
Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
danke für die Antwort. Ich muß erkennten, dass mein Fragenansatz falsch war.
Ich versuch es noch mal:
Ich lade eine DataSet via XML-Datei. Anschließend nehme ich eine Tabelle vom
DataSet und weise diese einer DataTable zu Zum Schluß dem DatragridView
übergeben. So etwa:
Dim ds As DataSet
ds = New DataSet
ds.ReadXml(Dateiname, XmlReadMode.Auto)
Dim MyDataTable as Datatable
*
MyDataTable = ds.Tables(Tabellennummer)
**
DataGridView1.DataSource = MyDataTable
D.h. ich habe die Spalten in MyDataTable nicht selbst mit ".Add" erzeugt,
sodass ich den Datentyp auch nicht festlegen kann. Jetzt habe ich versucht
den Datentyp einer Spalte im MyDataTable zu ändern. Bei * ging das nicht,
weil die Spalte noch nicht existiert, und bei ** kommt eine Fehlermeldung,
dass der Datentyp der Spalte nicht änderbar ist, weil schon Daten darin
stehen.
Ich hoffe das ich der Ursache näher gekommen bin und es gibt eine Lösung
dafür.
Danke im Voraus.
Grüße Thomas
> Ich lade eine DataSet via XML-Datei. Anschließend nehme ich eine Tabelle
> vom
> DataSet und weise diese einer DataTable zu Zum Schluß dem DatragridView
> übergeben. So etwa:
>
> Dim ds As DataSet
> ds = New DataSet
> ds.ReadXml(Dateiname, XmlReadMode.Auto)
> Dim MyDataTable as Datatable
> *
> MyDataTable = ds.Tables(Tabellennummer)
> **
> DataGridView1.DataSource = MyDataTable
>
> D.h. ich habe die Spalten in MyDataTable nicht selbst mit ".Add" erzeugt,
> sodass ich den Datentyp auch nicht festlegen kann. Jetzt habe ich versucht
> den Datentyp einer Spalte im MyDataTable zu ändern. Bei * ging das nicht,
> weil die Spalte noch nicht existiert, und bei ** kommt eine Fehlermeldung,
> dass der Datentyp der Spalte nicht änderbar ist, weil schon Daten darin
> stehen.
>
> Ich hoffe das ich der Ursache näher gekommen bin und es gibt eine Lösung
> dafür.
Hi Thomas,
du musst vor dem Lesen der XML-Datei die Umgebung vorbereiten. Das bedeutet,
eine Tabelle mit passendem Namen anlegen und alle Felder passend mit Namen
und mit Typ, zu dem sich die Information aus der XML-Datei konvertieren
lässt. Danach kannst du ReadXML ausführen und die Information landet in den
betreffenden Tabellen und Spalten. Wenn etwas fehlt, wird das implizit
angelegt.
--
Viele Grüsse
Peter