基于Entity Framework Core 5实现WinForms级联ComboBox并填充DataGridView
完整实现方案
1. 实现组合框级联逻辑
首先改造供应商组合框加载方法,支持按选中的产品ID做筛选,再绑定产品组合框的选中变更事件触发联动:
// 原有产品组合框加载方法无需修改 private void LoadProductsCBO() { using (DBContext db = new()) { var products = db.Products.ToList(); cboProducts.DataSource = products; cboProducts.DisplayMember = "ProductName"; cboProducts.ValueMember = "ProductId"; } } // 改造后的供应商组合框加载方法,支持按产品ID筛选 private void LoadSuppliersCBO(int? productId = null) { using (DBContext db = new()) { var supplierQuery = db.Suppliers.AsQueryable(); if (productId.HasValue) { // 仅筛选关联了当前选中产品的供应商 supplierQuery = supplierQuery.Where(s => db.ProductSuppliers.Any(ps => ps.SupplierId == s.SupplierID && ps.ProductId == productId.Value)); } var suppliers = supplierQuery.ToList(); cboSuppliers.DataSource = suppliers; cboSuppliers.DisplayMember = "SupplierName"; cboSuppliers.ValueMember = "SupplierID"; cboSuppliers.SelectedIndex = -1; } } // 产品组合框选中变更事件,触发供应商筛选 private void cboProducts_SelectedIndexChanged(object sender, EventArgs e) { if (cboProducts.SelectedValue is int selectedPrdId) { LoadSuppliersCBO(selectedPrdId); } else { LoadSuppliersCBO(); } // 产品变更后清空原有表格数据 dgvResult.DataSource = null; } // 窗体加载事件初始化数据和事件绑定 private void MainForm_Load(object sender, EventArgs e) { LoadProductsCBO(); LoadSuppliersCBO(); cboProducts.SelectedIndexChanged += cboProducts_SelectedIndexChanged; }
2. 实现查询与DataGridView填充逻辑
按照你提供的SQL逻辑实现LINQ查询,支持传入PackageId参数,同时可叠加当前组合框的选中条件做筛选:
// 通用查询方法,传入PackageId执行查询 private void LoadQueryResult(int packageId) { using (DBContext db = new()) { var queryResult = from pps in db.Packages_Products_Suppliers join p in db.Packages on pps.PackageId equals p.PackageId join ps in db.ProductSuppliers on pps.ProductSupplierId equals ps.ProductSupplierId join pd in db.Products on ps.ProductId equals pd.ProductId join s in db.Suppliers on ps.SupplierId equals s.SupplierId where pps.PackageId == packageId // 如需叠加组合框选中筛选,保留下方两个条件,不需要直接删除即可 where (cboProducts.SelectedValue == null || ps.ProductId == (int)cboProducts.SelectedValue) where (cboSuppliers.SelectedValue == null || ps.SupplierId == (int)cboSuppliers.SelectedValue) select new { 产品 = pd.ProductName, 供应商 = s.SupplierName }; dgvResult.DataSource = queryResult.ToList(); dgvResult.AutoResizeColumns(); } } // 示例:查询按钮点击事件触发查询(可根据需求调整触发时机) private void btnQuery_Click(object sender, EventArgs e) { if (int.TryParse(txtPackageId.Text.Trim(), out int pkgId)) { LoadQueryResult(pkgId); } else { MessageBox.Show("请输入有效的PackageId数值"); } }
3. 适配注意事项
- 请核对EF Core生成的实体属性名和代码中用到的字段名是否一致,比如
SupplierID、ProductId等,大小写或命名不一致时同步修改即可 - 如果DataGridView提前预设了固定列,请将列的
DataPropertyName属性和查询结果的匿名类属性名(产品/供应商)对应,同时把AutoGenerateColumns设为false
内容的提问来源于stack exchange,提问作者krzychostal
相关产品推荐
相关产品推荐

