2011-07-13 46 views
28

Tôi đã thử sử dụng cả DataGrid tùy chỉnh cũng như dữ liệu chứng khoán trong WPF. Tôi đã thử populating chúng bằng tay cũng như thông qua bindings. Trong cả hai trường hợp, chúng đều chậm.WPF DataGrid rất chậm để hiển thị

Tôi có một scenerio nơi người dùng nhấp vào một nút và một DataGrid xuất hiện với dữ liệu thích hợp. Hiện tại tôi đang có bằng chứng về chế độ khái niệm và chỉ sử dụng dữ liệu mẫu. Tôi có một DataSet với một bảng có 10 hàng trong đó.

Nếu tôi không đính kèm bất kỳ dữ liệu nào vào DataGrid khi tôi nhấp vào nút DataGrid trống hiển thị khá nhiều ngay lập tức, người dùng không thể nhận thấy sự chậm trễ. Ngay sau khi tôi thêm 10 hàng dữ liệu, cho 6 cột, độ trễ khoảng 2 giây, rất đáng chú ý cho người dùng.

Tôi thậm chí đã thử điền bằng dữ liệu trống, chỉ để có được một lưới trống để xuất hiện và nó là bằng nhau như chậm.

for (int i = 0; i < 10; i++) 
    _dataGrid.Items.Add(""); 

tôi đặt một bộ đếm thời gian để đếm ve từ khi nút được nhấp để khi tất cả các mã được thực thi để vẽ DataGrid và nó là khoảng 20 mili giây, vì vậy các mã thực thi rất nhanh, nhưng trên màn hình là nơi tụt hậu lớn. Tôi đã thử một GridView và nó render rất nhanh trên màn hình.

Tôi đã nghe các báo cáo khác nhau về việc vẽ DataGrid chậm với các kịch bản phức tạp và sử dụng 1000 hàng, nhưng điều này đơn giản như khi có, 6 cột của 10 hàng chứa đầy dữ liệu trống.

Để hiển thị chỉ đọc là GridView, một tùy chọn khả thi ngang bằng với DataGrid?


Cập nhật

Đây là việc tạo ra các cột của tôi.

   DataGridTextColumn column = new DataGridTextColumn(); 
       column.ColumnWidthChanged += new ColumnWidthChangedEventHandler(column_ColumnWidthChanged); 

       column.Header = entity.GetPropertyValue("ColumnLabel"); 
       column.Binding = new Binding(entity.GetPropertyValue("Tag")); 
       column.Width = new DataGridLength(entity.GetPropertyDouble("DisplaySize")); 
       _dataGrid.Columns.Add(column); 

Đây là cách tôi liên kết Tập dữ liệu với 10 hàng trong đó.

   _dataGrid.ItemsSource = ds.Tables[0].DefaultView; 
       _dataGrid.DataContext = ds.Tables[0]; 

Không chắc chắn những gì tôi có thể làm khác đi.

+0

có thể là phần cứng của nó? –

+0

Tôi cũng đã thử ứng dụng trên một hệ thống khác và nó cũng chạy chậm. Vấn đề là một số xem có nhiều DataGrid trên chúng, vì vậy sự chậm trễ chỉ tăng cho mỗi DataGrid bổ sung. –

+0

tôi sử dụng tiêu chuẩn dữ liệu wpf chuẩn với cột động và nhiều hơn nữa sau đó 10000rows và không có vấn đề với điều đó. whats your itemssource? một datatable hoặc somekind của bộ sưu tập? hy vọng bạn đã không thêm các mục trong một foreach như bạn đăng bài ?? – blindmeis

Trả lời

24

Bạn có:

  • Enabled VirtualizingStackPanel.VirtualizationMode cho một lưới? nếu không - hãy thử đặt.
  • Đặt VirtualizingStackPanel.IsVirtualizing = "true" cho DataGrid
  • Bao bọc lưới bằng ngăn xếp StackPanel? Nếu có - hãy thử xóa.
  • Bao bọc lưới bằng điều khiển ScrollViewer bên ngoài? Nếu có - hãy thử xóa.

