4

それぞれの DataSources をフォームにドラッグして、DataGridView コントロールのセットを作成したいと考えています。オブジェクトとそのナビゲーション プロパティの 1 つ (DataSources から) に対してこれを行うと、マスターと詳細の関係に 2 つのグリッドができます。

Visual Studio 2012 (および EF 5.0) に移行した後、最初のグリッドは (ナビゲーターを使用して) 期待どおりに表示されます。ただし、「詳細」グリッドでは、2 つの列のみが表示されます (「Count」と「IsReadOnly」)。他のテーブル/オブジェクトで試してみましたが、同じ問題が発生しました。「列の編集」と「列の追加」を使用できないようにしました。例としてノースウィンドを使用します。フォームに 2 つの datagridview が必要です。1 つは顧客用で、もう 1 つは関連する注文用です。典型的なマスター/詳細ビュー。

  1. プロジェクト (edmx) ファイルにモデルを追加しました。

  2. モデルに新しいデータソースを追加しました。2 つのオブジェクト。顧客と注文のテーブル!

  3. 顧客エンティティを datagridview としてドラッグしました。すべてのフィールド (プロパティ) はグリッドにあります。

4 注文エンティティ自体ではなく顧客エンティティから注文をドラッグすると、「カウント」と「読み取り専用」という名前の 2 つの列しかありません。

上記の手順は、linq to sql VS 2012、EF 4.0、.NET 4.5 で正常に機能します。ただし、EF 5.0 ではありません。

と、

手順は、 http: //blogs.msdn.com/b/bethmassi/archive/2008/12/10/master-details-with-entity-framework-explicit-load.aspx で説明されている beth massi の方法とまったく同じですが、これは遅延読み込みや熱心な読み込みの問題ではありません!

4

1 に答える 1

1

作業しようとしているエンティティのクラスで、ナビゲーションプロパティタイプをObservableCollectionに変更します。

これから:

public Customer()
    {
        this.CustomerAddresses = new HashSet<CustomerAddress>();
    }

    public virtual ICollection<CustomerAddress> CustomerAddresses { get; set; }
}

これに:

public Customer()
    {
        this.CustomerAddresses = new ObservableCollection<CustomerAddress>();
    }

    public virtual ICollection<CustomerAddress> CustomerAddresses { get; set; }
}

これは自動生成されたコードであるため、コード生成ファイルのいくつかのルールも変更する必要があります。これらの変更を手動で行って、最初に機能することを確認してから、変更を加えてください。私の場合、.ttファイルに次の変更を加える必要がありました

System.Collections.ObjectModelを使用して、そのことを示す以下の行を追加して追加します。

return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion())
        ? string.Format(
            CultureInfo.InvariantCulture,
            "{0}using System;{1}" +
            "{2}",
            inHeader ? Environment.NewLine : "",
            includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "",
            includeCollections ? (Environment.NewLine + "using System.Collections.ObjectModel;") : "",
            inHeader ? "" : Environment.NewLine)
        : "";

そして、HastSet宣言をObservableCollectionに変更します

this.<#=code.Escape(navigationProperty)#> = new ObservableCollection<<#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType())#>>();

また、ここでICollectionをObservableCollectionに変更します

navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType,

あなたのコード生成ファイルは私のものとは異なるかもしれませんが、これらのコード部分はあなたにあなたのファイルで何を検索するべきかについての考えを与えるはずです。

于 2013-01-11T15:30:16.803 に答える