我意识到我必须对ListView从中收集项的集合进行排序:
新的listCollection = ListView ListView();
但是,除非将ListView作为图形用户界面控件添加到表单中,否则这似乎不起作用,这反过来会使向其中添加项目变得非常慢,因此我必须首先在图形界面上使用VirtualMode。
有谁知道怎么做或者给我指出正确的方向?
发布于 2009-09-02 09:57:39
基本上,您将需要将排序应用于数据泵本身。
我在谷歌上快速搜索了一下listview sort virtualmode。第一个结果是this page,上面的引文就来自于此。
例如,如果您的数据源是DataView,则对其应用排序,而不是对ListView应用排序。
如果只是添加项目时的性能问题,我会按照barism的建议做;使用BeginUpdate/EndUpdate而不是VirtualMode。
try {
listView1.BeginUpdate();
// add items
}
finally {
listView1.EndUpdate();
}发布于 2009-09-02 11:46:01
如果使用的是虚拟模式,则必须对基础数据源进行排序。正如您可能已经发现的,ListViewItemSorter对虚拟列表什么也不做。
如果您正在使用非虚拟列表视图,则还可以使用AddRange(),它比一系列Add()快得多--除了使用前面已经介绍过的BeginUpdate/EndUpdate之外。
ObjectListView (围绕.NET WinForms ListView的开源包装器)已经使用了所有这些技术来提高速度。与普通ListView相比,这是一个很大的改进。它同时支持普通模式和虚拟模式列表视图,并使它们更易于使用。例如,排序是完全自动处理的。
发布于 2016-09-15 15:37:14
我在现有项目中切换VirtualMode True时也遇到了同样的问题,但解决方案却出奇地简单:
第一步,我要填充一个ListViewItem列表,而不是ListView.Items集合:
private List<ListViewItem> _ListViewItems;然后,我实现了RetrieveVirtualItem方法
private void mLV_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
e.Item = _ListViewItems[e.ItemIndex];
}最后,我使用与之前相同的类对ListViewItem列表进行排序,我只需更改基类
_ListViewItems.Sort((System.Collections.Generic.IComparer<ListViewItem>)new ListViewItemComparer(new int[] { e.Column }, mLV.Sorting));这是我的IComparer类实现:
class ListViewItemComparer : System.Collections.Generic.IComparer<ListViewItem>
{
int[] mColonne;
private System.Windows.Forms.SortOrder order;
public ListViewItemComparer(int[] mCols)
{
this.mColonne = mCols;
this.order = System.Windows.Forms.SortOrder.Ascending;
}
public ListViewItemComparer(int[] mCols, System.Windows.Forms.SortOrder order)
{
this.mColonne = mCols;
this.order = order;
}
public int Compare(ListViewItem x, ListViewItem y)
{
int returnVal = -1;
foreach (int mColonna in mColonne)
{
double mNum1;
double mNum2;
String mStr1 = "";
String mStr2 = "";
if ((x.SubItems[mColonna].Text == "NULL") && (x.SubItems[mColonna].ForeColor == Color.Red))
{
mStr1 = "-1";
}
else
{
mStr1 = x.SubItems[mColonna].Text;
}
if ((y.SubItems[mColonna].Text == "NULL") && (y.SubItems[mColonna].ForeColor == Color.Red))
{
mStr2 = "-1";
}
else
{
mStr2 = y.SubItems[mColonna].Text;
}
if ((double.TryParse(mStr1, out mNum1) == true) && (double.TryParse(mStr2, out mNum2) == true))
{
if (mNum1 == mNum2)
{
returnVal = 0;
}
else if (mNum1 > mNum2)
{
returnVal = 1;
}
else
{
returnVal = -1;
}
}
else if ((double.TryParse(mStr1, out mNum1) == true) && (double.TryParse(mStr2, out mNum2) == false))
{
returnVal = -1;
}
else if ((double.TryParse(mStr1, out mNum1) == false) && (double.TryParse(mStr2, out mNum2) == true))
{
returnVal = 1;
}
else
{
returnVal = String.Compare(mStr1, mStr2);
}
if (returnVal != 0)
{
break;
}
}
// Determine whether the sort order is descending.
if (order == System.Windows.Forms.SortOrder.Descending)
{
// Invert the value returned by String.Compare.
returnVal *= -1;
}
return returnVal;
}
}希望这能对你有所帮助。
https://stackoverflow.com/questions/1366743
复制相似问题