按列对Listview进行排序

3
我有一个关于使用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个回答

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


@Emman,你需要选择列而不是项目。只有当你例如点击“名称”时,它才会按名称排序,点击“日期”时,它才会按日期排序。你想在点击项目时发生什么吗?(编辑:但是在图像中我看到它们按“Int”排序。看起来它对你有效。) - M.kazem Akhgary
我的代码中的FillItems函数并没有按照int类型排序。另外,我不太明白你关于列的说法,因为正如你所看到的,我有一个ColumnClick事件,每当我点击一列时,它都会按升序或降序排序。但我的问题是我找不到错误出在哪里。 - Emman
1
在您的“ColumnClick”事件开头设置一个断点。以调试模式启动程序。点击列,看它是否触发了。如果它已经触发且程序停止在断点上,请按下“F11”键。每次按下“F11”键,都会向前走一行。所以检查一切,并尝试找到问题所在。如果事件从未触发,这意味着您尚未将事件注册到列表视图中。@Emman - M.kazem Akhgary
1
看这个GIF动画图,我是如何做到的。希望能帮到你。如果你的问题不在这里,那么只凭提供的信息我无法再提供更多帮助了。 - M.kazem Akhgary
什么鬼?!真的是列点击事件的问题。谢谢啊!下次我会更经常地检查属性。 - Emman
我认为你应该在答案中发布GIF。 - Emman

1

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

只需交换这两行。

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

[编辑]: 刚刚意识到设置ListviewItemSorter的值会导致LV排序:即使不调用listView1.Sort(),您的代码似乎也可以正常工作

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


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

1
虽然这段代码可能回答了问题,但提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - Sneftel
1
ListViewColumnSorter是什么?!! - asmgx
同意 - 这段代码不能直接编译。关于类型的一些信息呢? - stigzler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接