Проверить все элементы в списке с огромным элементом списка? - PullRequest
1 голос
/ 19 декабря 2011

Я хочу проверить около 3000 пунктов в listview.Это немного кода:

foreach (ListViewItem item in this.lvItem.Items)
{
    item.Checked = !item.Checked;
}

Но просмотр списка очень медленный, когда проверяется элемент.Пожалуйста, дайте мне несколько идей, чтобы решить эту проблему?Благодарю.

Ответы [ 6 ]

1 голос
/ 16 марта 2018

У меня была та же проблема, но я нашел причину.

У меня был обработчик события ItemChecked, прикрепленный к моему listView, который делал какие-то тяжелые вещи.

Я удалил eventHandler и онрешил мою проблему.Попробуйте удалить любой обработчик события ItemChecked и посмотрите, улучшена ли скорость.

0 голосов
/ 06 февраля 2019

Вам нужно позвонить BeginUpdate до цикла и EndUpdate после цикла:

listView1.BeginUpdate();
foreach (ListViewItem item in listView1.Items)
    item.Checked = true;
listView1.EndUpdate();

Вызов BeginUpdate запрещает рисование элемента управления до тех пор, пока не будет вызван метод EndUpdate.

0 голосов
/ 24 мая 2017
for (int i = 0; i <= listView1.Items.Count - 1; i++)
{
     if (!listView1.Items[i].Checked)
     listView1.Items[i].Checked = true;
}
0 голосов
/ 13 июля 2015

Я также не думаю, что разумно ожидать, что пользователь нажмет 3000 элементов. Но кое-что, что я сделал недавно, при добавлении элементов, зная, что их никогда не будет много и по умолчанию их следует проверять, - это проверка элементов до добавления их в список.

Примерно так:

foreach (Recipient recipient in recipients)
{
    var item = new ListViewItem(recipient.FirstName + " " + recipient.LastName);
    item.Tag = recipient;
    item.Checked = true;
    lvRicipients.Items.Add(item);
}
0 голосов
/ 19 декабря 2011

Я слышал слух, что для больших элементов списка цикл for будет работать быстрее, чем цикл foreach. попробовать

for(int i = 0; i = < this.1vItem.Items.Count; i++)
{
//Stuff
}
0 голосов
/ 19 декабря 2011

Будет ли что-то подобное для вас работать?... если установлен флажок, добавлять элементы в словарь ... если флажок снят, удалить из словаря.Не проверенный код, но интересно, можно ли сделать что-то вроде этого:

Dictionary<String, ListViewItem> Dic = listView.Items 
    .Cast<ListViewItem>() 
    .ToDictionary(x => x.Text, x => x.SubItems[0].Checked); 

Вы спросили, как лучше это сделать.То, что я говорю, есть на вашем событии проверки, вы захотите добавить элементы в ваш список.Я сомневаюсь, что пользователь на самом деле проверит все 3000, поэтому измените ваш код, чтобы решить, как вы хотите обработать проверенные элементы, в приведенном мной примере используется лямбда-выражение.Если вы не знакомы, измените ваш вопрос, чтобы отразить, что вам действительно нужно и / или нужно ...

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