c# - 如何在ListView中对内容进行排序?

标签 c# winforms sorting listview

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

当每列(问题、答案、类型)上触发 Click 事件时,如何按字母顺序对所有项目进行排序?

最佳答案

好吧,您可以使用 DataGrid 而不是列表框,这会让事情变得更简单, 但无论如何,您也可以自己实现。 这是我在 ListView 上使用过的一个示例:

实现ColumnClick事件:

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();
    }

该方法使用该类进行比较,您可以复制它并使用它:

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;
        }
    }
} 

关于c# - 如何在ListView中对内容进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4638760/

相关文章:

c# - 使用C#为每三位数字添加逗号

c# - WinForms 上的单向绑定(bind)?

java - 在JAVA中这种排序叫什么?

java - 按 int(权重)、字符串(名称)或 toString() 对 .txt 列表进行排序

java - 从文本文件中读取行,并通过将行中的值写入新的文本文件中,按平均值对行中的值进行排序

c# - 在 Dapper Multiple Results 中,当 where 子句取决于第一个查询的结果时,如何让第二行查询工作?

c# - 在 Unity 中一般根据分数分配正确的 Sprite

javascript - 如何从 Javascript 调用 URL Action ?

windows - 在 Windows Forms 窗体上动态添加控件

c# - 后台线程如何挂起 UI 线程?