2012-04-26 35 views
0

我試圖建立兩個DataGridView之間的主 - 細節關係。 我有一個EntityModel與「ClientComissions」Association連接的兩個實體。 它們是從現有數據庫生成的,具有導航屬性,可以很好地工作。 證明(控制檯應用程序使用提到EntityModel):以「主 - 細節」方式將DataGridView綁定到實體


  using (var context = new MnxEntities()) 
     { 
      Client client = context.Clients.FirstOrDefault(); 
      // profiler: "SELECT TOP (1) ... FROM [Clients] AS [c]" - Ok! 
      Console.WriteLine("Client: {0}", client.Name); 
       foreach (Comission comission in client.NavComissions) 
       // profiler: "SELECT ... FROM [Comissions] WHERE [StateCode] = '20971504'" - Ok! 
       { 
        Console.WriteLine("Agreement number: {0}", comission.Dog_Num); 
       } 
     } 

但我不能在窗口形式結合在主 - 從方式在兩個DataGridViews:


 private void tabComissions_Enter(object sender, EventArgs e) 
    { 
     using (var context = new MnxEntities()) 
     { 
      clientDataGridView.DataSource = context.Clients; 

      comissionsDataGridView.DataSource = clientDataGridView.DataSource; 
      comissionsDataGridView.DataMember = "WHAT SHOULD BE HERE?"; 
     } 
    } 

我知道有一個BindingContext,它必須使用CurrencyManager完成所有工作,不需要手寫代碼。

我在這裏呆了很多時間。請幫助。


UPD:

 private void AnswerFromStackRefactored() 
    { 
     using (var context = new MnxEntities()) 
     { 
      clientBindingSource.DataSource = context; 
      clientBindingSource.DataMember = "Clients"; 

      navComissionsBindingSource.DataSource = clientBindingSource; 
      navComissionsBindingSource.DataMember = "NavComissions"; 
     } 

    } 

此代碼加載收預訂費只有一次,在網格中的第一個客戶。 但是,當我更改客戶端網格中的當前行時,不再有對數據庫的查詢,並且navComissionsGrid總是顯示第一個客戶端的調用。 :(

回答

1

拉表格上的兩個列表視圖,並分別命名他們爲lstcategory和lstProduct。然後下面的代碼複製[它很簡單。你可以將相同的概念,您的問題。

public partial class MasterDetail : Form 
    { 
     public MasterDetail() 
     { 
      InitializeComponent(); 
     } 

     private BindingManagerBase categoryBinding; 
     private DataSet ds; 

     private void MasterDetail_Load(object sender, EventArgs e) 
     { 
      ds = GetCategoriesAndProducts(); 

      // Bind the lists to different tables. 
      lstCategory.DataSource = ds.Tables["Categories"]; 
      lstCategory.DisplayMember = "CategoryName"; 

      lstProduct.DataSource = ds.Tables["Products"]; 
      lstProduct.DisplayMember = "ProductName"; 

      // Track the binding context and handle position changing. 
      categoryBinding = this.BindingContext[ds.Tables["Categories"]]; 
      categoryBinding.PositionChanged += new EventHandler(Binding_PositionChanged); 

      // Update child table at startup. 
      UpdateProducts(); 
     } 

     private void Binding_PositionChanged(object sender, System.EventArgs e) 
     { 
      UpdateProducts(); 
     } 

     private void UpdateProducts() 
     { 
      string filter; 
      DataRow selectedRow; 

      // Find the current category row. 
      selectedRow = ds.Tables["Categories"].Rows[categoryBinding.Position]; 

      // Create a filter expression using its CategoryID. 
      filter = "CategoryID='" + selectedRow["CategoryID"].ToString() + "'"; 

      // Modify the view onto the product table. 
      ds.Tables["Products"].DefaultView.RowFilter = filter; 
     } 

     public DataSet GetCategoriesAndProducts() 
     { 
      DataTable category = new DataTable("Categories"); 
      category.Columns.Add("CategoryID"); 
      category.Columns.Add("CategoryName"); 

      category.Rows.Add(new object[] { "1", "Food" }); 
      category.Rows.Add(new object[] { "2", "Beverage" }); 


      DataTable product = new DataTable("Products"); 
      product.Columns.Add("CategoryID"); 
      product.Columns.Add("ProductName"); 

      product.Rows.Add(new object[] { "1", "Rice" }); 
      product.Rows.Add(new object[] { "1", "Pasta" }); 

      product.Rows.Add(new object[] { "2", "Cola" }); 
      product.Rows.Add(new object[] { "2", "Coffee" }); 
      product.Rows.Add(new object[] { "2", "Tea" }); 


      DataSet ds = new DataSet(); 
      ds.Tables.Add(category); 
      ds.Tables.Add(product); 

      // Set up a relation between these tables (optional). 
      DataRelation relCategoryProduct = new DataRelation("CategoryProduct", 
       ds.Tables["Categories"].Columns["CategoryID"], 
       ds.Tables["Products"].Columns["CategoryID"]); 

      ds.Relations.Add(relCategoryProduct); 

      return ds; 
     } 

    }  

enter image description here

+0

DataSet和EntityDataModel之間有區別 – Excelan 2012-04-27 04:44:05

+0

它們都是.NET中數據訪問的好技術,Typed數據集是舊的,現在ADO.NET實體框架(EF)是新的。因此,EF可以更好地處理數據庫中的關係,並且可以利用LINQ技術的優勢,並且更具說服力有用的。但是,這不應該成爲你的阻擋者?我已經強調了您在工作原型中所要求的問題的解決方案。現在,你應該能夠從這個概念中推導出你自己的解決方案。 – 2012-04-27 09:56:05

+0

感謝您的努力,但仍試圖找到一種與EF和WinForms協同工作的方法。我知道如何使用DataSet。至於我的調查結果 - 沒有直接的方式來「無代碼」的主 - 細節綁定到EF。有一個開源項目http://www.codeproject.com/Articles/221931/Entity-Framework-in-WinForms可以做到這一點。 – Excelan 2012-04-27 11:17:30

相關問題