Скрытие ListViewItem на основе фильтра - PullRequest
1 голос
/ 19 мая 2010

Я хочу скрыть некоторые элементы на основе текстового фильтра в ListView (WinForms).
По сути, просмотр списка загружает элементы из текстового файла, и я не хочу, чтобы он читался и / или записывался, когда пользователь просматривает список. Поиск выполняется в событии KeyDown комбинированного списка, но свойство ListViewItem отсутствует «Visible».

Есть ли простой способ сделать это, БЕЗ перечитывания файла? (поскольку это файл XML, и он может даже содержать тысячи элементов, будет трудно эффективно выполнять поиск и даже позволить пользователю использовать приложение, поскольку поиск будет занимать минуты (в основном с загрузкой)). *

Ответы [ 4 ]

2 голосов
/ 19 мая 2010

Возможно, вы испытываете задержку из-за перерисовки списка во время каждой операции добавления / удаления. Попробуйте обернуть свою опцию «Добавить / удалить» в метод «Начать / закончить обновление» следующим образом.

myListView.BeginUpdate();
//Add or Remove Items
myListView.EndUpdate();

Теперь почувствуй скорость.

Конечно, вы должны загрузить файл только один раз.

1 голос
/ 19 мая 2010

Мне не понятно, что вы пытаетесь сделать. Я все еще выскажу несколько идей, может быть, что-то поможет ...

  • Кэширование файла в памяти
  • Кэшировать прочитанные элементы и заполнять поле ввода на лету
  • Добавьте и удалите элементы соответственно
  • Посмотрите на этот вопрос
  • Может быть, это невозможно в конце концов?

Извините, если я вас неправильно понял. (

0 голосов
/ 11 декабря 2014

Это не лучший ответ, но вроде лучшее решение, которое я нашел. Вы можете реализовать событие ListView.DrawItem , чтобы сделать что-то вроде этого:

    void listView_DrawItem(object sender, DrawListViewItemEventArgs e)
    {               
        if (Should_Filter(e.Item) == false)
            e.DrawDefault = true;                   
        else
            e.DrawDefault = false;
    }

Затем измените порядок всех элементов, чтобы отфильтрованные элементы оказались в конце ListView. Это как бы скроет их, но ListView все равно будет их подсчитывать при расчете его размера, поэтому вам также следует принудительно изменить размер клиентов ListView тоже.

0 голосов
/ 20 мая 2010

Решено с созданием отдельного класса для хранения данных и поиска его после загрузки файла.

Хотя запись изменений в файл все еще остается вопросом, но это уже другая история ...

...