Я создаю приложение 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();
}
}
}