2012-04-26 3 views
0

Я пытаюсь установить связь между деталями между двумя DataGridView. У меня есть EntityModel с двумя объектами, связанными с Ассоциацией «ClientComissions». Они были созданы из существующей базы данных и имеют свойства навигации, которые работают хорошо. Proof (консольное приложение с использованием упоминалось 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

Прицепные два ListViews по форме и называть их 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

+0

Все они являются хорошими технологиями для доступа к данным в .NET. Типичный набор данных является старым, и теперь ADO.NET Entity Framework (EF) является новым. по этой причине EF может лучше справляться с отношениями в базе данных. Кроме того, он может использовать технологию LINQ и больше использовать. Но, это не должно быть блокирующим для вас? Я выделил решение проблемы, которую вы задавали в рабочем прототипе. Теперь вы сможете вывести свое собственное решение из этой концепции. –

+0

Спасибо за ваши усилия, но все же я попытался найти способ работать с EF и WinForms. Я знаю, как работать с DataSet. Что касается результата моего исследования - нет прямого пути к «без кодовому» привязке мастер-детали к EF. Существует проект с открытым исходным кодом http://www.codeproject.com/Articles/221931/Entity-Framework-in-WinForms, который делает трюк. – Excelan

Смежные вопросы