| |
VB.NET - Ein- und UmsteigerDGV nach bestimmten Werten sortieren | | | Autor: Bloing | Datum: 21.03.19 07:03 |
| Guten Morgen zusammen,
gibt es eine Möglichkeit eine Spalte im DGV nach ganz [u]bestimmten Werten zu sortieren? Also weder nach Zahlen noch nach Buchstaben. Um zu verdeutlichen was ich meine, hier ein kleines Beispiel:
Ich habe 6 Werte in einer Spalte die immer wieder vorkommen. Nennen wir sie mal Auto, Boot, Fahrrad, Laufen, Motorrad, Zug.
Wenn ich jetzt die Spalte Sortiere schaut es selbstverständlich so aus:
Auto
Auto
Auto
Auto
Boot
Boot
Fahrrad
Laufen
Motorrad
Motorrad
Zug
Ich hätte aber gerne, dass zuerst alle "Boot" Einträge zuerst stehen, gefolgt von allen "Motorrad" Einträgen, dann erst "Auto" etc.
Das ganze natürlich idealerweise ohne, dass ich den Wert verändere. Also das zb meine Werte "1 Boot", "2 Motorrad" oder so heissen.
Ich google schon eine zeit lang rum, finde aber nicht wirklich einen Ansatz zur Lösung meines Problems, vielleicht weiß ja hier wer weiter :/
LG,
Bloing | |
Re: DGV nach bestimmten Werten sortieren | | | Autor: Manfred X | Datum: 21.03.19 08:51 |
| Hallo!
Um die Werte in dieser Weise sortieren zu können,
mußt Du eine Liste erstellen, in der die Werte
stehen und durch deren Einträge (Abfolge) die
gewünschte Sortierreihenfolge festgelegt wird.
Woher soll diese Information komen?
Wird die im Programm per Code festgelegt?
Was geschieht, wenn Werte ins Grid/in die Table
geladen werden, die nicht in dieser "Vorgabeliste"
stehen?
Erkläre genauer die Herkunft der Daten,
den Zweck dieser "Sortierung", die Zahl
der Sortiervarianten usw.
Wenn Du die (vollständige) Vorgabeliste besitzt,
wird auf dieser Basis ein Comparer erstellt. | |
Datagridview: ComparerByList | | | Autor: Manfred X | Datum: 21.03.19 09:40 |
| Ein Windows.Forms-Formular zur Demonstration
der Nutzung eines Custom-Comparers im Grid
Public Class frmDGVSortComparerDemo
Dim dgv As New DataGridView With
{.Parent = Me, .Size = New Size(300, 400)}
Dim WithEvents btnSort As New Button With
{.Parent = Me, .Top = 420, .Text = "Sort"}
Dim comparerlist As New List(Of String)
Private Sub frmDGVSortComparerDemo_Load(sender As Object,
e As EventArgs) Handles MyBase.Load
Me.Width = 320
Me.Height = 500
'Vorgabeliste für Sortierreihenfolge
With comparerlist
.AddRange({"Boot", "Motorrad", "Auto", "Zug", "Laufen"})
End With
'Testdaten ins Grid eintragen
Dim rndm As New Random(1234)
dgv.Columns.Add("Mobilität", "Mobilität")
For i As Integer = 0 To 100
dgv.Rows.Add(comparerlist(rndm.Next(comparerlist.Count)))
Next i
End Sub
Private Sub btnSort_Click(sender As Object,
e As EventArgs) Handles btnSort.Click
'Comparer erstellen und anwenden
dgv.Sort(New ComparerByList With
{.sortorderlist = comparerlist.ToArray,
.sortcolumn = "Mobilität"})
End Sub
Private Class ComparerByList
Implements System.Collections.IComparer
'Ein DatagridviewComparer für Stringspalten
'nach einem Array dessen Einträge die Reihenfolge vorgeben
Private _sortorderlist As Array
Private _sortColumn As String
Public Property sortorderlist As Array
Set(value As Array)
_sortorderlist = value
End Set
Get
Return _sortorderlist
End Get
End Property
Public Property sortcolumn As String
Set(value As String)
_sortColumn = value
End Set
Get
Return _sortColumn
End Get
End Property
Public Function Compare(x As Object, y As Object) As Integer _
Implements IComparer.Compare
'Rows casten
Dim row_x As DataGridViewRow = DirectCast(x, DataGridViewRow)
Dim row_y As DataGridViewRow = DirectCast(y, DataGridViewRow)
'Werte aus der gewünschten Sortierspalte auslesen
Dim val_x As String = row_x.Cells(_sortColumn).Value.ToString
Dim val_y As String = row_y.Cells(_sortColumn).Value.ToString
'Indices der Werte in der Vorgabeliste suchen
Dim index_x As Integer = Array.IndexOf(_sortorderlist, val_x)
Dim index_y As Integer = Array.IndexOf(_sortorderlist, val_y)
'Arrayindices vergleichen
Return index_x.CompareTo(index_y)
End Function
End Class
End Class
Beitrag wurde zuletzt am 21.03.19 um 09:42:59 editiert. | |
Re: DGV nach bestimmten Werten sortieren | | | Autor: Bloing | Datum: 21.03.19 09:54 |
| Hi Manfred,
danke schon mal für den Hinweis mit der Liste - so ähnlich habe ich mir das schon gedacht, aber noch keine wirkliche Idee wie ich das umsetzen kann
Das DGV fülle ich mit Daten aus einer Access-Datenbank in etwa so (Die Namen etc habe ich jetzt mal vereinfacht).
"Aktion" wäre jetzt die Spalte in der [u]immer entweder Auto, Boot, Fahrrad etc steht.
"Datum" ist die Standard-Sortierung.
SQLstr = ("Select Aktion, Datum, Feld3, Feld4, Feld5 FROM Tabelle1 Order By" & _
"Datum ASC")
Dim reader As OleDbDataReader = Command.ExecuteReader()
Dim dt = New DataTable
dt.Load(reader)
Datagridview1.DataSource = dt
reader.Close() Nun werden knapp 150 Datensätze ins DGV geladen und diese besondere Sortierung sollte nur greifen, wenn ich auf den Header der "Aktion"-Spalte klicke.
Der Zweck dahinter in diesem Beispiel wäre, dass ich 50 Datensätze mit "Auto" habe. Wichtig wäre es allerdings auf den ersten Blick immer alle "Boot" Einträge zu sehen, von denen wesentlich weniger existieren und die dann an erster Stelle stehen. Danach kann dann der Rest kommen.
LG,
Bloing
Edit: Da hab ich mir mit meiner Antwort leider ein bischen zu viel Zeit gelassen. Danke Manfred für die Demo, da muss ich mich jetzt erst ein wenig durchknabbern das ich es verstehe
Beitrag wurde zuletzt am 21.03.19 um 10:01:42 editiert. | |
Re: DGV nach bestimmten Werten sortieren | | | Autor: Manfred X | Datum: 21.03.19 10:03 |
| Du füllst keine Daten in das Grid.
Du füllst statt dessen eine Datatable.
Deshalb funktioniert mein Beispiel in dem Fall nicht!!!
In dieser Table, die Du füllst, stehen Werte aus der Datenbank.
Woher erhälst Du die Sortierreihenfolge?
Können in dieser Datenbank-Spalte nur bestimmte Werte eingetragen
werden oder können dort beliebige Werte stehen? | |
Re: DGV nach bestimmten Werten sortieren | | | Autor: Bloing | Datum: 21.03.19 10:14 |
| Haw, ok - entschuldige :/
Ich sollte klarer ausdrücken wie ich was mache bzw vorhabe.
Also in dieser "Aktion"-Spalte können nur die 6 vorgegebenen Werte stehen und nie etwas anderes.
Die Spalte in der Datenbank ist als kurzer Text formatiert. | |
Re: DGV nach bestimmten Werten sortieren | | | Autor: Bloing | Datum: 21.03.19 10:31 |
| Hi effeff,
die Idee finde ich auch nicht schlecht.
Es wäre allerdings super, wenn man diese Spalte dann nicht sehen würde.
Ist es möglich, dass wenn ich eine solche Spalte mit einbauen würde und diese auf hide setze, mit einem klick auf den Spaltenheader von "Aktion" nach der versteckten Spalte sortiere?
LG,
Bloing | |
Re: DGV nach bestimmten Werten sortieren | | | Autor: Manfred X | Datum: 21.03.19 10:40 |
| Du kannst eventuell auch die geladenen Datensätze
in der DataTable in die gewünschte Reihenfolge bringen.
(Bei mehr als einigen Hundert Datensätzen wäre allerdings
ein effizienterer Sortieralgorithmus nötig.)
Public Class frmDGVSortComparerDemo
Dim dt As New DataTable
Dim bs As New BindingSource
Dim dgv As New DataGridView With
{.Parent = Me, .Size = New Size(300, 400)}
Dim comparerlist As New List(Of String)
Private Sub frmDGVSortComparerDemo_Load(sender As Object,
e As EventArgs) Handles MyBase.Load
Me.Width = 320
Me.Height = 500
'Vorgabeliste für Sortierreihenfolge
With comparerlist
.AddRange({"Boot", "Motorrad", "Auto", "Zug", "Laufen"})
End With
'Testdaten in Table eintragen
dt.Columns.Add("Mobilität")
For i As Integer = 0 To 100
dt.Rows.Add(comparerlist(rndm.Next(comparerlist.Count)))
Next i
OrderTableRows()
bs.DataSource = dt
dgv.DataSource = bs
End Sub
Private Sub OrderTableRows()
With dt.Rows
Dim row As DataRow = dt.NewRow
For i As Integer = 0 To .Count - 2
For k As Integer = i + 1 To .Count - 1
Dim val_i As String = .Item(i).Field(Of String)("Mobilität")
Dim val_k As String = .Item(k).Field(Of String)("Mobilität")
Dim ind_i As Integer = comparerlist.IndexOf(val_i)
Dim ind_k As Integer = comparerlist.IndexOf(val_k)
If ind_i > ind_k Then
row.ItemArray = .Item(i).ItemArray
.Item(i).ItemArray = .Item(k).ItemArray
.Item(k).ItemArray = row.ItemArray
End If
Next k
Next i
End With
dt.AcceptChanges()
End Sub
End Class
Beitrag wurde zuletzt am 21.03.19 um 10:46:29 editiert. | |
Re: DGV nach bestimmten Werten sortieren | | | Autor: Bloing | Datum: 21.03.19 11:08 |
| Woow super! Das funktioniert!
Vielen vielen vielen Dank Manfred =)
Ich habs sogar geschafft deinen Code so einzubauen, dass er erst ganz normal die Daten aus der Datenbank zieht und mit der Standard-Sortierung anzeigt und wenn ich dann auf den Header der "Besonderen" Spalte klicke sortiert er es in der gewünschten Reihenfolge. (das soll für mich schon was heißen^^)
Nochmal tausend Dank
Edit: mehr als 200 werden es nie werden, da immer wieder welche rausgelöscht und hinzugefügt werden
Beitrag wurde zuletzt am 21.03.19 um 11:10:16 editiert. | |
Re: DGV nach bestimmten Werten sortieren | | | Autor: Manfred X | Datum: 21.03.19 11:27 |
| Nur um Mißverständnisse zu vermeiden:
Datensätze in einer Datenbank haben keine
definierte Reihenfolge.
Möchte man eine Reihung eintragen, benötigt
man dafür eine Spalte, die diese Information liefert.
Die DB-Datensätze, die in eine Datatable eingetragen
werden, besitzen ebenfalls keine definierte Reihung,
außer man erstellt per SQL-Befehl eine solche (z.B. ORDER BY)
Beim Sortieren im Programm wird nur ein Sortier-Zeiger auf
die geladenen Datensätze erstellt und über diesen Zeiger
werden die Daten in der entsprechenden Reihenfolge im Control
angeliefert. (Die Bindingsource (Sort) greift auf Standardcomparer
der Spalten-Datentypen zu.)
Mein Beispiel "simuliert" einen entsprechenden SQL-Befehl
bzw. eine integrierte DB-Abfrageroutine und muß direkt nach
dem Laden der Datensätze ausgeführt werden noch ehe die
Datenbindung eingerichtet ist. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere InfosTipp des Monats März 2024 Dieter OtterUTF-8 Konvertierung von Dateien und StringsVB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|