Есть ли быстрый способ выбора всех элементов или инвертирования выбора в ListView? - PullRequest
0 голосов
/ 22 февраля 2010

Я могу быстро очистить выбор ListView, используя его метод SelectedIndices.Clear, но если я хочу выбрать все элементы, я должен сделать это:

for (int i = 0; i < lv.SelectedIndices.Count; i++)
{
    if (!lv.SelectedIndices.Contains(i))
        lv.SelectedIndices.Add(i);
}

и инвертировать выделение,

for (int i = 0; i < lv.SelectedIndices.Count; i++)
{
    if (lv.SelectedIndices.Contains(i))
        lv.SelectedIndices.Add(i);
    else
        lv.SelectedIndices.Remove(i);
}

Есть ли более быстрый путь?

Ответы [ 3 ]

2 голосов
/ 22 февраля 2010

Используйте свойство ListViewItem.Selected:

foreach(ListViewItem item in lv.Items)
    item.Selected = true;


foreach(ListViewItem item in lv.Items)
    item.Selected = !item.Selected;

РЕДАКТИРОВАТЬ : Это не будет работать в виртуальном режиме.

1 голос
/ 25 февраля 2010

К быстро выберите все элементы в ListView, посмотрите длинный ответ на на этот вопрос . Описанный здесь метод является практически мгновенным, даже для списков из 100 000 объектов И он работает с виртуальными списками.

ObjectListView предоставляет много таких полезных ярлыков.

Однако нет способа автоматически инвертировать выбор. Метод SLaks будет работать для обычных ListViews, но не для виртуальных списков, поскольку вы не можете перечислить коллекцию Items в виртуальных списках.

В виртуальном списке лучшее, что вы можете сделать, это что-то, что вы впервые предложили: *

static public InvertSelection(ListView lv) {
    // Build a hashset of the currently selected indicies
    int[] selectedArray = new int[lv.SelectedIndices.Count];
    lv.SelectedIndices.CopyTo(selectedArray, 0);
    HashSet<int> selected = new HashSet<int>();
    selected.AddRange(selectedArray);

    // Reselect everything that wasn't selected before
    lv.SelectedIndices.Clear();
    for (int i=0; i<lv.VirtualListSize; i++) {
        if (!selected.Contains(i))
            lv.SelectedIndices.Add(i);
    }
}

HashSet - это .Net 3.5. Если у вас его нет, используйте Dictionary для быстрого поиска.

Имейте в виду, это все еще не будет молниеносно для больших виртуальных списков. Каждый lv.SelectedIndices.Add(i) вызов по-прежнему будет вызывать событие RetrieveItem.

0 голосов
/ 22 февраля 2010

Вы можете просто установить свойство Selected класса ListViewItem.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...