【发布时间】:2023-03-30 14:34:02
【问题描述】:
我的音乐播放器在 Details 模式下使用 ListView 显示曲目,并使用 ListViewGroup 将专辑曲目分组。
当专辑的 ListViewGroup 被中键单击时,我创建了删除一张专辑中所有曲目的事件。如果 ListView 在删除曲目时没有向下滚动,则可以正常工作。如果 ListView 向下滚动,相册将被删除,但在 ListView 顶部,标题和第一组之间会出现大的不可点击的空白区域。
ListView 中的第一张图片,3 个相册(向上滚动)
第二张图片,上一张专辑已删除,一切都很好!
好的,那么ListView在移除一组item的时候向下滚动
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 事件。然后我检查是否有用户点击的项目。如果用户单击 group,则 item 为 null,for 循环增加 i 并检查是否现在可以找到 item。当最终找到项目时,我们知道该项目属于我们单击的组。所以我们得到项目组标签,我在其中记录它是什么组。
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;
}
}
}
【问题讨论】:
-
在不同的机器上运行时你能重现它吗?我同意您的评估,即可能与您的代码无关,但我以前从未见过这种情况。
-
是的,它发生在另一个 Win7 和 Win8.1 中。
-
@darx:你能告诉我们删除项目的代码吗?
-
@TaW:代码添加到原始问题。
标签: c# winforms listview listviewgroup