2011-11-05 38 views
10

Tôi đang điền một khung dữ liệu từ một dữ liệu có thể định.C# rất chậm khi đang điền dữ liệu vào chế độ xem dữ liệu

Trong khi điền các cột và hàng, tôi cũng định dạng nó cùng một lúc, điều này làm cho quá trình tải dữ liệu tải rất chậm, có một công việc xung quanh cho vấn đề này không?

+0

Bạn có một ví dụ mã của định dạng. Bạn đang tải bao nhiêu dữ liệu vào lưới? bạn có sử dụng nguồn dữ liệu được phân trang hay bạn tải mọi thứ vào lưới? – Ivo

+0

Bạn có thể đăng mã mà bạn sử dụng để điền DatagridView không? Bạn có binded các datagridView với datatable hoặc làm bạn iterate thông qua datatable và chèn các bản ghi trong DatagridView? – aleroot

Trả lời

3

Khi bạn sử dụng chế độ xem dữ liệu để hiển thị dữ liệu từ dữ liệu, bạn nên luôn sử dụng một số chiến lược để giới hạn kết quả được đặt và chỉ hiển thị bản ghi khi người dùng thực sự nhìn thấy chúng. Điều này được gọi là chế độ ảo đôi khi hoặc phân trang dữ liệu. Tôi nhận được một example of this strategy for wpf, nhưng cũng có một cái gì đó cũng cho winforms. Hãy xem câu hỏi này: Winform DataGridview incredibly slow compared to MS Access Grid Tôi nghĩ là có liên quan đến vấn đề của bạn.

+0

Đồng ý, khi một người nào đó nói về sự chậm chạp của một DataGrid nó thường là hàng ngàn hàng đang được đọc để hiển thị chỉ 10 hàng. Đảm bảo bạn đang đọc dữ liệu được phân trang. (aka: phân trang dữ liệu) – detay

+1

@detay vâng sự kỳ diệu của việc có một mạng lưới nhanh không phải là tốc độ bạn điền vào nó nhưng tránh điền vào nó: D –

4

Bạn có thể kiểm tra thuộc tính của DataGridView - AutoSizeColumnsMode Tôi thấy rằng nếu tôi thay đổi chế độ từ AllCells thành DisplayedCells thì hiệu suất sẽ khác. Tôi hy vọng điều này sẽ giúp bạn.

10

Cũng như chăm sóc AutoSizeColumnsMode, hãy đảm bảo rằng các cột riêng lẻ có thuộc tính AutoSizeMode cũng được đặt thành một thứ khác với tất cả các ô.

Tôi cũng thấy nó cần thiết để sử dụng

SendMessage(dg.Handle, WM_SETREDRAW, false, 0); // before 

// updates to datagridview here... 

SendMessage(dg.Handle, WM_SETREDRAW, true, 0); // after 
+1

Thay đổi AutoSizeColumnsMode thành None trước khi làm mới nguồn dữ liệu, sau đó đặt lại thành Tất cả sau khi nguồn dữ liệu đã được đặt đã giảm thời gian tải xuống cho tôi từ vài phút xuống dưới một giây. – KevenDenen

6

tôi đang chụp khoảng 2-4 phút để tải 1-2K hàng. Tôi đã thay đổi thuộc tính tự động thay đổi kích thước và bây giờ nó xuống đến vài giây, có thể là 10-20. Tôi chạy nó ngay trước vòng lặp tạo hàng để đảm bảo nó có tất cả các cột.

foreach (DataGridViewColumn c in thisGrid.Columns) 
{ 
    c.AutoSizeMode = DataGridViewAutoSizeColumnMode.None; 
} 
2

Các quy tắc của một anh bạn già ngu ngốc: - Tránh các DataTable, cũng được biết đến là inefficicient - Tránh sử dụng preallocation hàng [ "Lưới" .Rowcount + "Lưới" .AddRange() + .. ] (~ 5 lần chậm hơn "Lưới" ADD()) - Hãy xem xét rằng một DataGridView bị ràng buộc với "màn hình của bạn": nghĩa là. LOAD CNTT với một vài màn hình dữ liệu. - Tôi đã áp dụng những sự kiện đơn giản này và tôi có thể "tải" một tệp 'ngu ngốc' của 420 000 hàng với 159 cột trong 15 giây. (~ 200 MB).

0

Tôi có hiệu suất khá tốt là DataGridView. Thêm hàng trăm hàng mất khoảng 200ms. Dưới đây là những gì tôi làm:

virtual = true - sử dụng chế độ xem Lưới dữ liệu ảo hóa có vẻ làm cho toàn bộ quá trình nhanh hơn. Chỉ cần nhớ thực hiện đúng cách logViewGrid_CellValueNeeded.

Một điều cần làm là tạm thời tắt các sự kiện bố cục khi thêm dữ liệu vào danh sách bị ràng buộc. Cố gắng làm:

logViewGrid.SuspendLayout(); 
// add data, perform some operations on grid view 
logViewGrid.ResumeLayout(false); 

Tôi cũng đã có một vấn đề với hàng chậm màu; phương pháp của tôi để làm điều đó là thiết lập phong cách từng tế bào riêng biệt, như thế này:

gridViewInstance.Rows[currentRow].Cells[cellIndex].Style.BackColor = val; 

Thay vào đó, tôi đã đi cho:

gridViewInstance.Rows[currentRow].DefaultCellStyle.BackColor = val; 

Trong đó, 30 cột, đã cho tôi tăng tốc độ đáng kể trong phần đó của mã.

0

Tôi đã làm một số thử nghiệm trong một chương trình mà tôi tải 5000 hàng với 6 cột và mỗi ô được tải với số hàng chỉ để có một số dữ liệu. Sau đó tôi đã sử dụng Đồng hồ bấm giờ để kiểm tra từng phương pháp tiếp cận. Tôi nạp dataviewgrid, vô hiệu hóa nó và tải nó sau đó kích hoạt nó, giấu nó, tải nó, và cho thấy nó, và suspendlayout và resumelayout. Tôi thấy rằng bằng cách ẩn nó và tải nó và sau đó hiển thị nó đã được nhanh hơn nhiều trong thử nghiệm của tôi. Phải mất: .91 giây để chỉ cần tải .91 giây để tạm ngưngLayout, tải, tiếp tụcThời gian chờ .25 giây để tắt, tải và bật lại lưới 0,19 giây để ẩn, tải và hiển thị lưới.

Tôi đồng ý rằng bạn nên tránh tải những gì bạn không cần, nhưng nghĩ rằng thử nghiệm này sẽ giúp ích.

6

Với điều này sẽ datagridview nhanh như java JTable :)

public static class ExtensionMethods 
{ 
    public static void DoubleBuffered(this DataGridView dgv, bool setting) 
    { 
     Type dgvType = dgv.GetType(); 
     PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", 
      BindingFlags.Instance | BindingFlags.NonPublic); 
     pi.SetValue(dgv, setting, null); 
    } 
} 

ExtensionMethods.DoubleBuffered(dataGridView1, true); 
Các vấn đề liên quan