Một điểm nữa, bạn có thể ràng buộc thu thập toàn bộ các mục cùng một lúc thay vì thêm từng mục vào lưới.

+0

+0

Đã cố gắng dán XAML của tôi nhưng không phát hành tốt, tôi sẽ thử và cập nhật câu hỏi ban đầu của mình. DataGrid được chứa trong một DockPanel. Không cho ScrollViewer và tôi không tham chiếu VirtualizingStackPanel.VirtualizationMode. –

+0

Cố gắng thiết lập VirtualizingStackPanel.VirtualizationMode to Recycling, ví dụ: sll

17

Mẹo chung về DataGrid vấn đề về hiệu suất: Tôi gặp sự cố với DataGrid trong đó phải mất vài giây để làm mới sau khi thay đổi kích thước cửa sổ, sắp xếp cột, v.v ... và khóa cửa sổ giao diện người dùng khi đang thực hiện (1000 hàng, 5 cột).

Đã xảy ra sự cố (lỗi?) Với các tính toán định kích thước WPF.Tôi đã có nó trong một lưới với RowDefinitionHeight="Auto" đã khiến hệ thống hiển thị thử và tính lại kích thước của DataGrid khi chạy bằng cách đo kích thước của mỗi cột và hàng, có lẽ bằng cách lấp đầy toàn bộ lưới (như tôi đã hiểu). Nó có nghĩa vụ phải xử lý điều này một cách thông minh bằng cách nào đó nhưng trong trường hợp này thì không.

Kiểm tra nhanh để xem đây có phải là vấn đề liên quan hay không để đặt thuộc tính HeightWidth của DataGrid thành kích thước cố định trong suốt thời gian thử nghiệm và thử chạy lại. Nếu hiệu suất của bạn được khôi phục, sửa chữa thường xuyên có thể là một trong các tùy chọn này:

  • Thay đổi kích thước của các yếu tố chứa là tương đối (*) hoặc giá trị cố định
  • Đặt MaxHeightMaxWidth của DataGrid vào một giá trị cố định lớn hơn hơn nó có thể được sử dụng bình thường
  • Hãy thử một loại container với chiến lược thay đổi kích thước khác nhau (Grid, DockPanel, vv)
+2

Tôi đã có cùng một vấn đề với một DataGrid chứa trong một hàng có kích thước sao của lưới bố trí. Đặt MaxHeight như đề xuất hoạt động như một sự quyến rũ. – EagleBeak

5

Trong trường hợp của tôi, tôi đã có một vấn đề với DataGridCell ControlTemplate làm chậm đường xuống.

Hãy nhận biết rằng tốc độ tải tương đối cho dữ liệu lớn rất khác nhau cho việc sử dụng TextBlock (mà không phải là văn bản có thể lựa chọn) hoặc TextBox trong chế độ ReadOnly:

tải thời gian 59 giây:

<Style TargetType="{x:Type DataGridCell}" x:Key="DataGridCellTextStyle"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
        <TextBox IsReadOnly="True" Text="{Binding Mode=OneWay}"/> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Thời gian tải 21 giây:

<Style TargetType="{x:Type DataGridCell}" x:Key="DataGridCellTextStyle"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
        <ContentPresenter Content="{Binding}" /> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

tải thời gian 16 giây:

<Style TargetType="{x:Type DataGridCell}" x:Key="DataGridCellTextStyle"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
        <TextBlock Text="{Binding}"></TextBlock> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
1

Tôi có một Surface Pro 3 mà DataGrid của tôi, với khoảng 200 hàng và 10 cột, thật sự rất chậm di chuyển, giật và do dự.

Tôi nghĩ đó là mạng, nhưng trên thực tế, cạc đồ họa không thể theo kịp - đợi cho nó - hiệu ứng đổ bóng trên bản thân dữ liệu, mặc dù nền của điều khiển được đặt thành một màu đồng nhất.

