Вопрос по entity-framework – Привязать DataGridView к сущностям в «мастер-детализации»

0

Я пытаюсь установить отношение "мастер-деталь" между двумя DataGridView. У меня есть EntityModel с двумя объектами, связанными с помощью «ClientComissions» Ассоциация. Они были сгенерированы из существующей БД и имеют свойства навигации, которые хорошо работают. Proof (консольное приложение, использующее упомянутую EntityModel):


            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);
                }
        }

Но я не могу связать два DataGridView в мастер-манере в форме окна:


        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";
        }

    }

этот код загружает комиссии только один раз, для первого клиента в сетке. Но когда я изменяю строку Current в Clients Grid, больше нет запросов к БД, и navComissionsGrid всегда показывает комиссию для первого клиента. :(

Ваш Ответ

1   ответ
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

Существует разница между DataSet и EntityDataModel. Excelan
Это все хорошие технологии для доступа к данным в .NET. Типизированный набор данных является старым, и на данный момент ADO.NET Entity Framework (EF) является новым. Что касается причины, EF может лучше обрабатывать отношения в базе данных. Кроме того, он может использовать преимущества технологии LINQ и более удобен в использовании. Но это не должно быть блокирующим для вас? Я выделил решение проблемы, которую вы задавали в рабочем прототипе. Теперь вы должны иметь возможность вывести собственное решение из этой концепции.
Чувак! Почему понижение ... предоставьте решение вместо этого!
Спасибо за ваши усилия, но все же я попытался найти способ работать с EF и WinForms. Я знаю, как работать с DataSet. Что касается результатов моего расследования - не существует прямого пути к «без кода» привязка мастер-детали к EF. Есть проект с открытым исходным кодомcodeproject.com/Articles/221931/Entity-Framework-in-WinForms это делает трюк. Excelan

Похожие вопросы