2011-12-28 9 views
2

私は3000行12列のDataGridを持っています。 DataGridは読み取り専用であり、テキストフィールドのみを含みます。これらのテキストフィールドには、50文字を超えないデータが含まれています。これは、DataGridのXAMLです。は、データグリッドのパフォーマンスを最適化するのに役立ちます

<DataGrid SelectionUnit="Cell" Grid.Column="1" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" ScrollViewer.CanContentScroll="False" DataGrid:SelectedItem.AutoScroll="True" SelectedItem="{Binding Path=SelectedItem}" ItemsSource="{Binding Path=GridData}" Name="DataGrid1" > 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="{x:Static props:Resources.Header1}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/> 
      <DataGridTextColumn Header="{x:Static props:Resources.Header2}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/> 
      <DataGridTextColumn Header="{x:Static props:Resources.Header3}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/> 
      <DataGridTextColumn Header="{x:Static props:Resources.Header4}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/> 
      <DataGridTextColumn Header="{x:Static props:Resources.Header5}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/> 
      <DataGridTextColumn Header="{x:Static props:Resources.Header6}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}" Visibility="{Binding Path=DataContext.ColumnVisibility, RelativeSource={x:Static RelativeSource.Self}}"/> 
      <DataGridTextColumn Header="{x:Static props:Resources.Header7}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/> 
      <DataGridTextColumn Header="{x:Static props:Resources.Header8}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/> 
      <DataGridTextColumn Header="{x:Static props:Resources.Header9}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/> 
      <DataGridTextColumn Header="{x:Static props:Resources.Header10}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/> 
      <DataGridTextColumn Header="{x:Static props:Resources.Header11}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/> 
      <DataGridTextColumn Header="{x:Static props:Resources.Header12}" IsReadOnly="True" Binding="{Binding Path=SomeBindingPath}"/> 
     </DataGrid.Columns> 
     </DataGrid> 

DataGridをロードするのに30秒と300 MBのRAMがかかります。これはあまりにも大変です。どうすれば修正できますか?

DataGridsにはデフォルトで仮想化が設定されていると思っていましたが、そうは思われません。 VirtualizingStackPanel.IsVirtualizing = "False"をDataGridとDataGridTextColumn要素に追加しようとしましたが、これは役に立ちませんでした。

すでに述べたように、データの行はわずか3000行であるため、データ仮想化を実装する際には何のポイントもありません。あるいは私はすべきでしょうか?

私はまた、次のXAML追加しようとしました:私は、データの仮想化を検討してお勧めします

<DataGrid.ItemsPanel> 
      <ItemsPanelTemplate> 
       <VirtualizingStackPanel/> 
      </ItemsPanelTemplate> 
     </DataGrid.ItemsPanel> 
+1

パターンは*ページング*と呼ばれます。 – Will

+1

VirtualizingStackPanel.IsVirtualizing = "False"は仮想化機能を効果的に無効にしていることに注意してください。 WPFはデフォルトで有効になっています。 – CodeWarrior

答えて

0

CanContentScrollをtrueに設定する必要があります。私がfalseに設定した場合、私は仮想化を強制的にオフにしています。

2

を。

hereについての良いCodeProjectの記事と、いくつかのインとアウトの説明についての良いブログ記事hereがあります。

基本的に、データのチャンク(管理可能な金額)のみをキャッシュし、残りはitemscontrolのプレースホルダです。より多くのアイテムをスクロールすると、最後のアイテムがロードされ、以前に表示したアイテムは保持したり破棄したりすることができます。それはあなたの状況によって異なります。

実際にデータをどのように実装するかによって、実際の例はまだありません。

4

読み取り専用の場合は、GridView ListViewを使用します。 TextBlock(TextBoxではなく)を使用します。 DataGridは重量コントロールであり、オーバーヘッドが大きくなります。 ListViewには優れたUI仮想化機能(リサイクルと遅延スクロールを使用)があります。データ仮想化に進む必要があるかもしれませんが、UIを最適化することから始めます。 ListViewには素晴らしいパフォーマンスのある非常に大きなリストがあります。

GridViewとそれを削除するための提案された編集にコメントがありました。実際の作業者はListViewです。 GridViewは書式設定に過ぎません。 12の列を列挙し、GridViewをアラインする列を取得することは、きれいで簡単です。テンプレート付きのListView(およびGridViewはありません)はオプションです。この場合に使用するオプションではありません。

+0

少しの計算をした後、データサイズの最悪のシナリオはほんの数メガバイトにすぎないので、私はBalamBalamに同意します。データ検索は簡単です。 GridView固有の機能(つまり、ヘッダーを使用した並べ替え、グループ化)を使用していますか? listViewがかなり軽量なitemsControlである場合、パフォーマンスに大きな影響を与えることなく、数千もの複雑なアイテム(画像やアニメーションが実行されたテンプレートなど)をホストしています。 – CodeWarrior

+0

私はGridViewを列の位置合わせに使用しますが、あまりオーバーヘッドはありません。 – Paparazzi

関連する問題