1

3 層アーキテクチャ (UI、BL、DAL) の WPF アプリケーションがあります。多数の行を含む WPF および DevExpress データグリッドの読み込みを処理する必要があります。BL メソッドは、WPF データグリッドにバインドされる監視可能なオブジェクトのコレクションを返します。レコード数が非常に多い場合、UI が応答しなくなります。そのため、BL メソッドがクエリを実行してデータを処理するときに、完了した作業のパーセンテージをプログレス バーに表示するようなソリューションを実装する必要があります。ここでは、クエリが実行されたときにすぐにレコードの総数を取得する必要があり、各行を処理した後、「1/2000 ドキュメントの処理」のように、ラベルでアイテム処理の現在のインデックスを表示する必要があります。

上記の機能を実現する最良の方法は何ですか。MVVM パターンを使用しています。BL でレコードをフェッチして処理する方法を変更する必要があるかどうか (現在は、BL メソッド内のフェッチと処理 (データリーダーからカスタム オブジェクトへの値のマップ))。または、ユーザーがデータグリッドをスクロールするときに、ページングされた方法でデータグリッドに行をロードすることを探しています。

サンプルのリンクは大歓迎です。

編集: @Big Daddy のソリューション 1) ビュー モデルに新しいプロパティを追加して、TotalCount と PercentComplete を取得します。2) ビューモデルを Search メソッドに渡します。3) BGW を使用してプロパティを更新します。

上記は実行可能な解決策のようです。しかし、ビューモデルに依存せずにこれを解決する他の方法があるかどうかを知りたいと思っています。この種の操作に使用できる設計パターンはありますか?

4

2 に答える 2

2

これを処理するには、BackgroundWorker を使用できます。データの取得中に UI をブロックせず、ユーザーに対する UI の応答性を維持します。BackgroundWorker には、ProgressBars と非常にうまく連携する ProgressChanged イベントがあります。

私が取り組んできたプロジェクトでは、BW をクライアント サービス/リポジトリに実装しました。ビューモデルは、このクラスへの呼び出しを行うことができます。ここでのメソッドは、BW をインスタンス化し、作業を行い、進行状況を報告し、データを返します。UI で進行状況を報告する必要があるため、次のように、view-model にプロパティを設定し、それに ProgressBar の値をバインドします。

ビューモデル

private int _percentCompleted;
    [DefaultValue(0)]
    public int PercentCompleted
    {
        get { return _percentCompleted; }
        set
        {
            _percentCompleted = value;
            RaisePropertyChanged(() => this.PercentCompleted);
        }
    }

意見

<ProgressBar x:Name="SourceBatchUploadProgressBar"
                         Style="{StaticResource GreenProgressBar}" Grid.Column="1"  Grid.Row="1" 
                         Value="{Binding PercentCompleted, UpdateSourceTrigger=PropertyChanged}" 
                         Height="25" Width="200" Margin="5,0,10,5"/>

これを機能させるには、BW の ReportProgress イベントで PercentCompleted プロパティを更新する必要があります。このようなもの:

BackgroundWorker.RunWorkerCompleted += (o, e) =>
        {
            ...Update progress
        };

詳細を知りたい場合は、お知らせください。

于 2012-09-18T14:15:50.220 に答える
1

したがって、すべての行があります。どのような処理を指していますか? レンダリング?表示されるレンダリングのステータスは、レンダリングが完了するまでレンダリングされないため、常に 100% になります。

UI が 2000 行をレンダリングするには長い時間がかかります。多くのフォーマットとサイジングが行われています。

UI を分割して、ページごとに 40 行ほど表示し、次のページ ボタンと前のページ ボタンを表示します。

DevExpress データグリッドが仮想化をサポートしていない場合は、サポートしているグリッドを探してください。速度については、ListView GridView が好きです。

うわー、チェック。あなたは聞いています。もっとあげます。

そのため、高速な場合は ID のリスト全体を一度に取得します (合計数を取得できます)。次に、必要に応じて 40 個のオブジェクトを作成します。凝ったものにしたい場合は、BackGroundWorker で次の 40 を作成します。BackGroundWorker を開始するときに [次へ] ボタンを無効にし、Complete で有効にします。

于 2012-09-18T13:45:21.863 に答える