WinForms C # Entity Framework комбинированный список - PullRequest
0 голосов
/ 21 мая 2018

Я создаю приложение Win Form, используя Entity Framework.Я последовал этому примеру.В основной форме я дважды щелкаю запись о товаре, чтобы открыть конкретный товар в отдельной форме, где я могу обновить его, используя текстовые поля и поле со списком.Все элементы управления в форме продуктов заполнены правильно.Проблема в выпадающем списке категорий, когда я пытаюсь сохранить запись.Я не могу изменить категорию Продукта, потому что поле со списком сохраняет первоначальное значение.Заранее спасибо.Крис.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.Entity;

namespace WinFormswithEFSample
{
    public partial class ProductsFrm : Form
    {
        ProductContext _context;
        int prodId;

        public ProductsFrm()
        {
            InitializeComponent();
        }

        public ProductsFrm(string id)
        {
            InitializeComponent();
            Int32.TryParse(id, out int idInt);
            prodId = idInt;
        }

        private void PopulateFields()
        {
            //select single product by ID
            var selectedProduct = _context.Products.Find(prodId);

            //select categories for combo
            var allCategories = _context.Categories.Local.ToList();

            string categID = selectedProduct.CategoryId.ToString();
            Int32.TryParse(categID, out int categIDInt);
            PopulateComboCategory(_context, categIDInt);
            this.comboCategory.SelectedValue = categIDInt;

            //Bind controls
            this.txtProductID.DataBindings.Add("Text", selectedProduct, "ProductId");
            this.txtName.DataBindings.Add("Text", selectedProduct, "Name");
            this.comboCategory.DataBindings.Add("Text", allCategories, "CategoryId",true); //,DataSourceUpdateMode.OnPropertyChanged

        }

        private void PopulateComboCategory(ProductContext _cont, int catID)
        {
            //var products = _cont.Categories.Where(p => p.CategoryId == catID).ToList();
            var categories = _cont.Categories.ToList();
            this.comboCategory.DataSource = categories;
            this.comboCategory.ValueMember = "CategoryId";
            this.comboCategory.DisplayMember = "Name";

        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            _context = new ProductContext();
            _context.Products.Load();

            this.productBindingSource.DataSource =
                _context.Products.Local.ToBindingList();

            PopulateFields();
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            base.OnClosing(e);
            this._context.Dispose();
        }

        private void cmdSave_Click(object sender, EventArgs e)
        {

            SaveProduct();
        }

        private void SaveProduct()
        {

            this.Validate();

            foreach (var product in _context.Products.Local.ToList())
            {
                if (product.Category == null)
                {
                    _context.Products.Remove(product);
                }
            }

            // Save the changes to the database.
            this._context.SaveChanges();

            // Refresh the controls to show the values         
            // that were generated by the database.
            this._context.ChangeTracker.DetectChanges();
        }

    }
}
...