2008-09-15 29 views
7

Trong ứng dụng của tôi, tôi có một điều khiển DataGridView hiển thị dữ liệu cho đối tượng đã chọn. Khi tôi chọn một đối tượng khác (trong hộp kết hợp ở trên), tôi cần phải cập nhật lưới. Thật không may các đối tượng khác nhau có dữ liệu hoàn toàn khác nhau, thậm chí các cột khác nhau, vì vậy tôi cần xóa tất cả dữ liệu và cột hiện có, tạo cột mới và thêm tất cả các hàng. Khi điều này được thực hiện, toàn bộ điều khiển nhấp nháy khủng khiếp và phải mất độ tuổi. Có một cách chung chung để có được sự kiểm soát trong một trạng thái cập nhật để nó không repaint chính nó, và sau đó repaint nó sau khi tôi hoàn thành tất cả các bản cập nhật?Nhấp nháy trong khi cập nhật các Điều khiển trong WinForms (ví dụ: DataGridView)

Đó chắc chắn là có thể với TreeViews:

myTreeView.BeginUpdate(); 
try 
{ 
    //do the updates 
} 
finally 
{ 
    myTreeView.EndUpdate(); 
} 

Có một cách chung chung để làm điều này với các điều khiển khác, DataGridView nói riêng?

CẬP NHẬT: Rất tiếc, tôi không chắc mình đã đủ rõ ràng chưa. Tôi thấy "nhấp nháy", bởi vì sau khi đơn chỉnh sửa điều khiển được sơn lại trên màn hình, vì vậy bạn sẽ nhìn thấy thanh cuộn thu hẹp vv

+0

thêm điều này trong DataGridView của bạn DoubleBuffered (true); –

Trả lời

7

Thay vì thêm các hàng của lưới dữ liệu cùng một lúc, sử dụng phương pháp DataGridView.Rows.AddRange để thêm tất cả các hàng cùng một lúc . Điều đó chỉ nên cập nhật màn hình một lần. Ngoài ra còn có một DataGridView.Columns.AddRange để làm tương tự cho các cột.

+0

Chúc mừng, điều này có vẻ tốt nhất bạn có thể nhận được với DataGridView – Grzenio

1

Âm thanh như bạn muốn đôi đệm:

http://www.codeproject.com/KB/graphics/DoubleBuffering.aspx

Mặc dù điều này chủ yếu được sử dụng cho các điều khiển riêng lẻ, bạn có thể thực hiện điều này trong điều khiển hoặc Biểu mẫu Windows của bạn.

+2

Tôi đã thử đệm đôi, nhưng nó không giúp được gì nhiều. Tôi nghĩ rằng vấn đề là nó cố gắng để sơn lại sau mỗi hàng tôi thêm, do đó, nó kết thúc lên cập nhật các hàng đầu tiên nhiều lần. – Grzenio

1

Thật không may, tôi nghĩ rằng thins chỉ có thể là một sản phẩm phụ của khung .net. Tôi đang trải qua nhấp nháy tương tự mặc dù với các điều khiển tùy chỉnh. Nhiều tài liệu tham khảo tôi đã đọc cho biết điều này, cùng với thực tế là phương pháp đệm đôi không thể loại bỏ bất kỳ nhấp nháy nào cho tôi.

6

Đôi đệm sẽ không giúp đỡ ở đây vì đó bộ đệm đôi chỉ vẽ hoạt động, nhấp nháy OP đang chứng kiến ​​là kết quả của nhiều hoạt động sơn:

  • rõ ràng nội dung kiểm soát -> sơn lại
  • rõ ràng cột -> sơn lại
  • dụng nhất cột mới -> sơn lại
  • Thêm hàng -> sơn lại

do đó, đó là bốn repaints để cập nhật kiểm soát, do đó nhấp nháy. Thật không may, không phải tất cả các điều khiển chuẩn đều có BeginUpdate/EndUpdate sẽ xóa tất cả các cuộc gọi lại cho đến khi EndUpdate được gọi. Đây là những gì bạn có thể làm:

  1. Có một điều khiển khác nhau cho thiết mỗi dữ liệu và Hiện/Ẩn các điều khiển,
  2. Tháo điều khiển từ cha mẹ, cập nhật của nó và sau đó thêm sự kiểm soát một lần nữa,
  3. Viết của bạn kiểm soát riêng.

Tùy chọn 1 và 2 sẽ vẫn nhấp nháy một chút.

Trên chương trình .Net GUI tôi đang làm việc, tôi đã tạo một bộ điều khiển tùy chỉnh loại bỏ tất cả nhấp nháy.

+0

Vâng, tôi khá chắc chắn đây chính là vấn đề. Và bởi vì tôi phải thêm> 50 hàng, bạn có thể thấy lưới đang phát triển như thế nào. Khi bạn tạo điều khiển, bạn đã mở rộng chế độ xem lưới dữ liệu hiện tại hoặc viết một chế độ xem mới từ đầu? – Grzenio

+0

Tôi đã viết chúng từ đầu, bắt nguồn từ UserControl và tất cả chúng đều rất cụ thể. – Skizz

8

Điều khiển .NET hỗ trợ các phương thức SuspendLayoutResumeLayout. Chọn kiểm soát cha mẹ thích hợp (tức làsự kiểm soát mà chủ các điều khiển bạn muốn để cư trú) và làm điều gì đó như sau:

this.SuspendLayout(); 

// Do something interesting. 

this.ResumeLayout(); 
+2

Vâng, tôi đã thử nó nhưng nó không hoạt động: ( – Grzenio

2

Điều này phù hợp với tôi.

http://www.syncfusion.com/faq/windowsforms/search/558.aspx

Về cơ bản nó liên quan đến việc phát sinh từ sự kiểm soát mong muốn và thiết lập các phong cách sau đây.

SetStyle(ControlStyles.UserPaint, true); 
SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
SetStyle(ControlStyles.DoubleBuffer, true); 
7

Con người dường như quên một sửa chữa đơn giản cho việc này:

Object.Visible = false; 

//do update work 

Object.Visible = true; 

Tôi biết nó có vẻ lạ, nhưng mà làm việc. Khi đối tượng không hiển thị, nó sẽ không tự vẽ lại. Tuy nhiên, bạn vẫn cần thực hiện cập nhật beginend.

+0

Điều này cần phải có nhiều điểm hơn, có thể đã tiết kiệm cho tôi rất nhiều thời gian. làm việc cho trường hợp sử dụng của tôi nhưng điều này là hoàn hảo. –

0

Bạn cũng có thể thử công việc này.

public static void DoubleBuffered(Control formControl, bool setting) 
{ 
    Type conType = formControl.GetType(); 
    PropertyInfo pi = conType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic); 
    pi.SetValue(formControl, setting, null); 
} 
Các vấn đề liên quan