我的音乐播放器在详细信息模式下使用ListView来显示曲目,而ListViewGroup则将专辑曲目组合在一起。
我创建了一个事件,可以在中间点击相册的ListViewGroup时删除一个相册中的所有曲目。如果在删除曲目时ListView没有向下滚动,则工作正常。如果ListView向下滚动,相册将被删除,但ListView顶部,标题和第一组之间会出现大量不可点击的空白区域。
第一张图片,ListView中的3张专辑(向上滚动)
第二张图片,删除了最后一张专辑,一切都很好!
好的,然后在删除一组项目时向下滚动ListView
第三张图片,ListView中的3张专辑(向下滚动)
第四张图片,删除了最后一张专辑,顶部显示空白区域,如果ListView完全没有显示,则显示最后一张专辑!
我认为这与我的代码没有任何关系,而是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;
}
}
}
答案 0 :(得分:0)
所有这一切都发生了,因为从ListView
删除项目显然会触发Form1_Layout
事件。在那里,如果表单布局更改,我使用listView1.BeginUpdate() ...
来调整listView1的大小。不知怎的,搞砸了我的listView。