私の音楽プレーヤーは、詳細モードで ListView を使用してトラックを表示し、ListViewGroup を使用してアルバム トラックをグループ化します。
アルバムの ListViewGroup が中クリックされたときに、1 つのアルバム内のすべてのトラックを削除するイベントを作成しました。トラックを削除するときに ListView が下にスクロールされない場合、正常に動作します。ListView を下にスクロールすると、アルバムは削除されますが、ヘッダーと最初のグループの間に、ListView の上部にクリックできない大きな空白が表示されます。
最初の画像、ListView の 3 つのアルバム (上にスクロール)

2 番目の画像、最後のアルバムが削除されました。すべて問題ありません。

OK、アイテムの1つのグループを削除すると、ListViewが下にスクロールされます
3 番目の画像、ListView の 3 つのアルバム (下にスクロール)

4 番目の画像、最後のアルバムが削除され、上部に空のスペースが表示され、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;
}
}
}