views:

2965

answers:

4

I have a listview with two columns and I'm using a context menu to allow users to remove selected rows. To remove the selected rows, I've tried with the following code but it doesn't work:

private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
    listView1.SelectedItems.Clear();
}

I suspect this is because the listview has two columns, but I can't figure out a solution to remove selected rows. Removing all rows works with: listView1.Items.Clear();.

A: 

This seems to work:

    for (int i = 0; i < listView1.Items.Count; i++ )
    {

        if (listView1.Items[i].Selected)
        {
            listView1.Items[i].SubItems.Clear();
        }

    }

Is there any way to remove items and re-order the listView so that there are no empty rows in the middle of other rows?

BeefTurkey
A: 

This seems to be a better solution:

for (int i = 0; i < listView1.Items.Count; i++ )
{
    if (listView1.Items[i].Selected)
    {
        listView1.Items[i].Remove();
    }
}
BeefTurkey
A: 

What you can do:

foreach (ListViewItem Item in LstvClients.Items)
{    
     if (item.Selected)
     {
         LstvClients.Items.Remove(Item);
     }
}

(Yours is better, item.Remove())

PoweRoy
Actually, this won't move. You can't mess with a collection while you're iterating over it.
BFree
But it seems to work.
BeefTurkey
BFree: Yes it looks weird but it works
PoweRoy
A: 

The latest example of BeafTurkey looks correct, but he should decrement i after removing the item:

for (int i = 0; i < listView1.Items.Count; i++ )
{
    if (listView1.Items[i].Selected)
    {
        listView1.Items[i].Remove();
        i--;
    }
}

The index of items larger as i is decremented by 1 after the removal. So you should reposition i to match the next not tested item.

GvS
didn't think of that - thank you.
BeefTurkey