2016-01-22 22 views
5

Ho un ListBox ownerdrawn su un form (Windows Form) che si lega a un'origine dati (BindingList). Devo fornire un'opzione per selezionare tutti gli elementi (fino a 500000) molto velocemente.Come selezionare tutti gli oggetti in un ListBox veramente veloce?

Questo è quello che sto facendo attualmente:

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

Questo è incredibilmente lento e non accettabile. Qualcuno conosce una soluzione migliore?

+0

Meglio fare qualche sforzo per ridurre il numero di elementi, invece. – Steve

+0

Non uso i moduli da molto tempo. Sei in grado di fare qualcosa come 'listBox.SelectedItems = listBox.Items'? E per 'SelectedIndexes'? – Rob

+0

@Steve: Bel tentativo;) No, non c'è alternativa. – Norman

risposta

8

Assumendo questo è un problema Windows Forms: Windows Form trarrà le modifiche dopo ogni elemento selezionato. Per disabilitare il disegno e abilitarlo dopo aver finito di usare i metodi BeginUpdate() e EndUpdate().

listBox.BeginUpdate(); 

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

listBox.EndUpdate(); 
+0

Ci provo io ... – Norman

+0

Perfetto! Questo è molto più veloce. – Norman

+0

Ciao Norman, puoi inserire il codice per quello. – Maertin

0
+0

@ Il suggerimento di MauriceStam accoppiato con questo potrebbe essere la soluzione migliore (Non sono sicuro se 'SelectAll' disattiva internamente il disegno o meno) – Rob

+1

Dipende se sta usando WPF o Windows Forms. WF non ha il metodo 'SelectAll'. – Aphelion

+1

Questo è per WPF. L'interrogante utilizza Windows Form (poiché WPF non ha 'SetSelected()'). –

0

trovato un altro modo, che è "più veloce":

[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));