You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 05:06:00