Как избежать тысяч ненужных событий ListView.SelectedIndexChanged? - PullRequest
16 голосов
/ 17 сентября 2008

Если пользователь выбирает все элементы в .NET 2.0 ListView, ListView будет запускать событие SelectedIndexChanged для каждого элемента, а не запускать событие, чтобы указать, что selection имеет измененное.

Если пользователь затем щелкает, чтобы выбрать только один элемент в списке, ListView запустит событие SelectedIndexChanged для каждого элемента, который становится невыбранным, а затем Событие SelectedIndexChanged для отдельного вновь выбранного элемента, а не событие, указывающее, что выбор изменился.

Если у вас есть код в обработчике событий SelectedIndexChanged , программа перестает отвечать на запросы, когда в списке появляется несколько сотен / тысяч элементов.

Я думал о таймерах задержки и т. Д.

Но есть ли у кого-нибудь хорошее решение, чтобы избежать тысяч ненужных ListView. SelectedIndexChange событий, когда действительно одно событие будет делать?

Ответы [ 14 ]

0 голосов
/ 07 июля 2009

Я рекомендую виртуализировать ваш список, если в нем несколько сотен или тысяч элементов.

0 голосов
/ 19 июня 2009

Может быть, это поможет вам достичь того, что вам нужно, без использования таймеров:

http://www.dotjem.com/archive/2009/06/19/20.aspx

Мне не нравится пользователь таймеров и т. Д. Как я также заявляю в посте ...

Надеюсь, это поможет ...

Ооо, я забыл сказать, что это .NET 3.5, и я использую некоторые функции в linq, чтобы выполнить «Оценку изменений выбора», если вы можете назвать это так: o ... O 1010

В любом случае, если вы используете более старую версию, эта оценка должна быть выполнена с небольшим количеством кода ...>. <... </p>

0 голосов
/ 17 сентября 2008

Я просто пытался решить эту проблему вчера. Я не знаю точно, что вы подразумеваете под «таймерами задержки», но я попытался реализовать свою собственную версию ожидания, пока все изменения не будут сделаны. К сожалению, единственный способ сделать это - создать отдельный поток, и получается, что когда вы создаете отдельный поток, ваши элементы пользовательского интерфейса недоступны в этом потоке. .NET создает исключение, утверждая, что элементы пользовательского интерфейса могут быть доступны только в потоке, в котором они были созданы! Итак, я нашел способ оптимизировать свой ответ на SelectedIndexChanged и сделать его достаточно быстрым, чтобы его можно было переносить - хотя это не масштабируемое решение. Будем надеяться, что у кого-то есть умная идея решить эту проблему в одном потоке.

0 голосов
/ 17 сентября 2008

Я бы попробовал привязать обратную передачу к кнопке, чтобы пользователь мог отправить свои изменения и отцепить обработчик событий.

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