当我对基础列表进行排序时,如何在虚拟模式下对ListView进行排序?

时间:2012-02-21 16:02:40

标签: winforms listview virtualmode

ListView处于虚拟模式时,您有责任在其询问时向ListView ListItem提供与索引n相对应的内容通过OnRetrieveItem活动。

我根据自己的规则对列表进行排序,并告诉列表视图重新绘制:

listView1.Invalidate();

那很好,花花公子。

除非用户选择了某些项目。现在,当树重新绘制时,会选择不同的项目。

SelectedIndices进行排序的技术是什么?

但如果我按自己的个人名单排序

1 个答案:

答案 0 :(得分:1)

您需要存储所选对象,按其新索引排序,查找对象并重新选择它们。

代码看起来像这样(根据您的需要优化它):

void listView1_ColumnClick( object sender, ColumnClickEventArgs args )
{
    // Store the selected objects
    List<MyDataObject> selectedObjects = new List<MyDataObject>();
    foreach ( int index in listView1.SelectedIndices )
    {
        selectedObjects.Add( m_MyDataObjectsColl[index] );
    }

    // Clear all selected indices
    listView1.SelectedIndices.Clear();

    // Sort the list
    SortListView(listView1, args);

    // Reselect the objects according to their new indices
    foreach ( MyDataObject selectedObject in selectedObjects )
    {
        int index = m_MyDataObjectsColl.FindIndex(
                delegate( MyDataObject obj ) { return obj == selectedObject; }
            );
        listView1.SelectedIndices.Add( index );
    }
}