0

TreeView と DataGridView の 2 つの要素と 2 つの EventHandelr を持つ C# プログラムがあります。TreeView でアイテムが選択されると、いくつかの情報を表示し、ユーザーが編集できるテーブルを含む DataGridView。TreeView の各項目には、独自の一意のテーブルがあります。ユーザーが DataGridView からフォーカスを外すと、ソフトウェアの基礎となるソフトウェア モデルが更新されます (ユーザーが行った変更を保存します)。

aDataGridView_Leave(object sender, EventArgs e)
{
     //Update the software model (save the current DataGridView)
}

aTreeView_AfterSelect(object sender, EventArgs e)
{
    //Update the table that is shown in aDataGridView
}

私の問題は、ユーザーが TreeView で別の項目を選択して DataGridView に焦点を合わせていない場合、本質的にこれらのイベントのどれが最初に発生するかで競合状態が発生することです (これはすべて 1 つのスレッド上にあります)。明らかに、この場合、DataGridView_Leave イベントを最初に起動するか、ユーザーがテーブルに加えた変更が、変更が保存される前に読み込まれる新しいテーブルによって吹き飛ばされます。

とにかく、どのイベントが最初に発生するかを強制する適切な方法はありますか?

4

3 に答える 3

0

すぐに頭に浮かぶのは、ある種のカウンターです。各イベント呼び出しに番号を割り当て、最後に処理されたものを保存します。そうすれば、それが古いイベントであるかどうかを確認し、無視することができます。私はそれがC#で正確に使用されているのを見たことがありませんが、ネットワーク遅延がしばしばこの状況を引き起こすAJAXでの多くの場合。

于 2012-05-31T18:50:13.897 に答える
0

発生したイベントをログに記録するために、ツリービュー、グリッドビュー、およびテキスト ボックスを備えた単純な Windows フォーム アプリケーションを作成しました。グリッドビューを離れると、選択後のツリービューの前にその leave イベントが常に発生します。

データをグリッドビューに非同期で保存していますか? 非同期で保存しているかどうかを確認できた場合、非同期メソッドがグリッドから保存するデータを取得する前に、選択後のツリービューが起動する可能性があります。

この場合、gridviews データをスタックにプッシュし、保存を行うメソッドでポップします。

于 2012-05-31T21:05:13.350 に答える
0

isDirty保存する必要がある変更がある場合に true の bool を保持することで、これを解決できるようです。プロパティ セッターなどで、これを自分で追跡する必要があります。必要に応じてチェックisDirtyインして保存し、変更がない場合は保存しないようにします。aTreeView_AfterSelectaDataGridView_Leave

これは機能するはずですが、あなたの設定は少しハッキーに思えます。要素がフォーカスを失ったときに変更が保存されることは、ユーザーにとって直感に反するかもしれません。

于 2012-05-31T18:53:30.820 に答える