删除组时,ListView顶部会出现空白区域

时间:2014-07-24 22:10:12

标签: c# winforms listview listviewgroup

我的音乐播放器在详细信息模式下使用ListView来显示曲目,而ListViewGroup则将专辑曲目组合在一起。

我创建了一个事件,可以在中间点击相册的ListViewGroup时删除一个相册中的所有曲目。如果在删除曲目时ListView没有向下滚动,则工作正常。如果ListView向下滚动,相册将被删除,但ListView顶部,标题和第一组之间会出现大量不可点击的空白区域。

第一张图片,ListView中的3张专辑(向上滚动)

enter image description here


第二张图片,删除了最后一张专辑,一切都很好!

enter image description here


好的,然后在删除一组项目时向下滚动ListView

第三张图片,ListView中的3张专辑(向下滚动)

enter image description here


第四张图片,删除了最后一张专辑,顶部显示空白区域,如果ListView完全没有显示,则显示最后一张专辑!

enter image description here


我认为这与我的代码没有任何关系,而是ListView中的一个错误?有人注意到同样的行为有没有办法防止这种情况发生?


编辑:添加了删除项目的代码(按照用户的要求)

List<ListViewItem> delItems = new List<ListViewItem>(); // creating list of items to be removed

foreach (ListViewGroup group in listView1.Groups)
{
    if (Convert.ToInt32(group.Tag) == groupNumber) // all groups have individual number in tag field
    {
        foreach (ListViewItem item in group.Items)
        {
            delItems.Add(item);
        }
    }
}

foreach (ListViewItem item in delItems)
{
    item.Remove();
}

EDIT2:添加代码以检查是否点击了群组

由于没有真正的方法来处理群组点击,我做了丑陋的方式。但它的确有效。 首先,我在ListView中使用了MouseDown事件。然后我检查是否有用户点击的项目。如果用户单击组,则该项为空,并且for循环增加i并检查是否可以立即找到该项。当最终找到项目时,我们知道该项目属于我们单击的组。所以我们得到了物品组标签,在那里我记录了它是什么组。

private void listView1_MouseDown(object sender, MouseEventArgs e)
{
    ListViewItem item;

    for (int i = 0; i < 25; i++) // group height is not more that 25 pixels.
    {
        item = listView1.GetItemAt(e.X, e.Y + i);

        if (item != null)
        {
            if (i > 1) // bigger than 1, because there is 1 pixel gap between listviewitems when using groups
            {
                if (e.Button == MouseButtons.Middle) removePlaylistGroup(Convert.ToInt32(item.Group.Tag));
            }
            else
            {
                if (e.Button == MouseButtons.Middle) removePlaylistItem(item.Index);
            }
            break;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

所有这一切都发生了,因为从ListView删除项目显然会触发Form1_Layout事件。在那里,如果表单布局更改,我使用listView1.BeginUpdate() ...来调整listView1的大小。不知怎的,搞砸了我的listView。