Listview按列排序

时间:2015-10-14 08:06:55

标签: c# sorting listview

我有一个关于使用C#Windows窗体按列排序ListView的作业,我从MSDN获得的代码不起作用。任何人都可以找出代码有什么问题吗?每次我点击ListView列都没有任何反应。

以下是代码,我还添加了将在ListView

中显示的项目
private int sortColumn = -1;


    private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
    {
        // Determine whether the column is the same as the last column clicked.
        if (e.Column != sortColumn)
        {
            // Set the sort column to the new column.
            sortColumn = e.Column;
            // Set the sort order to ascending by default.
            listView1.Sorting = SortOrder.Ascending;
        }
        else
        {
            // Determine what the last sort order was and change it.
            if (listView1.Sorting == SortOrder.Ascending)
                listView1.Sorting = SortOrder.Descending;
            else
                listView1.Sorting = SortOrder.Ascending;
        }

        // Call the sort method to manually sort.
        listView1.Sort();
        // Set the ListViewItemSorter property to a new ListViewItemComparer
        // object.
        this.listView1.ListViewItemSorter = new ListViewItemComparer(e.Column,
                                                          listView1.Sorting);
    }

    private void FillItems()
    {
        // Add items
        ListViewItem item1 = new ListViewItem("Nipun Tomar");
        item1.SubItems.Add("1");
        item1.SubItems.Add("10/11/2000");

        ListViewItem item2 = new ListViewItem("First Last");
        item2.SubItems.Add("2");
        item2.SubItems.Add("12/12/2010");


        ListViewItem item3 = new ListViewItem("User User");
        item3.SubItems.Add("3");
        item3.SubItems.Add("12/01/1800");


        ListViewItem item4 = new ListViewItem("Sample");
        item4.SubItems.Add("4");
        item4.SubItems.Add("05/30/1900");


        // Add the items to the ListView.
        listView1.Items.AddRange(
                                new ListViewItem[] {item1, item2, item3, item4});
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        FillItems();
    }


    public class ListViewItemComparer : IComparer
    {

        private int col;
        private SortOrder order;
        public ListViewItemComparer()
        {
            col = 0;
            order = SortOrder.Ascending;
        }
        public ListViewItemComparer(int column, SortOrder order)
        {
            col = column;
            this.order = order;
        }
        public int Compare(object x, object y) 
        {
            int returnVal= -1;
            returnVal = String.Compare(((ListViewItem)x).SubItems[col].Text,
                            ((ListViewItem)y).SubItems[col].Text);
            // Determine whether the sort order is descending.
            if (order == SortOrder.Descending)
                // Invert the value returned by String.Compare.
                returnVal *= -1;
            return returnVal;
        }


    }

注意:我在设计表单中添加了列。

这是我的作业的样子:

enter image description here

3 个答案:

答案 0 :(得分:4)

列表视图中没有任何列。它们只是物品。这就是事件listView1_ColumnClick永远不会发生的原因。 (还要确保已将此事件添加到列表视图中。)

Form1_Load事件的第一个位置添加此内容以初始化列。

// set view mode to see columns
listView1.View = View.Details;

// 100 is just a length of column. HorizontalAlignment.Left starts from left side    
listView1.Columns.Add("Name", 100, HorizontalAlignment.Left);
listView1.Columns.Add("Number", 100, HorizontalAlignment.Left);
listView1.Columns.Add("Date", 100, HorizontalAlignment.Left);

现在,您可以看到可以选择它们的列,以按该列对项目进行排序。

请注意,我刚刚添加了3列。因此列表视图将按顺序在列下显示每个项目的2个子项目。

正如您要求发布GIF一样。这是它:)

enter image description here

答案 1 :(得分:1)

在设置比较器之前调用listView1.Sort()this.listView1.ListViewItemSorter = ...

只需颠倒两行。

另外,请注意您对所有列使用string.Compare,我认为这不是您想要的第3列(日期)

[编辑]: 刚刚意识到设置ListviewItemSorter的值会导致LV排序:即使不调用listView1.Sort()

,您的代码似乎也能正常工作

问题必须在其他地方。尝试使用调试器设置断点...

答案 2 :(得分:0)

    private void lvw_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
    {

        ListViewColumnSorter sorter = new ListViewColumnSorter();
        sorter.SortColumn = e.Column;
        sorter.Order = System.Windows.Forms.SortOrder.Ascending;
        lvw.ListViewItemSorter =sorter;
        lvw.Sort();
    }