2009-10-27 33 views
8

Tôi vẽ hàng của tôi trong một DataGridView như thế này:C màu nền # WinForms DataGridView render quá chậm

private void AdjustColors() 
    {    
     foreach (DataGridViewRow row in aufgabenDataGridView.Rows) 
     { 
      AufgabeStatus status = (AufgabeStatus)Enum.Parse(typeof(AufgabeStatus), (string)row.Cells["StatusColumn"].Value); 

      switch (status) 
      { 
       case (AufgabeStatus.NotStarted): 
        row.DefaultCellStyle.BackColor = Color.LightCyan; 
        break; 
       case (AufgabeStatus.InProgress): 
        row.DefaultCellStyle.BackColor = Color.LemonChiffon; 
        break; 
       case (AufgabeStatus.Completed): 
        row.DefaultCellStyle.BackColor = Color.PaleGreen; 
        break; 
       case (AufgabeStatus.Deferred): 
        row.DefaultCellStyle.BackColor = Color.LightPink; 
        break; 
       default: 
        row.DefaultCellStyle.BackColor = Color.White; 
        break; 
      } 
     }   
    } 

Sau đó, tôi gọi nó là trong phương pháp onload:

protected override void OnLoad(EventArgs e) 
     { 
      base.OnLoad(e); 

      AdjustColors();   
     } 

tôi thích onload để OnPaint hoặc một cái gì đó .. bởi vì OnPaint được gọi rất thường xuyên.

Câu hỏi: Tại sao phải mất khoảng 100 - 200 mili giây để thay đổi nền của mỗi hàng? Sớm, tôi là doint CellPaint .. nhưng tôi gặp sự cố khi cuộn bằng làm mới ..

+0

Bạn có nghĩa là phải mất 100 - 200ms mỗi hàng? Nghe có vẻ khá nặng. – leppie

+0

Có bao nhiêu hàng? Bạn có đặt bộ đệm đôi trên biểu mẫu không? Bạn đã thử sử dụng sự kiện CellFormatting chưa? – stuartd

Trả lời

10

Thay vì thay đổi màu của toàn bộ DataGrid cùng một lúc, bạn nên để nó quản lý hiển thị bằng cách ghi đè sự kiện CellFormatting. Các hàng sẽ chỉ được vẽ khi chúng thực sự được hiển thị trên màn hình.

private void aufgabenDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    DataGridViewRow row = aufgabenDataGridView.Rows[e.RowIndex]; 
    AufgabeStatus status = (AufgabeStatus) Enum.Parse(typeof(AufgabeStatus), (string) row.Cells["StatusColumn"].Value); 

    switch (status) 
    { 
    case (AufgabeStatus.NotStarted): 
     e.CellStyle.BackColor = Color.LightCyan; 
     break; 
    case (AufgabeStatus.InProgress): 
     e.CellStyle.BackColor = Color.LemonChiffon; 
     break; 
    case (AufgabeStatus.Completed): 
     e.CellStyle.BackColor = Color.PaleGreen; 
     break; 
    case (AufgabeStatus.Deferred): 
     e.CellStyle.BackColor = Color.LightPink; 
     break; 
    default: 
     e.CellStyle.BackColor = Color.White; 
     break; 
    } 

} 

Nếu đây là vẫn còn quá chậm, hãy thử nhận được đối tượng thực hàng là ràng buộc để:

... 
DataGridViewRow row = aufgabenDataGridView.Rows[e.RowIndex]; 
var aufgabe = (Aufgabe) row.DataBoundItem; 
AufgabeStatus status = aufgabe.Status; 
... 
+0

Vâng, giải pháp này hoạt động liên tục. –

+0

Đó có thể là bằng chứng cho thấy tôi không thể tự mình vẽ tranh nhưng tôi nên dựa vào cơ chế do MS cung cấp. Bây giờ tất cả các hàng được đổi màu ngay lập tức! –

+0

Và tôi đã loại bỏ Enum đó.Phân tích cú pháp theo đề xuất của ShDevMan –

2

Có thể là cuộc gọi Enum.Parse có hiệu suất kém. Bạn nên thử và thay đổi nó thành tra cứu từ điển để xem điều đó có cải thiện hiệu suất hay không. Xem này post

+0

Bạn nói đúng, Enum.Parse đủ chậm. Tôi thay vì truy cập trực tiếp vào DataBoundItem. –

2

Như SwDevMan1 đã nói, trước tiên bạn nên thực hiện việc xóa cuộc gọi Enum.Parse. Bạn đang sử dụng dữ liệu ràng buộc để cư các lưới điện? Nếu vậy, bạn có thể sử dụng hàng [index] .DataBoundItem để truy cập đối tượng dữ liệu bị ràng buộc cho hàng và truy cập trực tiếp trạng thái AufgabeStatus.

Tinh chỉnh thứ hai tôi đề xuất là gọi SuspendLayout() và ResumeLayout() trước và sau, tương ứng, thao tác lưới.

+0

Tôi đã xóa cuộc gọi Phân tích cú pháp. Có, tôi đang sử dụng DataBounding. Tôi đã truy cập trực tiếp phần tử thông qua DataBoundItem. Tôi đã thử Tạm ngừng & Tiếp tục. Nó nhanh hơn .. nhưng 15 hàng vẫn còn màu trong khoảng 400ms .. –

2

Nó cũng là một ý tưởng tốt để chỉ thiết lập các thuộc tính nếu họ khác với giá trị kỳ vọng. Bằng cách đó bạn không kích hoạt không cần thiết bên trong DataGridView phí.

Nếu tất cả các ô trong một hàng được định dạng theo cùng một cách, bạn có thể thực hiện định dạng ở mức hàng thay vì mức ô.

DataGridViewCellStyle rowStyle = row.DefaultCellStyle; 
if (rowStyle.BackColor != status.BackColor) { 
    rowStyle.BackColor = status.BackColor; 
} 
0

không cố gắng định dạng hàng như row.defaultcellstyle

thử tế bào riêng lẻ định dạng trong ufgabenDataGridView_CellFormatting

di động [0] .style.backcolor = color.yellow

Các vấn đề liên quan