2016-01-22 28 views
5

Mam właściciela rysowane ListBox na powiązanie formularza (Windows Forms) ze źródłem danych (BindingList). Muszę zapewnić możliwość szybkiego wyboru wszystkich elementów (do 500000).Jak szybko wybrać wszystkie elementy w ListBox?

To co jestem obecnie robi:

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

To jest bardzo powolna i nie do zaakceptowania. Czy ktokolwiek zna lepsze rozwiązanie?

+0

lepszego stanowienia trochę wysiłku, aby zmniejszyć tę liczbę elementów zamiast. – Steve

+0

Nie korzystałem z formularzy przez długi czas. Czy jesteś w stanie zrobić coś jak 'listBox.SelectedItems = listBox.Items'? A dla "SelectedIndexes"? – Rob

+0

@Steve: Niezła próba;) Nie, to nie jest opcja. – Norman

Odpowiedz

8

Zakładając, że jest to Windows Forms Problem: Windows Forms opracuje zmiany po każdej wybranej pozycji. Aby wyłączyć rysowanie i włączyć go po zakończeniu, użyj metod: i.

listBox.BeginUpdate(); 

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

listBox.EndUpdate(); 
+0

Spróbuję ... – Norman

+0

Idealnie! To dużo szybciej. – Norman

+0

Cześć Norman, czy możesz to zrobić? – Maertin

0
+0

@ Sugestia MauriceStam w połączeniu z tym może być najlepszym rozwiązaniem (Nie jestem pewien, czy 'SelectAll' wewnętrznie wyłącza rysowanie czy nie) – Rob

+1

Zależy od tego, czy używa on WPF, czy Windows Forms. WF nie ma metody "SelectAll". – Aphelion

+1

To dla WPF. Pytający używa Windows Forms (ponieważ WPF nie ma 'SetSelected()'). –

0

znaleźć inny sposób, to „jeszcze szybciej”:

[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)); 
Powiązane problemy