DataSource for Entity Framework for WinForms
ビューのカスタマイズ
設計時の機能 > ビューのカスタマイズ

さまざまな状況で、データベースから提供されるテーブルやビューに直接対応していないカスタムビューを使用したいことがあります。LINQ は、このような状況に最適なツールです。柔軟、簡潔、かつ効率的なクエリーステートメントと任意の言語を使用して、生データを変換できます。C1DataSource では、LINQ クエリーステートメントを動的に実行できるので、LINQ がさらに強力になります。このため、C1DataSource による LINQ 実装は LiveLinq と呼ばれます。LiveLinq の機能については、「ライブビュー」で説明します。ここでは、完全な更新可能性と連結可能性を損なうことなく、LINQ 演算子を使用して自由にビューを変更し、形成できるということだけを伝えておきます。

さっそく、LINQ 演算子の1つである Select("プロジェクション" とも呼ばれます)を使用して、ビューのフィールド(プロパティ)をカスタマイズしてみます。

ビューをカスタマイズするには、次の手順に従います。

  1. ページング」の説明で作成したプロジェクトを使用します。前と同様に、同じ ContextType を使用して、C1DataSource コンポーネントを含む新しいフォームを追加します。このフォームをスタートアップフォームにすることで、プロジェクトの実行にかかる時間を短縮することができます。
  2. ViewSourceCollection エディタで ViewSource を作成します。サンプルデータベースの Products テーブルを使用します。
  3. フォームに DataGrid を追加しますが、これまでの例とは異なり、設計時には実際に C1DataSource を連結しません。カスタムビューを実装するので、これは実行時にコードで行います。
  4. 次のディレクティブステートメントをフォームのコードに追加します。
    コードのコピー
    Imports C1.LiveLinq.LiveViews
    
    コードのコピー
    using C1.LiveLinq.LiveViews;
    
  5. フォームの Load イベントに次のコードを追加して、カスタムライブビューを作成し、それをグリッドに連結します。
    コードのコピー
    dataGridView1.DataSource = _
         (From p In C1DataSource1("Products").AsLive(Of Product)()
                                 Select New With
                                 {
                                     p.ProductID,
                                     p.ProductName,
                                     p.CategoryID,
                                     p.Category.CategoryName,
                                     p.SupplierID,
                                     .Supplier = p.Supplier.CompanyName,
                                     p.UnitPrice,
                                     p.QuantityPerUnit,
                                     p.UnitsInStock,
                                     p.UnitsOnOrder
                                 }).AsDynamic()
    
    コードのコピー
    dataGridView1.DataSource =
         (from p in c1DataSource1["Products"].AsLive<Product>()
             select new
                  {
                      p.ProductID,
                      p.ProductName,
                      p.CategoryID,
                      CategoryName = p.Category.CategoryName,
                      p.SupplierID,
                      Supplier = p.Supplier.CompanyName,
                      p.UnitPrice,
                      p.QuantityPerUnit,
                      p.UnitsInStock,
                      p.UnitsOnOrder
                  }).AsDynamic();
    

    ここで、c1DataSource1["Products"] は1つの ClientCollectionView オブジェクトです。これは、デザイナで設定したビューソースによって作成されるビューです。コードでビューソース自体にアクセスする必要がある場合は、c1DataSource.ViewSources["Products"] としてアクセスすることもできます。AsLive() 拡張メソッド呼び出しは、ビューの項目タイプ(Product)を指定するために必要です。これにより、この項目に LiveLinq 演算子を適用できます。c1DataSource1["Products"].AsLive<Product>() の結果は1つの View<Product> です。C1.LiveLinq.LiveViews.View は、クライアント側ライブビューで使用される LiveLinq のメインクラスです。ライブビューに適用される LINQ 演算子は、ライブビューの更新可能性と連結可能性を維持します。これらは、通常と同じ LINQ 演算子ですが、ライブビューに適用されることで、データ連結アプリケーションに極めて重要な追加機能を提供します。

    メモ: ビューの結果セレクタ(select new 以下のコード)で匿名クラスを使用しているため、このビューには AsDynamic() を適用する必要があります。これは、匿名クラスに対してのみ課せられる LiveLinq の小さな制限です。このようなビューに AsDynamic() を追加し忘れると、例外によって通知されます。
  6. アプリケーションを保存、ビルド、および実行します。これで、この LiveLinq ビューの 'select' 句で定義した列がグリッドに表示されます。すべての列が変更可能であることにも注目してください。これは大したことに思えないかもしれませんが、ここで示すように行の追加や削除もサポートされる場合は特に、カスタマイズされたビューに独自に実装することが難しい重要な機能です。LiveLinq 演算子が更新可能性を維持すると言ったことの意味はこれです。

連結可能性は、ビューが常に "ライブ" であり、静的データの単純なスナップショットではないことによって実現されます。これを証明するため、先ほどビルドしたフォームの正確な複製を構築します。この段階では、作成したフォームに簡単にアクセスできるように、アプリケーションにメニューを追加することも簡単でしょう。アプリケーションを保存、ビルド、および実行します。今回は、作成した2つのフォームインスタンスを開き、一方のフォームのグリッドでデータを変更します。もう一方のフォームのグリッドで、対応するデータが自動的に変更されることに注目してください。これらのフォームのグリッドに対して、行った変更を同期するためのコードを1行も記述していないことを思い出してください。

ライブビュー」では、その他の LiveLinq の機能について確認します。