この問題は私を数年間悩ませてきました、そして多分ここの誰かが私が再びそれに遭遇したので簡単な解決策を知っています。
質問:新しい(異なる)データソースがグリッドに割り当てられる前に、XtraGridに現在フォーカスされている行インデックスを「忘れる」方法はありますか?
背景XtraGridは、マルチペインWinformの別のパネルに表示されるものの一種のコントローラーとして使用します。
ここで、XtraGridのデータソースがメニューの選択に応じて変化し続けるという架空のシナリオを想像してみてください。メニュー項目1は、カフェテリアの今日のプリモピアットのリスト(ID、名前)をグリッドに表示します。メニュー項目2は、ユーザーがその日に電話をかけなければならない顧客のリスト(ID、名前)をグリッドに表示します。重要なことは、これらは別個の別個のデータソースであり、グリッドのデータソースが割り当てられ、再割り当てされていることです。
この質問の重要な事実:グリッドのFocusedRowChangedイベントを 、コントローラーグリッドでユーザーの選択をトラップする単一の場所にする必要があります。私たちは「スパゲッティコードなし」のショップです。FocusedRowChangedは、キーボードナビゲーションも処理するため、クリックイベントよりも優れています。フォーカスのある行には、パネル#2に表示するためにデータベースからフェッチする必要のある詳細レコードのIDが含まれています。これは機能します-ほとんどの場合。
動作しない方法は次のとおりです。特定の日に、ユーザーが連絡する必要のある顧客のリストに1行しか含まれていないとします。したがって、グリッドの最初の(そして唯一の)行はフォーカスされた行です。ここで、ユーザーがメニューに移動し、メニュー項目を選択してその日のカフェテリアのプリモピアットを表示するとします。ユーザーがEntreesリストの最初の項目をクリックしても、グリッドは前のデータソースからのフォーカスされた行インデックスのメモリを保持しているため、FocusedRowChangedイベントは発生しません。フォーカスされた行のインデックスは変更されていません。したがって、ユーザーの選択は何もトリガーしません。
DevExpressに2番目の行オブジェクト指向モード(行インデックス指向のアプローチとは異なる)を提供させようとしました。これにより、グリッド内の各行にGUIDがあり、FocusedRowChangedイベントは現在のGUIDが発生するたびに発生します。フォーカスされた行のインデックスがたまたま同じであったかどうかに関係なく、フォーカスされた行は以前にフォーカスされた行のGUIDとは異なりました。これにより、データソースの動的な変更が可能になり、目的の動作が可能になります。しかし、彼らは非難しました。
そこで、もう一度質問します。新しいデータソースがグリッドに割り当てられる前に、XtraGridに現在フォーカスされている行インデックスを「忘れる」方法はありますか?