2

非常に大きなカンマ区切りのテキストファイルがあります。これをWPFデータグリッドに表示する必要があります。どの方法を使用すると、すべてのデータをグリッドに読み込むのに最高のパフォーマンスが得られますか?私は2つの方法しか知りません:

  • Datatableを使用し、各行を行として追加します(やり過ぎのように見えます)
  • ObservableCollectionを使用して、各行のオブジェクトを作成します(やり過ぎのように見えます)

データグリッドを埋めるための3番目の方法はありますか?これによりパフォーマンスが向上しますか?

4

2 に答える 2

2

データをどうするかによって異なります。データが読み取り専用になる場合は、List を定義して、それをデータグリッドの ItemsSource として設定できます。次に、データグリッドは、リスト内の項目を表すすべての行を自動的に作成します。

データを操作する場合は、BindingList<> または ObservableCollection<> を使用できます。

「行ごとにオブジェクトを作成する」のはやり過ぎですか? データの行/行をオブジェクトとして表現する必要があります。それは単なる常識であり、他の方法ではできません。

基本的に、パフォーマンスが目的の場合、データグリッドの ItemsSource はできるだけ軽量にする必要があります。すべての機能を使用するつもりがない場合、DataTable はやり過ぎかもしれません。一方、 List<> は可能な限り軽量です。

また、WPF データグリッドはデフォルトで仮想化を使用しているため、パフォーマンスも向上します。データグリッドをスタックパネル内に配置しないなど、いくつかの注意点があります。そうしないと、仮想化の効果がなくなります。これについてはグーグルで検索できます。

最後に、私の経験では、.NET4 WPF 組み込みデータグリッドには重大な設計上のバグがあります。基本的に、各 DataGridRow は、最も単純なデータでも 1MB のメモリを消費します。仮想化で 30 行しか表示されないため、大した問題ではありません。消費されるメモリは 30MB だけです。しかし、1000行を取り、仮想化をオフにすると、メモリ消費量は3GB!!!! 対照的に、WinForm datagridview は、同じデータで 10 分の 1 以下のメモリを消費します。仮想化が無効になっていても、1,000行で30MBしかかかりません...

これについて Connect でバグを報告しましたが、専門家はまだこの問題を調査していません。WPF ツールキットのデータグリッドの動作が改善されるかどうかはわかりません...

于 2010-09-24T06:24:36.343 に答える
0

OleDb を使用してコンマ区切りファイルをロードすると、DataView にバインドできます。
注: 大規模なデータセットはテストしていません。

DataGrid へのバインディングは次のとおりです。

<Window x:Class="DatagridBackgroundWorker.Views.MainView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfToolkit="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" 
    Loaded="Window_Loaded"
    Title="Main Window" Height="400" Width="800">
  <DockPanel>
    <Grid>
        <WpfToolkit:DataGrid  
            ItemsSource="{Binding Path=GridData, Mode=OneWay}" >
        </WpfToolkit:DataGrid>
    </Grid>
  </DockPanel>
</Window>

ビューモデルは次のとおりです。

public class MainViewModel : ViewModelBase
{
  public MainViewModel()
  {
     // name of the file
     string fileName = "MyData.txt";

     // location of the file
     string filePath = Environment.CurrentDirectory;
     string connection = @"Provider=Microsoft.Jet.OleDb.4.0; Data Source = " +
                         filePath +
                         ";Extended Properties=\"Text;HDR=Yes;FMT=Delimited\"";

     OleDbConnection conn = new OleDbConnection(connection);
     conn.Open();
     OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [" + fileName + "]", conn);
     adapter.Fill(_ds);
  }

  private DataSet _ds = new DataSet("MyDataSet");
  public DataView GridData
  {
     get
     {
        return _ds.Tables[0].DefaultView;
     }
  }
}

使用したデータファイルは次のとおりです。

name,site,extra
jeff,codinghorror,stackoverflow
joel,joelonsoftware,stackoverflow
zamboni,secondbeach,stackoverflow
于 2010-09-24T15:17:32.283 に答える