Um die Spalten einer ListView sortieren zu können muss man eine Klasse schreiben, die das Interface IComparer implementiert.
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;
}
}
4 Kommentare zum Snippet