При нажатии кнопки выбирается следующий элемент в ListView. Как это сделать?

У меня есть две кнопки, Next и Previous.
При нажатии кнопки Next должен быть выбран следующий элемент в ListView.
Кнопка Previous должна работать так же, как кнопка Next, но наоборот: предыдущие элементы должны быть выбрано.

Я пробовал это, но это не сработало:

private void button3_Click(object sender, EventArgs e)
{
    if (listView1.SelectedIndices < listView1.Items.Count - 1)
    {
        listView1.SelectedIndices = listView1.SelectedIndices + 1;
    }
}

Есть идеи ?


person Creesch    schedule 03.03.2019    source источник


Ответы (1)


Вы не можете напрямую добавить элемент в коллекцию SelectedIndices: он доступен только для чтения.
Вместо этого вы можете установить [ListViewItem].Selected = true: элемент будет добавлен в коллекцию.

Затем мы просто проверяем, попадает ли следующий или предыдущий индекс Item в границы коллекции ListView Items, и выбираем/отменяем его выбор.

Я добавил ListView.Items[X].EnsureVisible(), чтобы список прокручивался вверх и вниз, когда элемент выбран/не выбран.

private void btnNext_Click(object sender, EventArgs e)
{
    if (listView1.Items.Count == 0) return;
    int currentItem = listView1.SelectedItems.Count == 0 
                    ? -1 
                    : listView1.SelectedItems[listView1.SelectedItems.Count - 1].Index;
    if (currentItem < listView1.Items.Count - 1) {
        listView1.Items[currentItem + 1].Selected = true;
        listView1.Items[currentItem + 1].EnsureVisible();
    }
    listView1.Focus();
}

С помощью этого метода кнопка Previous выбирает назад:

private void btnPrevious_Click(object sender, EventArgs e)
{
    if (listView1.Items.Count == 0) return;
    int currentItem = listView1.SelectedItems.Count == 0
                    ? -1
                    : listView1.SelectedItems[0].Index;
    if (currentItem > 0)
    {
        listView1.Items[currentItem - 1].Selected = true;
        listView1.Items[currentItem - 1].EnsureVisible();
    }
    listView1.Focus();
}

В этом другом методе кнопка Previous действует как деселектор:

private void btnPrevious_Click(object sender, EventArgs e)
{
    if (listView1.Items.Count > 0 && listView1.SelectedItems.Count > 0) {
        int currentItem = listView1.SelectedItems[listView1.SelectedItems.Count - 1].Index;
        listView1.Items[currentItem].Selected = false;
        listView1.Items[currentItem].EnsureVisible();
    }
    listView1.Focus();
}
person Jimi    schedule 03.03.2019
comment
Следующая кнопка работала отлично! Спасибо большое. Предыдущая кнопка... не очень. Он отменил выбор выбранного элемента. Я хотел, чтобы предыдущий элемент был выбран. Но все равно большое спасибо! :D - person Creesch; 03.03.2019
comment
Вы хотите оставить выбранным один элемент? Последний? Или вы хотите, чтобы кнопка «Назад» просто выбирала элементы, скажем, в обратном порядке? Я задумал это как неселектор (своего рода). - person Jimi; 03.03.2019
comment
Правильно, я хотел, чтобы предыдущая кнопка выбирала один элемент назад. Точно так же, как следующая кнопка, но наоборот. Напротив следующей кнопки - person Creesch; 03.03.2019
comment
Большое спасибо ! Я ценю это! Я не знаю, что еще я мог бы сказать :D - person Creesch; 03.03.2019