DataSource for Entity Framework for WPF/Silverlight
グリッドの自動ルックアップ列
DataSource for Entity Framework > グリッドの自動ルックアップ列

よくあるデータ連結のシナリオとして、データクラスが他のデータクラスへの参照を持つ場合があります。たとえば、Product オブジェクトが Category オブジェクトや Supplier オブジェクトへの参照を持つ場合です。

ADO.NET では、通常、参照は他のテーブルにマップされる外部キー(Product.CategoryIDProduct.SupplierID)として表されます。

Entity Framework でもキー列を取得しますが、実際のオブジェクトも取得します。このため、Product.CategoryID(通常は整数)と Product.Category(実際の Category オブジェクト)があります。

グリッドに外部キーを表示しても、あまり役に立ちません。これは、Category(カテゴリ)12 が "Dairy Products" であることや、Supplier(仕入れ先)15 が "ACME Imports" であることをユーザーが知っていることはないためです。これらのキーの編集をユーザーに許可することはさらに問題です。一般に、この問題に対処するには、関連するエンティティ列を連結グリッドから削除します。または、それらの列をカスタム列に置き換え、コンボボックスを使用して値を編集できるようにします("ルックアップ")。関連する値(Category.NameSupplier.CompanyName)がコンボボックスに表示され、コンボボックスの内容がグリッドに表示されている値と同期するように、コンボボックスを関連するテーブルに連結し、そのプロパティを設定する必要があります。この作業はそれほど難しくありませんが、エラーの元になりやすく面倒なタスクなので、プロジェクトの作成と維持が難しくなります。

C1DataSource は、開発者に代わって、この面倒な作業を実行します。コンボボックスルックアップが表示されるように、関連するエンティティ列を自動的に変更します。この作業は、サポートされているいくつかのタイプのデータグリッドで実行可能です。現在サポートされている WinForms グリッドは C1FlexGrid と Microsoft DataGridView です。ここでは、C1FlexGrid でこれを実行する方法について説明します。

C1DataSource には、ControlHandler という拡張プロパティがあります。C1DataSource を含むフォームに C1FlexGrid コントロールを配置すると、グリッドに ControlHandler プロパティが追加されます。ControlHandler は、この時点では1つのブール値プロパティ AutoLookup を含むオブジェクトです。このプロパティを True に設定すると、C1DataSource は、他のエンティティへの参照を含むグリッド列にルックアップコンボボックスが表示されるように設定します。

この動作を確認するには、次の手順に従います。

  1. 簡単な連結」で使用したプロジェクトを使用します。前と同様に、同じ ContextType を使用して、C1DataSource コンポーネントを含む新しいフォームを追加します。
  2. ViewSourceCollection エディタで ViewSource を作成します。EntitySetName には「Products」と入力します。
  3. C1FlexGrid をフォームに追加し、その C1DataSource プロパティを C1DataSource に、DataMember プロパティを Products に設定します。
  4. アプリケーションを保存、ビルド、および実行します。次のようになります。

    このように、Category 列と Supplier 列はまったく有効でありません。これらの列を削除したり、新しい列を作成するコードを記述してグリッドをカスタマイズすることができますが、もっと簡単な方法があります。

  5. デザイナでグリッドを選択し、次の図に示されているように、プロパティウィンドウで「ControlHandler on c1DataSource1」という名前のプロパティを見つけます。
  6. これは拡張プロパティで、フォーム内に C1DataSource コンポーネントが存在する場合にのみ使用できることに注意してください。AutoLookup プロパティを True に設定します。
  7. 作業が完了したら、プロジェクトを再度実行して、Category 列と Supplier 列を確認します。グリッドに、汎用文字列ではなく、カテゴリ名と仕入れ先の会社名が表示されていることに注目してください。また、ドロップダウンリストから値を選択して、製品のカテゴリや仕入れ先を編集したり、自動検索機能を使用して値を入力することもできます。

  8. 最後に、列ヘッダーをクリックして、CategorySupplier でグリッドをソートします。グリッドに表示されている値に基づいてソートが実行されることに注目してください。これは誰もが求める機能ですが、通常のデータ連結を使用して実装することは容易でありません。

コンボボックスに表示される文字列値(名前)は、次のルールに従って決定されます。

  1. エンティティクラスで ToString メソッドをオーバーライドしている場合、エンティティの文字列表現は、オーバーライドされた ToString メソッドを使用して取得されます。このメソッドは、エンティティを一意に表現する文字列を返す必要があります。たとえば、CompanyName 列の内容、または FirstNameLastNameEmployeeID の組み合わせなどが考えられます。パーシャルクラスを使用して簡単かつ柔軟に実装できるため、これは推奨の方法です(エンティティモデルが再生成されても、実装が影響を受けない)。
  2. エンティティクラスで ToString メソッドがオーバーライドされていないが、いずれかのプロパティに DefaultProperty 属性が含まれる場合は、そのプロパティがエンティティの文字列表現として使用されます。
  3. エンティティクラスで ToString メソッドがオーバーライドされず、どのプロパティにも DefaultProperty 属性が含まれていない場合は、名前に文字列 "Name" または "Description" が含まれている最初の列がエンティティの文字列表現として使用されます。
  4. 上のどのルールにも該当しない場合、そのエンティティタイプにはルックアップが作成されません。