2016-01-22 12 views
5

Tôi có một ListBox chủ sở hữu trên một biểu mẫu (Windows Forms) ràng buộc với một nguồn dữ liệu (BindingList). Tôi cần cung cấp tùy chọn để chọn tất cả các mục (tối đa 500000) thực sự nhanh chóng.Cách chọn tất cả các mục trong ListBox thật nhanh?

Đây là những gì tôi hiện đang thực hiện:

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

này là cực kỳ chậm và không thể chấp nhận được. Có ai biết một giải pháp tốt hơn?

+0

Better làm cho một số nỗ lực để giảm con số các mặt hàng thay thế. – Steve

+0

Đã không sử dụng biểu mẫu trong một thời gian dài. Bạn có thể làm một cái gì đó như 'listBox.SelectedItems = listBox.Items'? Và đối với 'SelectedIndexes'? – Rob

+0

@Steve: Rất tốt;) Không, không có lựa chọn nào. – Norman

Trả lời

8

Giả sử đây là một vấn đề Windows Forms: Windows Forms sẽ vẽ những thay đổi sau mỗi mục đã chọn. Để tắt tính năng vẽ và bật nó sau khi bạn sử dụng xong các phương pháp BeginUpdate()EndUpdate().

listBox.BeginUpdate(); 

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

listBox.EndUpdate(); 
+0

Tôi sẽ thử lại ... – Norman

+0

Hoàn hảo! Điều này nhanh hơn rất nhiều. – Norman

+0

Hi Norman, Bạn có thể đặt mã cho điều đó không. – Maertin

0
+0

@ Đề xuất của MauriceStam cùng với điều này có thể là giải pháp tốt nhất (Không chắc chắn nếu 'SelectAll' vô hiệu hóa nội bộ vẽ hay không) – Rob

+1

Nó phụ thuộc vào việc anh ta đang sử dụng WPF hay Windows Forms. WF không có phương thức 'SelectAll'. – Aphelion

+1

Đó là dành cho WPF. Người hỏi đang sử dụng Windows Forms (vì WPF không có 'SetSelected()'). –

0

Tìm thấy một cách khác, đó là "nhanh hơn":

[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)); 
Các vấn đề liên quan