Мой музыкальный проигрыватель использует ListView в режиме Details для отображения дорожек и ListViewGroup для группировки дорожек альбомов.
Я создал событие, которое удаляет все треки в одном альбоме, когда ListViewGroup альбома щелкается средней кнопкой мыши. Работает нормально, если ListView не прокручивается вниз при удалении дорожек. Если ListView прокрутить вниз, альбом будет удален, но в верхней части ListView между заголовками и первой группой появится большое пустое пространство, на которое нельзя щелкнуть.
Первое изображение, 3 альбома в ListView (прокручивается вверх)
Второй образ, последний альбом удален, все нормально!
Хорошо, тогда ListView прокручивается вниз при удалении одной группы элементов
Третье изображение, 3 альбома в ListView (прокрутка вниз)
Четвертое изображение, последний альбом удален, вверху появилось пустое место, а последние треки, если 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: добавлен код, чтобы проверить, была ли нажата группа
Поскольку нет реального способа обрабатывать групповой щелчок, я сделал это уродливым способом. Но это работает. Прежде всего, я использовал событие MouseDown в ListView. Затем я проверяю, есть ли элемент, на который нажимает пользователь. Если пользователь щелкает группу, то элемент равен нулю, а цикл 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;
}
}
}