Question

When a ListView is in virtual mode, you are responsible for feeding the ListView a ListItem corresponding to index n when it asks through the OnRetrieveItem event.

i sort my list according to my own rules, and tell the listview to repaint:

listView1.Invalidate();

That's fine and dandy.

Except when the user has selected some items. Now when the tree repaints, different items are selected.

What is the technique to sort SelectedIndices?

But if i sort my own personal list

Was it helpful?

Solution

You'll need to store the selected objects, sort, find the objects by their new indices and reselect them.

The code could look something like this (optimize it as you see fit):

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 );
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top