2 Stimmen

Wie sortiert man die Dinge in ListView?

Bild --> http://img502.imageshack.us/img502/511/87162943.png

Wie kann ich alle Elemente alphabetisch sortieren, wenn das Click-Ereignis auf jeder Spalte (Frage, Antwort, Typ) ausgelöst wird?

3voto

Notter Punkte 588

Nun, Sie könnten ein DataGrid anstelle eines Listenfeldes verwenden, was die Sache einfacher machen würde, aber Sie könnten es auch selbst implementieren. Hier ist ein Beispiel von etwas, das ich einmal auf einer ListView verwendet:

das Ereignis ColumnClick implementieren:

private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
    {
        // Determine if clicked column is already the column that is being sorted.
        if (e.Column == _lvwItemComparer.SortColumn)
        {
            // Reverse the current sort direction for this column.
            if (_lvwItemComparer.Order == SortOrder.Ascending)
            {
                _lvwItemComparer.Order = SortOrder.Descending;
            }
            else
            {
                _lvwItemComparer.Order = SortOrder.Ascending;
            }
        }
        else
        {
            // Set the column number that is to be sorted; default to ascending.
            _lvwItemComparer.SortColumn = e.Column;
            _lvwItemComparer.Order = SortOrder.Ascending;
        }

        // Perform the sort with these new sort options.
        listView1.Sort();
    }

dieser Mathod verwendet diese Klasse zum Vergleichen, Sie können sie kopieren und verwenden:

public class ListViewItemComparer : IComparer
{
    // Specifies the column to be sorted
    private int ColumnToSort;

    // Specifies the order in which to sort (i.e. 'Ascending').
    private  SortOrder OrderOfSort;

    // Case insensitive comparer object
    private CaseInsensitiveComparer ObjectCompare;

    // Class constructor, initializes various elements
    public ListViewItemComparer()
    {
        // Initialize the column to '0'
        ColumnToSort = 0;

        // Initialize the sort order to 'none'
        OrderOfSort = SortOrder.None;

        // Initialize the CaseInsensitiveComparer object
        ObjectCompare = new CaseInsensitiveComparer();
    }

    // This method is inherited from the IComparer interface.
    // It compares the two objects passed using a case
    // insensitive comparison.
    //
    // x: First object to be compared
    // y: Second object to be compared
    //
    // The result of the comparison. "0" if equal,
    // negative if 'x' is less than 'y' and
    // positive if 'x' is greater than 'y'
    public int Compare(object x, object y)
    {
        int compareResult;
        ListViewItem listviewX, listviewY;

        // Cast the objects to be compared to ListViewItem objects
        listviewX = (ListViewItem)x;
        listviewY = (ListViewItem)y;

        // Determine whether the type being compared is a date type.
        try
        {
            // Parse the two objects passed as a parameter as a DateTime.
            DateTime firstDate  = DateTime.Parse(listviewX.SubItems[ColumnToSort].Text);
            DateTime secondDate = DateTime.Parse(listviewY.SubItems[ColumnToSort].Text);

            // Compare the two dates.
            compareResult = DateTime.Compare(firstDate, secondDate);
        }

        // If neither compared object has a valid date format,
        // perform a Case Insensitive Sort
        catch
        {
            try
            {
                int num1 = int.Parse(listviewX.SubItems[ColumnToSort].Text);
                int num2 = int.Parse(listviewY.SubItems[ColumnToSort].Text);

                // Compare the two dates.
                compareResult = num1.CompareTo(num2);
            }
            catch
            {
               // Case Insensitive Compare
                compareResult = ObjectCompare.Compare(
                listviewX.SubItems[ColumnToSort].Text,
                listviewY.SubItems[ColumnToSort].Text
                );
            }
        }

        // Calculate correct return value based on object comparison
        if (OrderOfSort == SortOrder.Ascending)
        {
            // Ascending sort is selected, return normal result of compare operation
            return compareResult;
        }
        else if (OrderOfSort == SortOrder.Descending)
        {
            // Descending sort is selected, return negative result of compare operation
            return (-compareResult);
        }
        else
        {
            // Return '0' to indicate they are equal
            return 0;
        }
    }  

    // Gets or sets the number of the column to which to
    // apply the sorting operation (Defaults to '0').
    public int SortColumn
    {
        set
        {
            ColumnToSort = value;
        }
        get
        {
            return ColumnToSort;
        }
    }

    // Gets or sets the order of sorting to apply
    // (for example, 'Ascending' or 'Descending').
    public SortOrder Order
    {
        set
        {
            OrderOfSort = value;
        }
        get
        {
            return OrderOfSort;
        }
    }
}

0voto

Uwe Keim Punkte 38139

Weisen Sie den ListViewItemSorter Eigentum, wie beschrieben in dieser KB-Artikel .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X