Tôi đã nhận xét hiệu quả và nhanh hơn 4-5 lần.

Hy vọng điều này sẽ hữu ích.

9

A blog Tôi tìm thấy trên Google đã cung cấp cho tôi giải pháp sắp xếp. Theo tác giả cho biết, tôi đã tắt GroupStyle và vấn đề tốc độ kết xuất đã được giải quyết. Nhưng tôi cần nhóm. Tác giả cho biết

VirtualizingPanel.IsVirtualizingWhenGrouping 

được thêm vào .NET 4.5. Vì vậy, tôi đặt nó thành sự thật. Giờ đây, việc kết xuất nhanh chóng với tính năng nhóm. Vấn đề là ... di chuyển là giật. Không thể chấp nhận được, nhưng đáng chú ý là giật. Tôi đã có vấn đề tương tự khi tôi cố gắng tạo ra một TreeView với 2000 + nút mở rộng. Nếu không có ảo hóa, hiển thị chậm nhưng việc cuộn trơn tru.Với ảo hóa, hiển thị nhanh nhưng việc cuộn bị giật.

Tại sao chúng ta không thể có cả ...

+0

Dòng đơn này đã giải quyết được vấn đề chính xác của tôi - cảm ơn bạn rất nhiều! Tôi đã rối tung xung quanh với nhiệm vụ asyn tôi đang sử dụng để tải dữ liệu khi cuối cùng tôi nhận ra rằng rendering là vấn đề thực sự. Đã thêm 'VirtualizingPanel.IsVirtualizingWhenGrouping =" True "' và dân số của DataGrid ist của tôi hiện giảm xuống từ khoảng 10 giây xuống dưới một giây. – M463

+0

Điều này cũng làm việc cho tôi! Đã giảm từ 10-30 giây xuống dưới 1. –

1

Tôi có cùng một vấn đề với lưới dữ liệu ràng buộc, và tôi nhận thấy rằng trong tải đầu tiên nó là nhanh chóng nhưng trên secand và tiếp theo đó là chậm. Vì vậy, khi tôi thêm trong mã

DataGrid.ItemsSource = Nothing và sau đó TableAdapter.Fill(Mydataset.MyStoredProcedure,....) DataGrid.ItemsSource=Mydataset.MyStoredProcedure nó trở nên rất NHANH

0

Đối với tôi đó là:

<Setter Property='ScrollViewer.CanContentScroll' Value='False' /> 

Tôi đã gỡ bỏ này từ phong cách và dựng hình trở nên nhanh chóng.

+0

Để làm rõ, hãy đặt ScrollViewer.CanContentScroll thành 'true' làm giá trị của' false' sẽ vô hiệu hóa ảo hóa. – kjhf

0

Vâng một chút bổ sung thêm (i biết chủ đề rất cũ, nhưng vẫn còn đó giúp một ai đó) ...

tôi đã cố gắng

EnableColumnVirtualization="True" VirtualizingPanel.VirtualizationMode="Recycling" 
EnableRowVirtualization="True" 

cho DataGrid (AutoGenerateColumns="True") ràng buộc để DataTable.DefaultView() và Không ảnh hưởng đến tốc độ, nó vẫn là khủng khiếp đối với Tốc độ cũng như điều hướng giữa các hàng. Hơn nữa, tôi đã đưa ra giải pháp để thiết lập Fixed Height và Width of DataGrid. Ngoài ra, tôi cũng đặt

RowHeight="23" 
ScrollViewer.HorizontalScrollBarVisibility="Visible" 
ScrollViewer.VerticalScrollBarVisibility="Visible" 

Điều này làm cho trang của tôi điền rất nhanh ... Thay vì 2 phút, bây giờ phải mất 10-12 giây.

Hy vọng nó sẽ giúp ai đó.

Lưu ý: Tôi đang sử dụng .Net 4.5