Winforms: The element added to the group is not displayed in the ListView after adding of group

Created on 23 Sep 2020  路  3Comments  路  Source: dotnet/winforms

  • .NET Core Version: 5.0.100-rc.1.20420.14

  • Have you experienced this same bug with .NET Framework?: Yes, tested in net472, netcoreapp3.1

Repro steps:

  1. Create application with ListView.
  2. Create ListViewGroup
  3. Add ListViewItem to ListViewGroup
  4. Add ListViewGroup to ListView.
  5. Or use attached project WindowsFormsApp3.zip

Actual:
ListViewItem is not displayed in ListView because ListItemView.ListView = null. I think ListView should be set for item when we add group with this item to ListView.

As a result ListViewItem.AccesibleObject may either throw InvalidOperationException, when attempting to access an item which added to a group, but have not link to the listview (2), or have a stable/incorrect reference to the listview when its group is removed from the listview (3)

Expected:

  1. ListViewItem is displayed in ListView, if added to a group which is then added to a listview.
  2. ListViewItem has a reference to the listview, when a group is added to the listview
  3. ListViewItem has a reference to the listview removed, when a group is removed from the listview

Notes:

```
var group = new ListViewGroup("Test group");

// this item is not shown in the listview, and doens't have reference to listview
// i.e. item1.ListView = null
ListViewItem item1 = new ListViewItem("You don't see me");
group.Items.Add(item1);
listView2.Groups.Add(group);

// this items is shown in the listview, item2.ListView <-- listView2
ListViewItem item2 = new ListViewItem("You see me", group);
listView2.Items.Add(item2);

```

bug work in progress up-for-grabs

All 3 comments

The issue 3439 maybe be part of it.

Self contained test:

[WinFormsFact]
public void ListViewGroupCollection_Add_ListViewGroupWithItems_Success()
{
    var item = new ListViewItem();
    var group = new ListViewGroup();
    group.Items.Add(new ListViewItem());
    group.Items.Add(item);

    using var control = new ListView();
    ListViewGroupCollection collection = control.Groups;

    Assert.Equal(0, collection.Add(group));
    Assert.Same(group, Assert.Single(collection));
    Assert.Same(control, group.ListView);
    Assert.Same(control, item.ListView);
    Assert.Same(group, item.Group);
    Assert.Equal(new ListViewItem[] { item }, control.Items.Cast<ListViewItem>());
    Assert.False(control.IsHandleCreated);
}

Failures:

  1. item.ListView is null
Assert.Same(control, item.ListView);
  1. control.Items is empty
Assert.Equal(new ListViewItem[] { item }, control.Items.Cast<ListViewItem>());

@hughbe assigning to you since you've started on it.

Was this page helpful?
0 / 5 - 0 ratings