Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1563 | Anzahl registrierter User: 1895 | Besucher online: 130
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

ListView Spalten sortieren


Autor: TBBsolutions
Sprache: C#
Bewertung:
noch nicht bewertet
Anzahl der Aufrufe: 11258
  
Kick it on dotnet-kicks.de  

Beschreibung:

Um die Spalten einer ListView sortieren zu können muss man eine Klasse schreiben, die das Interface IComparer implementiert.

Abgelegt unter: ListView, Sortieren, Spalten, nach Datum, .



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
public class ColumnSorter : IComparer
{
    private int col;
    private SortOrder order;
    public ColumnSorter()
    {
        col = 0;
        order = SortOrder.Ascending;
    }
    public ColumnSorter(int column, SortOrder order)
    {
        col = column;
        this.order = order;
    }
    
    public int Compare(object x, object y)
    {
        int result;
        
        try
        {
            // versuchen die 2 Werte als Datum zu vergleichen
            System.DateTime first =
                    DateTime.Parse(((ListViewItem)x).SubItems[col].Text);
            System.DateTime second =
                    DateTime.Parse(((ListViewItem)y).SubItems[col].Text);
            // Vergleichen der 2 Werte
            result = DateTime.Compare(first, second);
        }
        // Wenn der Vergleich nicht als Datum geht als string vergleichen
        catch
        {
            // Werte als string vergleichen
            result = String.Compare(((ListViewItem)x).SubItems[col].Text,
                        ((ListViewItem)y).SubItems[col].Text);
        }
        
        if (order == SortOrder.Descending)
        {
            //invertieren da desc
            result = result * -1;
        }
        return result;
    }
}

Im Programm reagiert man auf das ColumnClick event der ListView
//globale Variable um sich zu merken welche Spalte zuletzt benutzt wurde
private int lastsortColumn =-1; 

private void myListView_ColumnClick(object sender, ColumnClickEventArgs e)
{
    try
    {
        Cursor = Cursors.WaitCursor;
       
        // Behandlung wenn Spalte gerade sortiert wurde
        if (e.Column != lastsortColumn)
        {
            //Spalte merken
            lastsortColumn = e.Column;
            myListView.Sorting = SortOrder.Ascending;
        }
        else
        {
            //da Spalte zuvor sortiert wurde, in umgekehrter Reihenfolge sortieren
            if (myListView.Sorting == SortOrder.Ascending)
            {
                myListView.Sorting = SortOrder.Descending;
            }
            else
            {
                myListView.Sorting = SortOrder.Ascending;
            }
        }
        
        myListView.Sort();
        // ListViewItemSorter property neu setzen
        this.myListView.ListViewItemSorter = ColumnSorter(e.Column,myListView.Sorting);

    }
    catch (Exception ex)
    {
        //Fehlerbehandlung
    }
    finally
    {
        Cursor = Cursors.Default;
    }
}


Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Rainer Hilmer schrieb am:  16.06.2009 12:48:45

So wie ich das beim Überfliegen gesehen habe, wird entweder nach Datum oder nach String verglichen - und das auch noch über einen Try/Catch-Block. Wäre es nicht eleganter wenn die Compare-Methode zwei Objekte vom Typ IComparable entgegennimmt? Try/Catch ist eigentlich nicht für solche Aufgaben gedacht und hier eine Krücke.
Rainer Hilmer schrieb am:  16.06.2009 12:55:23

Siehe auch hier:
http://support.microsoft.com/kb/319401
TBBsolutions schrieb am:  18.06.2009 08:56:00

ich gebe zu es ist keine elegante Lösung, es erst als Datum zu probieren, aber wenn man die im Methode im Artikel probiert
compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text,listviewY.SubItems[ColumnToSort].Text);

werden die Felder nur als Text verglichen, und somit ist die Sortierung von Datums Spalten falsch.
Das Ganze wird durch das Try auch langsamer, besser wäre es sich Spalten, bei denen es nicht geht, da kein Datum, zu merken und es dann nicht mehr zu probieren, wobei es dann passieren kann, wenn einmal kein Wert in einer Zeile steht, die Sortierung auch nicht mehr richtig durchgeführt wird.
Marcus schrieb am:  14.12.2010 14:41:00

Hallo,

man könnte vor dem Vergleich den Datentyp mit "is" prüfen.

Beispiel:

if(x is datetime){}


oder die Methode "TryParse" verwendet.

Beispiel:

if(datetime.TryParse(((ListViewItem)x).SubItems[col].Text, out first)) {}


Diese Snippets könnten für Sie interessant sein:
[VB.NET] Text-Inhalt aller Listview-Items in die Zwischenablage kopie
[VB.NET] Ausgewählte ListView Items verschieben
[C#] Listview in Excel Sheet exportieren
[C#] Einträge in ListView verschieben
[C#] ListView SubItem farbig
[C#] Automatische Anpassung der Breite von GridViewColumns
[C#] ListView Gruppen aus Enum erzeugen
[C#] Reihenfolge der neu angeordneten ListView Spalten ermitteln.
[C#] Sort and search an ArrayList.
[VB.NET] Bucketsort Algorithmus für VB2005
[C#] BubbleSort Verfahren / Algorithmus
[VB.NET] Sortierte Liste der seriellen Ports
[VB.NET] Dateien nach Datum sortieren
[C#] SortableBindingList
[C#] Bubblesort
[C#] Erzeugen von Zeichenfolgen durch Permutation
[C#] Editierbare DataGridViewComboBox-Spalten
[C#] Spalten des WPF-DataGrid in .NET 4 anpassen
[C#] Integers
[C#] Search Plugin-DLLs with one line
[C#] sehr einfacher Timer
[C#] BindingList mit Sortierfunktion
[C#] Datei öffnen
[C#] byte-String in byte wandeln
[C#] Excel Spalten Bezeichnung nach Integer
[C#] Prozentual Textvergleichen
[C#] Console in eigene Form einbinden
[C#] Programm am Desktop andocken
[C#] lokale User und Gruppen administrieren
[C#] SimpleDb
[C#] Primärschlüsselwerte ermitteln
[C#] Automatisches Umbenennen eines Pfades
[C#] Connection-String Dialog öffnen
[C#] URL auslesen
[C#] Silverlight Anwendung erstellen
[C#] Text codieren
[VB.NET] ''Enter'' in TextBox
[C#] Programm RUN Check
[C#] Zufälliger Eintrag aus einer Liste (Extension Method)
[C#] XAML Grundlagen in Silverlight 3
[C#] MakeNiceSize()
[C#] 22 System Pfade abfragen
[C#] Zahlensysteme (BIN, HEX, OCT, DEZ) umrechnen
[C#] Form ohne Rahmen verschieben
[C#] Byte-Array in Struktur kopieren
[C#]
[VB.NET] Treenode-Tags zur verwendung abfragen [für Anfänger]
[C#] String to char Tarnung

schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.