如何检查listView列是否包含多个项目?

时间:2016-05-25 18:44:11

标签: c# .net winforms sorting listview

我想在点击listView列时进行排序。 在这种情况下,我在构造函数中有3列:

ListViewCostumControl.lvnf.View = View.Details;
            ListViewCostumControl.lvnf.SuspendLayout();
            ListViewCostumControl.lvnf.LabelEdit = true;
            ListViewCostumControl.lvnf.Columns.Add("From", 100, HorizontalAlignment.Left);
            ListViewCostumControl.lvnf.Columns.Add("Subject", 200);
            ListViewCostumControl.lvnf.Columns.Add("Date", 300);
            ListViewCostumControl.lvnf.Sorting = SortOrder.None;
            ListViewCostumControl.lvnf.SelectedIndexChanged += lvnf_SelectedIndexChanged;
            ListViewCostumControl.lvnf.Click += lvnf_Click;
            ListViewCostumControl.lvnf.MouseDown += lvnf_MouseDown;
            ListViewCostumControl.lvnf.ColumnClick += lvnf_ColumnClick;

“从” “学科” “日期”

所以我希望当我点击其中一列的顶部进行排序时,取决于列名称From,Subject,Date前两个From和Subject我不知道可以用它做什么样的排序但是我如何对Date列进行排序?

void lvnf_ColumnClick(object sender, ColumnClickEventArgs e)
        {
            if (e.Column.
                ListViewCostumControl.lvnf.ListViewItemSorter = new ListViewItemComparer(e.Column);
        }

我开始制作if(e.Column。 我试图首先检查它们中的任何一个是否包含多于一个项目,如果不是没有理由进行排序。

其次我不确定该行:

ListViewCostumControl.lvnf.ListViewItemSorter = new ListViewItemComparer(e.Column);

有什么好处吗?

我现在尝试的是点击事件中的此代码:

void lvnf_ColumnClick(object sender, ColumnClickEventArgs e)
        {
            ListViewSorter Sorter = new ListViewSorter();
            ListViewCostumControl.lvnf.ListViewItemSorter = Sorter;
            if (!(ListViewCostumControl.lvnf.ListViewItemSorter is ListViewSorter))
                return;
            Sorter = (ListViewSorter)ListViewCostumControl.lvnf.ListViewItemSorter;

            if (Sorter.LastSort == e.Column)
            {
                if (ListViewCostumControl.lvnf.Sorting == SortOrder.Ascending)
                    ListViewCostumControl.lvnf.Sorting = SortOrder.Descending;
                else
                    ListViewCostumControl.lvnf.Sorting = SortOrder.Ascending;
            }
            else
            {
                ListViewCostumControl.lvnf.Sorting = SortOrder.Descending;
            }
            Sorter.ByColumn = e.Column;

            ListViewCostumControl.lvnf.Sort();
        }

类ListViewSorter

public class ListViewSorter : System.Collections.IComparer
        {
            public int Compare(object o1, object o2)
            {
                if (!(o1 is ListViewItem))
                    return (0);
                if (!(o2 is ListViewItem))
                    return (0);

                ListViewItem lvi1 = (ListViewItem)o2;
                string str1 = lvi1.SubItems[ByColumn].Text;
                ListViewItem lvi2 = (ListViewItem)o1;
                string str2 = lvi2.SubItems[ByColumn].Text;

                int result;
                if (lvi1.ListView.Sorting == SortOrder.Ascending)
                    result = String.Compare(str1, str2);
                else
                    result = String.Compare(str2, str1);

                LastSort = ByColumn;

                return (result);
            }


            public int ByColumn
            {
                get { return Column; }
                set { Column = value; }
            }
            int Column = 0;

            public int LastSort
            {
                get { return LastColumn; }
                set { LastColumn = value; }
            }
            int LastColumn = 0;
        }

现在的问题是我每次都可以点击第一列进行排序,但是在其他两列上我每次只能点击一次。在我的逻辑中,我应该能够一直点击每一列来排序它吗?例如,在Date列中,如果我单击一次然后再次单击它应该按最新到最旧的日期排序,但只有在我第一次单击其他列时才能单击日期列。

1 个答案:

答案 0 :(得分:0)

这行代码应该可以正常工作。至于检查列是否有内容,这是相当不必要的。由于您有3列,并且可能总是如此,因此按没有数据的列排序仍然是排序的有效选项。虽然它只是简单地将其分类为现状。如果该列存在,则它已经具有某种形式的数据参考列表的使用,即使该数据目前包含空值。

如果您确实使用了继续没有数据的列,我建议您查看在需要时生成列的动态列表视图,看看它是否更适合您的程序。

** ListViewCostumControl拼写错误