4

これは少し複雑なので、我慢してください。

TDataset.Editを呼び出しSetState(dsEdit);ます。DataEvent(deUpdateState, 0);

TDataSet.DataEventのパラメーターで呼び出されたdeUpdateState場合、データセットでコントロールを無効にしたdeLayoutChange場合、コントロールが再度有効になったときにイベントを送信するフラグを設定します。ドキュメントによると、「データのレイアウトデータベース対応コントロールが変更されました。」

再有効化されるコントロールがデータ バインド グリッドである場合、非常にコストのかかるリセットが発生し、グリッド全体を再レイアウトする必要があります。多数の行と列を含む大規模なデータセットでは、グリッドのレイアウトに影響するコントロールが無効になっている間に何もしなかった場合でも、これには数秒かかることがあります。

これが起こらないようにする方法はありますか? SetState仮想ではありません。 DataEvent仮想ですが、FEnableEventこれを設定するために使用するフィールドには、派生クラスからアクセスできません。ひどいハッキングなしにこれを回避する方法はないようです。(RTTI手術、オーバーレイクラスなど)それをうまくやってのけるより良い方法を知っている人はいますか?

4

2 に答える 2

0

データセットが DevExpress グリッドに接続されているというコメントに基づいて、私はそこから探し始めます。編集を行うコードを cxgrid.BeginUpdate と cxgrid.EndUpdate および try/finally ブロックでラップします。

MycxGrid.BeginUpdate;
try
   {Do some data editing}
finally
  MycxGrid.EndUpdate;
end;

これだけで、あなたの問題を解決できるかもしれません。表示されない場合は、DevExpress ヘルプ ファイル TcxDBDataModeController.SmartRefresh および TcxDBDataModeController.SyncMode を参照してください。

あなたのコードを見なければ、私は推測しているだけです。しかし、BeginUpdate/EndUpdate の組み合わせを発見する前に、私はあなたと非常によく似たパフォーマンスの問題を抱えていました。

于 2013-03-29T19:04:32.727 に答える
0

TcxGrid についてはわかりませんが、コントロール側でこれを解決して、 をオーバーライドするか、グリッド自体TcxGridDataLink.LayoutChanged別のメソッドをオーバーライドしてみてください。

TDBGrid類推として:

  • TCustomDBGrid.CreateDataLink動的でオーバーライドできるため、独自のTGridDataLink派生物をTDBGrid子孫に注入できます。
  • TGridDataLink.LayoutChanged仮想であり、オーバーライドできます。これがオプション 1 です。
  • TGridDataLink.LayoutChangedを呼び出しますFGrid.LayoutChanged
  • TCustomDBGrid.LayoutChangedも仮想であるため、オプション 2 になります。
于 2013-03-29T21:33:29.110 に答える