2011-08-09 13 views
6

私は社内のソフトウェア追跡プログラムで作業しています。各プログラムリビジョンには、従業員データベースのリードプログラマが割り当てられています。私の単純なモデルは、これまでのようになります。これがうまく働いた、と私はに結合することができたエンティティフレームワークの関連付けをコンボボックスにバインドするにはどうすればよいですか?

Dim container as new EntityContainer 
revisionBindingSource.DataSource = container.Revisions 
... 
dgRevisions.DataSource = revisionBindingSource 
dgRevisions.DataMemeber = "" 

Entity Framework model

は当初、私は私のRevisionsコレクションにバインドされたRevisionBindingSourceオブジェクトを持っていました

lblAppTitle.DataBindings.Add("Text",revisionBindingSource,"Application.Title") 

しかし、私は今必要とするCoアイテムが従業員のリストにバインドされ、選択された値が現在のリビジョンの主プログラマにバインドされているmboBoxです。私は新しいemployeeBindingSourceを作ってみましたが、私はValueのための結合メンバーを持っていないことに気づい:

employeeBindingSource.DataSource = container.Employees 
... 
cboLead.DataSource = employeeBindingSource 
cboLead.DisplayMember = "Name.Display" 'Name is a complex type' 
cboLead.ValueMember = '?? 

だから私は1 bindingSourceを持っているだけに、私のバインディングの一部を書き直しました:これはまだない

bindingSource.DataSource = container 
... 
dgRevisions.DataSource = bindingSource 
dgRevisions.DataMemeber = "Revisions" 
... 
cboLead.DataSource = bindingSource 
cboLead.DisplayMember = "Employees.Name.Display" 
cboLead.ValueMember = "Employees" 
... 
lblAppTitle.DataBindings.Add("Text",bindingSource,"Revisions.Application.Title") 

ComboBoxに何かを設定することさえできます。

2つの異なるバインディングソース、または1つのパターンを使用する方がよいでしょうか?私のComboBoxをバインドする際に間違っているのは何ですか?そして、私のComboBoxが一旦設定されると、現在の値をリビジョンのリードプログラマにバインドするにはどうしたらいいですか?

長時間の質問のため、申し訳ありません、ありがとうございます。

+0

1あなたの質問 –

+1

何UIフレームワークの素敵なプレゼンテーションのために使用しています。 WinForms?より良い回答を得るためにタグを追加してください。 –

+0

いくつかの有料コントロールはそれを行います(私はDevExpressを使用しており、これを実行できます)。あなたは通常のコンボボックスから拡張し、必要なものを返すカスタムコンボボックスを書くことを検討するかもしれません。 –

答えて

3

フォームに複数のバインディングソースがある場合は何も問題ありません。実際、上記のようにバインディングソースを「連鎖する」ことは、便利な戦略になる可能性があります。

ただし、.Valueプロパティを実際のEFオブジェクトにバインドするための記入が必要なリンクがありません:バインディングのために別のクラスを作成する必要があります。この手法は、列挙にバインドするときにも非常に便利です。

このテクニックは、EFデータモデルがUIの動作方法と完全に一致しない場合に非常に一般的です。 WPF(この例のようにWinFormsではありません)では、これはViewModelの一部と呼ばれることがよくあります。これを数回行うと、それは第二の性質になります。ここで

は、あなたが作成する必要がありますクラスのサンプル実装です:

public class EmployeeBindingObject 
{ 
    public Employee Employee { get; private set; } 
    public string EmployeeName 
    { 
     get { return this.Employee.Name; } 
    } 

    private EmployeeBindingObject(Employee employee) 
    { 
     this.Employee = employee; 
    } 

    /// <summary> 
    /// Gets a binding list for a specified list of Employees. 
    /// </summary> 
    /// <param name="types"></param> 
    /// <returns></returns> 
    public static IBindingList GetBindingList(IEnumerable<Employee> employees) 
    { 
     BindingList<EmployeeBindingObject> result = new BindingList<EmployeeBindingObject>(); 

     foreach (var ee in employees) 
     { 
      result.Add(new EmployeeBindingObject(ee)); 
     } 

     return result; 
    } 
} 

あなたは、このクラスを作成したら、コンパイルして、データソース(データ作成する必要があります - > [新しいデータソースの追加を。.. 。)のEmployeeBindingObjectです。

  1. ValueMemberEmployeeから
  2. はあなたの他のBindingSourceのEmployeeプロパティにDisplayMember
  3. EmployeeNameに設定SelectedValueプロパティを設定した設定します。
  4. 次に、あなたのコードでは、次のようにバインディングオブジェクトのBindingSourceを初期化する必要があります。

    employeeBindingObjectBindingSource.DataSource = 
        EmployeeBindingObject.GetBindingList(container.Employees) 
    
関連する問題