我想在点击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列中,如果我单击一次然后再次单击它应该按最新到最旧的日期排序,但只有在我第一次单击其他列时才能单击日期列。
答案 0 :(得分:0)
这行代码应该可以正常工作。至于检查列是否有内容,这是相当不必要的。由于您有3列,并且可能总是如此,因此按没有数据的列排序仍然是排序的有效选项。虽然它只是简单地将其分类为现状。如果该列存在,则它已经具有某种形式的数据参考列表的使用,即使该数据目前包含空值。
如果您确实使用了继续没有数据的列,我建议您查看在需要时生成列的动态列表视图,看看它是否更适合您的程序。
** ListViewCostumControl拼写错误