Tôi có một bảng SQL có chứa 1 triệu hàng sẽ phát triển theo thời gian.Windows Forms DataGridView có thực hiện chế độ ảo thực sự không?
Có yêu cầu người dùng cụ thể để hiển thị lưới có thể sắp xếp hiển thị tất cả các hàng không có phân trang. Người dùng hy vọng có thể nhanh chóng nhảy từ hàng này sang hàng khác và từ trên xuống dưới bằng cách sử dụng thanh cuộn.
Tôi quen với lưới "chế độ ảo" chỉ hiển thị một tập hợp con có thể nhìn thấy của dữ liệu tổng thể. Họ có thể cung cấp hiệu suất UI tuyệt vời và yêu cầu bộ nhớ tối thiểu, (Tôi thậm chí đã thực hiện một ứng dụng bằng cách sử dụng kỹ thuật này nhiều năm trước đây).
Windows Forms DataGridView cung cấp chế độ ảo giống như là câu trả lời. Tuy nhiên không giống như các chế độ ảo khác mà tôi đã gặp phải, nó vẫn cấp phát bộ nhớ cho mỗi hàng (được xác nhận trong ProcessExplorer). Rõ ràng điều này gây ra việc sử dụng bộ nhớ tổng thể để tăng không cần thiết và, trong khi phân bổ các hàng này, có một sự chậm trễ đáng chú ý. Hiệu suất cuộn cũng chịu trên 1 triệu + hàng.
Chế độ ảo thực sẽ không cần phân bổ bộ nhớ cho các hàng không được hiển thị. Bạn chỉ cần cung cấp cho nó tổng số hàng (ví dụ: 1.000.000) và tất cả các lưới điện là quy mô thanh cuộn cho phù hợp. Khi nó lần đầu tiên được hiển thị lưới chỉ đơn giản là yêu cầu dữ liệu n đầu tiên (nói 30) chỉ hiển thị các hàng, hiển thị tức thì.
Khi người dùng cuộn lưới, chênh lệch hàng đơn giản và số hàng hiển thị được cung cấp và có thể được sử dụng để truy xuất dữ liệu từ kho dữ liệu.
Dưới đây là một ví dụ về mã DataGridView Tôi hiện đang sử dụng:
public void AddVirtualRows(int rowCount)
{
dataGridList.ColumnCount = 4;
dataGridList.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dataGridList.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
dataGridList.VirtualMode = true;
dataGridList.RowCount = rowCount;
dataGridList.CellValueNeeded += new DataGridViewCellValueEventHandler(dataGridList_CellValueNeeded);
}
void dataGridList_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
e.Value = e.RowIndex;
}
Am tôi thiếu bất cứ điều gì ở đây, hoặc là chế độ "ảo" của DataGridView không thực sự ảo ở tất cả?
[Cập nhật]
Có vẻ như ListView cũ tốt thực hiện chính xác loại chế độ ảo mà tôi đang tìm kiếm. Nhưng tiếc là ListView không có khả năng định dạng ô của DataGridView, vì vậy tôi không thể sử dụng nó.
Đối với những người khác có thể, tôi đã thử nghiệm nó với một bốn cột ListView (trong chế độ chi tiết), VirtualMode = True và VirtualListSize = 100.000.000 hàng.
Danh sách được hiển thị ngay lập tức với 30 hàng đầu tiên hiển thị. Sau đó tôi có thể cuộn nhanh đến cuối danh sách mà không bị chậm trễ. Việc sử dụng bộ nhớ là không đổi 10 MB mọi lúc.
Tôi nghĩ rằng liên kết trỏ đến phiên bản recenet nhiều nhất và nhận xét không hiển thị ở đó. Đây có phải là commetn bắt đầu "Ví dụ này dường như không hoạt động khi sử dụng .NET 4.0" không? –
tôi không biết nữa nhưng tôi đoán nó là ".NET Framework 3.0" không có gì "Visual Studio 2010" cũng thú vị – Firo