よくあるデータ連結のシナリオとして、データクラスが他のデータクラスへの参照を持つ場合があります。たとえば、Product オブジェクトが Category オブジェクトや Supplier オブジェクトへの参照を持つ場合です。
ADO.NET では、通常、参照は他のテーブルにマップされる外部キー(Product.CategoryID や Product.SupplierID)として表されます。
Entity Framework でもキー列を取得しますが、実際のオブジェクトも取得します。このため、Product.CategoryID(通常は整数)と Product.Category(実際の Category オブジェクト)があります。
グリッドに外部キーを表示しても、あまり役に立ちません。これは、Category(カテゴリ)12 が "Dairy Products" であることや、Supplier(仕入れ先)15 が "ACME Imports" であることをユーザーが知っていることはないためです。これらのキーの編集をユーザーに許可することはさらに問題です。一般に、この問題に対処するには、関連するエンティティ列を連結グリッドから削除します。または、それらの列をカスタム列に置き換え、コンボボックスを使用して値を編集できるようにします("ルックアップ")。関連する値(Category.Name や Supplier.CompanyName)がコンボボックスに表示され、コンボボックスの内容がグリッドに表示されている値と同期するように、コンボボックスを関連するテーブルに連結し、そのプロパティを設定する必要があります。この作業はそれほど難しくありませんが、エラーの元になりやすく面倒なタスクなので、プロジェクトの作成と維持が難しくなります。
C1DataSource は、開発者に代わって、この面倒な作業を実行します。コンボボックスルックアップが表示されるように、関連するエンティティ列を自動的に変更します。この作業は、サポートされているいくつかのタイプのデータグリッドで実行可能です。現在サポートされている WinForms グリッドは C1FlexGrid と Microsoft DataGridView です。ここでは、C1FlexGrid でこれを実行する方法について説明します。
C1DataSource には、ControlHandler という拡張プロパティがあります。C1DataSource を含むフォームに C1FlexGrid コントロールを配置すると、グリッドに ControlHandler プロパティが追加されます。ControlHandler は、この時点では1つのブール値プロパティ AutoLookup を含むオブジェクトです。このプロパティを True に設定すると、C1DataSource は、他のエンティティへの参照を含むグリッド列にルックアップコンボボックスが表示されるように設定します。
この動作を確認するには、次の手順に従います。
このように、Category 列と Supplier 列はまったく有効でありません。これらの列を削除したり、新しい列を作成するコードを記述してグリッドをカスタマイズすることができますが、もっと簡単な方法があります。
コンボボックスに表示される文字列値(名前)は、次のルールに従って決定されます。