Cách tăng tốc xử lý ListView

Nov 03 2020

Làm cách nào để tăng tốc độ xử lý điều khiển ListView?

Thông tin cơ bản: giải pháp này đang sử dụng MaterialSkin, vì vậy danh sách các điều khiển có sẵn của tôi bị hạn chế (chẳng hạn như không có ListBox hoặc DataGridView). Thứ hai, danh sách có số lượng mục lớn một cách bất hợp lý (trung bình 51 nghìn, một hoặc hai cột, tùy thuộc vào cài đặt), vì vậy tôi không mong đợi tốc độ cực nhanh, nhưng cũng không phải những gì tôi đang thấy.

Khi biểu mẫu đang đóng, tôi không cần bất kỳ thứ gì từ danh sách. Nó phục vụ mục đích của nó và có thể biến mất. Đây là những gì tôi đã thử:

Close();                    --- 16 seconds (just closing the form)

MyListView.Dispose();       --- 16 seconds

MyListView.Items.Clear();   --- 16 seconds

MyListView.Clear();         --- 17 seconds

MyListView.BeginUpdate();
MyListView.Items.Clear();   --- 16 seconds

Một cách hiệu quả, mọi tùy chọn tôi đã thử là ~ 16 giây để thoát khỏi danh sách. Bây giờ, mất khoảng 16 giây để điền danh sách, một điều mà tôi cũng đang xem xét - nhưng ít nhất thì thời gian cũng có lý do tôi đang làm quá tải danh sách nghèo nàn này với quá nhiều bản ghi. Và ở đó, tôi biết ListView phải đối phó với chi phí đặt các mục. Trong loại bỏ, không quá nhiều.

Lưu ý: biểu mẫu đang được hiển thị với ShowDialog - do đó, quyền kiểm soát không được trả lại cho đến khi hết 16 giây. Kế hoạch dự phòng là sử dụng Hiển thị và kích hoạt sự kiện khi hộp thoại đang trong quá trình đóng.

Và vâng, tôi nghĩ hiển thị 51k bản ghi là giao diện người dùng không tốt và đã giải thích điều đó cho khách hàng nhiều lần; hiện tại, sự khăng khăng rằng 51k bản ghi vẫn ở đó. (Tôi đã thêm tìm kiếm toàn văn, nếu không thì ...)

Trả lời

osker01 Nov 03 2020 at 21:05

Làm thế nào về chỉ ẩn danh sách xem của bạn? Hãy thử đặt thuộc tính hiển thị của nó thành false và khi bạn không cần listview nữa, hãy thử đóng biểu mẫu mà không xóa listview của bạn

MightyElk Nov 03 2020 at 22:09

Bạn đã thử sử dụng databinding thay vì sử dụng Listview.Items trực tiếp chưa? Vì vậy, bạn có thể đặt Nguồn mục thành null và sau đó (không đồng bộ?) Làm trống Danh sách thực.