Search code examples
c#.netwinformslistview

c# select listview item if two listviews contains it


In my program I have 2 listviews and 1 button. When I press the button, every listview item in the first listview will be selected in the second listview. The items in the first listview always exist in the second listview, but not the other way around.

I'm having trouble with selecting the items in the second listview. I'm trying to get the index with IndexOf.

foreach (ListViewItem item in firstListView.Items)
{
    int index = secondListView.Items.IndexOf(item);
    secondListView.Items[index].Selected = true;
}

I always get an error that index is -1 when I click the button. And I don't understand what I'm doing wrong.

SOLUTION

So what I tried to do here finding an index of an item which belongs to a different listview, and it doesn't work like that. Even though the text in both listviews are the same, the listview items are not identically the same because they are reference types.

I was not able to use the Text property because items could have the same text. So the solution I had was putting an unique integer in the Tag property for each ListViewItem. Since integers are value types, I can use that integer to check whether the ListViewItem in the first listview is in the second.

// Loop through each item in the first listview
foreach (ListViewItem item1 in firstListView.Items)
{
    // For each item in the first listview, loop through the second listview to find if it's there
    foreach (ListViewItem item2 in secondListView.Items)
    {
        // Check if item1 is identical to item2 by looking at its tag
        if (int.Parse(item1.Tag) == int.Parse(item2.Tag))
        {
            // The item has been found and will be selected!
            item2.Selected = true;
        }
    }
}

Solution

  • You can use such linq query to select items of the second list which exist in the first list too:

    var items = from i1 in listView1.Items.Cast<ListViewItem>()
                from i2 in listView2.Items.Cast<ListViewItem>()
                where i1.SubItems.Cast<ListViewItem.ListViewSubItem>()
                        .Where((s, i) => s.Text != i2.SubItems[i].Text).Count() == 0
                select i2;
    items.ToList().ForEach(x => { x.Selected = true; });
    

    Note: When to try to use secondListView.Items.IndexOf method to find an item which belongs to the firstListView you can not expect it to find the item. The item you are trying to find its index, doesn't exists in second listview's item collection. You should find items using Text property of the item and sub items.