0

私の音楽プレーヤーは、詳細モードで 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;
        }
    }
}
4

1 に答える 1

0

ListViewどうやら発火Form1_Layoutイベントからアイテムを削除したため、これはすべて起こっていました。そこで、listView1.BeginUpdate() ...フォームのレイアウトが変更された場合に listView1 のサイズを変更します。どういうわけか、それは私のリストビューを台無しにします。

于 2014-07-25T00:01:30.667 に答える