0

何が問題なのですか:

SpreadsheetGear WorkbookView でセルを編集し、Enter、Tab、または矢印キーのいずれかを押して CellEndEdit イベントを開始すると、入力した値が消去されます。

環境:

  • WorkbookView でセルを編集すると、TextEdit のように動作する WorkbookView の上にコントロールが追加され、データを入力できるようになります。CellEndEdit イベントが発生すると、コール スタックは WorkbookView が ControlCollection.Remove(...) を呼び出すことを示します。
  • これにより、フォームはページ上の別のコントロールにフォーカスを移します。問題のページには、ベース ページから継承された WorkbookView の上にいくつかの TextEdit コントロールが含まれています。最初の TextEdit に少しの間フォーカスが与えられます。
  • これらの TextEdit で検証が設定され、最終的にモデルの更新が開始されます。これは、ビューの変更がモデルにプッシュされる前にすべて発生するため、WorkbookView の内容が消去されます。

質問:

WorkbookViews イベント ハンドラーがビューの変更をモデルにプッシュする前に、他のコントロールがフォーカスを受け取らないようにする方法はありますか? または、これをより適切に処理する別の方法はありますか?

私がどこかで詳しく説明できるか、または自分自身をよりよく説明できるかどうか教えてください、ありがとう!

アップデート:

1 つの DevExpress TextEdit と 1 つの SpreadsheetGear WorkbookView を使用してテスト アプリケーションを作成しました。textEdit1_Validated と textEdit1_Enter を追加すると、同じ動作になります。フォーカスは、検証ハンドラーが原因であると思われる TextEdit コントロールに移動します。

4

1 に答える 1

0

どうやら、DevExpress TextEdit コントロールの検証ハンドラーがフォーカスを要求しており、モデルの更新中に実行されたステートメントの 1 つに問題があったようです。SpreadsheetGear WorkbookView 内のデータのビューのプロパティは、このプロパティのモデルのバージョンに設定されていました。モデルは、デフォルト値またはユーザー定義値のいずれかを持つことができます。

声明は次のようなものでした。

view.Data = model.IsUserDefined ? model.Data.UserDefined : model.Data.Default

ステートメントを次のように変更しました。

if (!model.IsUserDefined)
{
    view.Data = model.Data.Default;
}

入力されているデータがユーザー定義の場合、ユーザーはデータを入力しており、この if ステートメントにより、基本的にページ全体の検証後までビューがそのデータを保持できるため、これで問題が解決しました。コールスタックには、特にこの Data プロパティのモデルへの更新があります。

個人的な実装の問題だったので、これはおそらく一般の人々にはあまり役に立たないでしょう。しかし、メジャー アップデートをバリデーション ハンドラーに関連付けると、このようなことが後々、アップデート ステートメントの追加によって発生することは間違いないことは注目に値すると思います。

于 2013-02-19T21:52:17.040 に答える