2016-01-22 3 views
5

У меня есть ownerdrawn ListBox на форме (Windows Forms), привязанной к источнику данных (BindingList). Мне нужно предоставить возможность очень быстро выбрать все предметы (до 500 000).Как быстро выбрать все элементы в ListBox?

Это то, что я сейчас делаю:

for (int i = 0; i < listBox.Items.Count; i++) 
    listBox.SetSelected(i, true); 

Это невероятно медленно и не приемлемо. Кто-нибудь знает лучшее решение?

+0

Лучше сделать некоторое усилие, чтобы уменьшить это количество элементов вместо этого. – Steve

+0

Не использовали формы в течение длительного времени. Можете ли вы сделать что-то вроде 'listBox.SelectedItems = listBox.Items'? А для 'SelectedIndexes'? – Rob

+0

@Steve: Хорошая попытка;) Нет, это не вариант. – Norman

ответ

8

Предполагая, что это Windows Forms проблема: Windows Forms нарисует изменения после каждого выбранного элемента. Чтобы отключить рисование и включить его после того, как вы закончите, используйте методы BeginUpdate() и EndUpdate().

listBox.BeginUpdate(); 

for (int i = 0; i < listBox.Items.Count; i++) 
    listBox.SetSelected(i, true); 

listBox.EndUpdate(); 
+0

Я дам ему попробовать ... – Norman

+0

Отлично! Это намного быстрее. – Norman

+0

Привет, Норман, Не могли бы вы поставить код для этого. – Maertin

0
+0

@ Предложение MauriceStam в сочетании с этим может быть лучшим решением (не уверен, что 'SelectAll' внутренне отключает чертеж или нет) – Rob

+1

Это зависит от того, использует ли он WPF или Windows Forms. У WF нет метода SelectAll. – Aphelion

+1

Это для WPF. Вопросник использует Windows Forms (поскольку WPF не имеет 'SetSelected()'). –

0

нашел еще один способ, это «более быстрый»:

[DllImport("user32.dll", EntryPoint = "SendMessage")] 
internal static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam); 

// Select All 
SendMessage(listBox.Handle, 0x185, (IntPtr)1, (IntPtr)(-1)); 

// Unselect All 
SendMessage(listBox.Handle, 0x185, (IntPtr)0, (IntPtr)(-1)); 
Смежные вопросы