-1

現在、DataGrid を使用しています。C# では約 24 列が動的に作成されます。

私の DataGrid には常に約 300 のエントリがあります (1 つのエントリが「タイトル」を表すため、ページング システムを作成できません。同じページにすべてのデータを取得する必要があるためです)。

それはうまくいきますが、DataGridTemplateColumns(各列に2つのサブ列が必要なため、セパレーターと2つのタイトルを持つスタイル付きの列ヘッダーが必要なため)とセルテンプレート(これらの2つのサブ列が必要なため)を使用すると、ダブルバインディング (サブ列ごとに 1 つのバインディング) があり、グリッドをロードすると、使用できなくなります...

すべてのタイプの仮想化 (StackPanel、RowVirtualization、ColumnVirtualization とすべての異なるタイプの値の組み合わせ) を試しました。私が得ることができる「最高の」パフォーマンスは、RowVirtualization と ColumnVirtualization を True に設定した場合です。

「使用可能」になりましたが、水平スクロールを行うとまだ非常に遅いです(FrozenColumnを使用しているため、グラフィックのバグが少しあります...)

独自の ListView / GridView を使用してみましたが、何時間も作業した後 (フリーズした列を再現するためなど)、まだ同じ「問題」があります。

データ仮想化を使用することはできません (285 行で 24 列しかないため、ユーザー フレンドリーではありません)。

ありがとう !

EDIT 1:列を生成するコードは次のとおりです

        ColumnCollection = new ObservableCollection<DataGridColumn>();
        DataGridTemplateColumn firstDtc_l = new DataGridTemplateColumn();
        firstDtc_l.Header = "Titles";
        FrameworkElementFactory spFactory_l = new FrameworkElementFactory(typeof(Grid));
        ColumnCollection.Add(firstDtc_l);
        int i = 0;

        foreach (string s in DynamicColumns)
        {
            DataGridTemplateColumn dtc_l = new DataGridTemplateColumn();
            Binding bindColor = new Binding();
            bindColor.Converter = new ChangedColorConverter();
            bindColor.ConverterParameter = "Column" + i;

            //DataTemplate
            DataTemplate dt_l = new DataTemplate("MyObject");
            spFactory_l = new FrameworkElementFactory(typeof(Grid));
            spFactory_l.Name = "CellTemplate";
            FrameworkElementFactory columnDefinition1 = new FrameworkElementFactory(typeof(ColumnDefinition));
            FrameworkElementFactory columnDefinition2 = new FrameworkElementFactory(typeof(ColumnDefinition));
            FrameworkElementFactory border1 = new FrameworkElementFactory(typeof(Border));
            border1.SetValue(Grid.ColumnProperty, 0);
            border1.SetValue(Border.BorderBrushProperty, Brushes.Gray);
            border1.SetValue(Border.BorderThicknessProperty, new Thickness(0,0,0,0));
            FrameworkElementFactory border2 = new FrameworkElementFactory(typeof(Border));
            border2.SetValue(Grid.ColumnProperty, 1);
            border2.SetValue(Border.BorderBrushProperty, Brushes.Gray);
            border2.SetValue(Border.BorderThicknessProperty, new Thickness(1, 0, 0, 0));
            FrameworkElementFactory textBlock1 = new FrameworkElementFactory(typeof(TextBlock));
            textBlock1.SetValue(Grid.ColumnProperty, 0);
            textBlock1.SetValue(TextBlock.ForegroundProperty, bindColor);
            Binding firstBind = new Binding("MyObject[Column"+i+"].FirstBinding");
            textBlock1.SetValue(TextBlock.TextProperty, localBind);
            FrameworkElementFactory textBlock2 = new FrameworkElementFactory(typeof(TextBlock));
            Binding secongBind = new Binding("MyObject[Column" + i + "].SecondBinding");
            textBlock2.SetValue(Grid.ColumnProperty, 0);
            textBlock2.SetValue(TextBlock.TextProperty, firstBind) 
            textBlock2.SetValue(TextBlock.ForegroundProperty, secongBind);
            border1.AppendChild(textBlock1);
            border2.AppendChild(textBlock2);

            spFactory_l.AppendChild(columnDefinition1);
            spFactory_l.AppendChild(columnDefinition2);
            spFactory_l.AppendChild(border1);
            spFactory_l.AppendChild(border2);
            dt_l.VisualTree = spFactory_l;

            dtc_l.Width = DataGridLength.Auto;
            dtc_l.CellTemplate = dt_l;
            dtc_l.Header = s;
            ColumnCollection.Add(dtc_l);
            i++;
        }   

DataGrid は「TheObject」のコレクションにバインドされています。Object クラスにはpublic Dictionary<string, MyCell> MyObject { get; set; } MyCell クラスがあり、FirstBinding および SecondBinding プロパティ (文字列) があります。

4

1 に答える 1

-1

DataGridでも同様の問題が発生し、ウィンドウのサイズ変更や列の並べ替えなどの後に文字通り数秒で更新され、その間にウィンドウUIがロックされました(1000行5列)。

それは、WPFサイズ計算の問題(バグ?)に帰着しました。RowDefinition Height = "Auto"を使用してグリッドに配置しました。これにより、レンダリングシステムは、おそらくグリッド全体を埋めることによって、すべての列と行のサイズを測定することにより、実行時にDataGridのサイズを再計算しようとしました(私が理解しているように)。どういうわけかこれをインテリジェントに処理することになっていますが、この場合はそうではありませんでした。

これが関連する問題であるかどうかを確認するための簡単なチェックは、テスト中にDataGridのHeightプロパティとWidthプロパティを固定サイズに設定し、実行を再試行することです。パフォーマンスが回復した場合、恒久的な修正が次のオプションの中に含まれる可能性があります。

  • 含まれる要素のサイズを相対(*)または固定値に変更します
  • DataGridのMaxHeightとMaxWidthを、通常の使用で取得できる値よりも大きい固定値に設定します
  • サイズ変更戦略が異なる別のコンテナタイプを試してください(Grid、DockPanelなど)
于 2011-09-14T07:34:49.210 に答える