[英]Empty space appears at the top of ListView when removing Groups
我的音乐播放器在“详细信息”模式下使用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事件。 然后,我检查是否有用户点击的项目。 如果用户单击组,则该项目为null,并且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;
}
}
}
这是所有发生的原因,因为从ListView
删除项目显然会引发Form1_Layout
事件。 在其中,如果表单布局发生更改,我将使用listView1.BeginUpdate() ...
调整listView1的大小。 不知何故弄乱了我的listView。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.