首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当ListView在VirtualMode中时如何对ListView项进行排序?

当ListView在VirtualMode中时如何对ListView项进行排序?
EN

Stack Overflow用户
提问于 2009-09-02 09:45:15
回答 5查看 8.2K关注 0票数 2

我意识到我必须对ListView从中收集项的集合进行排序:

新的listCollection = ListView ListView();

但是,除非将ListView作为图形用户界面控件添加到表单中,否则这似乎不起作用,这反过来会使向其中添加项目变得非常慢,因此我必须首先在图形界面上使用VirtualMode。

有谁知道怎么做或者给我指出正确的方向?

EN

回答 5

Stack Overflow用户

发布于 2009-09-02 09:57:39

基本上,您将需要将排序应用于数据泵本身。

我在谷歌上快速搜索了一下listview sort virtualmode。第一个结果是this page,上面的引文就来自于此。

例如,如果您的数据源是DataView,则对其应用排序,而不是对ListView应用排序。

如果只是添加项目时的性能问题,我会按照barism的建议做;使用BeginUpdate/EndUpdate而不是VirtualMode。

代码语言:javascript
复制
try {
  listView1.BeginUpdate();
  // add items
}
finally {
  listView1.EndUpdate();
}
票数 3
EN

Stack Overflow用户

发布于 2009-09-02 11:46:01

如果使用的是虚拟模式,则必须对基础数据源进行排序。正如您可能已经发现的,ListViewItemSorter对虚拟列表什么也不做。

如果您正在使用非虚拟列表视图,则还可以使用AddRange(),它比一系列Add()快得多--除了使用前面已经介绍过的BeginUpdate/EndUpdate之外。

ObjectListView (围绕.NET WinForms ListView的开源包装器)已经使用了所有这些技术来提高速度。与普通ListView相比,这是一个很大的改进。它同时支持普通模式和虚拟模式列表视图,并使它们更易于使用。例如,排序是完全自动处理的。

票数 3
EN

Stack Overflow用户

发布于 2016-09-15 15:37:14

我在现有项目中切换VirtualMode True时也遇到了同样的问题,但解决方案却出奇地简单:

第一步,我要填充一个ListViewItem列表,而不是ListView.Items集合:

代码语言:javascript
复制
private List<ListViewItem> _ListViewItems;

然后,我实现了RetrieveVirtualItem方法

代码语言:javascript
复制
private void mLV_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
    e.Item = _ListViewItems[e.ItemIndex];
}

最后,我使用与之前相同的类对ListViewItem列表进行排序,我只需更改基类

代码语言:javascript
复制
_ListViewItems.Sort((System.Collections.Generic.IComparer<ListViewItem>)new ListViewItemComparer(new int[] { e.Column }, mLV.Sorting));

这是我的IComparer类实现:

代码语言:javascript
复制
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;
    }
}

希望这能对你有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1366743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档