vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
DGV 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DGV nach bestimmten Werten sortieren 
Autor: effeff
Datum: 21.03.19 10:17

Du kannst das sehr einfach haben, indem Du schlicht in Deiner Datenbanktabelle ein weiteres Feld einfügst, welches nur eine Sortierzahl aufnimmt. Bei "Boot" also z. B. eine 1, bei "Auto" dann eine 2 etc. Bei einem Klick auf den entsprechenden Spaltenheader hättest Du die von Dir gewünschte Sortierung...

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel