如何将查询到的商品从数据库加载到DataGridView,现有代码仅能校验商品是否存在
功能实现方案
现有逻辑问题排查
- 首先确认你的存储过程
POSSearchProduct逻辑:如果当前存储过程仅返回商品是否存在的标识,你需要修改存储过程,当输入的商品编码匹配到数据时,返回该商品的全部需要展示的字段(如商品编码、名称、规格、单价等) - 冗余调用
adapter.SelectCommand.ExecuteNonQuery(),MySqlDataAdapter.Fill已经自动执行查询并填充DataTable,这行属于无效代码 - 现有逻辑仅实现了搜索结果绑定到查询列表控件,缺少「选中搜索结果的商品后加载到目标DataGridView」的核心逻辑
第一步:修正查询代码
using (MySqlConnection conn = new MySqlConnection(constring)) { conn.Open(); MySqlDataAdapter adapter = new MySqlDataAdapter("POSSearchProduct",conn); adapter.SelectCommand.CommandType = CommandType.StoredProcedure; // 增加Trim处理避免前后空格导致匹配失败 adapter.SelectCommand.Parameters.AddWithValue("_SearchProduct", txtSearch.Text.Trim()); DataTable dtbl = new DataTable(); adapter.Fill(dtbl); // 绑定到搜索结果展示DataGridView tblProducts.DataSource = dtbl; // 隐藏不需要展示的列 tblProducts.Columns[0].Visible = false; tblProducts.Columns[5].Visible = false; tblProducts.Columns[6].Visible = false; tblProducts.Columns[7].Visible = false; // using语句会自动释放连接,无需手动Close }
第二步:实现选中商品加载到目标DataGridView逻辑
假设你用来承载选中商品的目标DataGridView控件名为dgvSelectedProducts,需要先为它提前配置好列结构(和你需要展示的商品字段对应,比如商品编码、名称、规格、单价、数量、小计),以下是双击搜索结果行添加选中商品的实现:
// 给搜索结果控件tblProducts注册CellDoubleClick事件 private void tblProducts_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { // 过滤表头点击 if(e.RowIndex < 0) return; DataRowView selectedProduct = tblProducts.Rows[e.RowIndex].DataBoundItem as DataRowView; if(selectedProduct == null) return; // 可选:添加去重逻辑,避免重复添加同一商品 foreach (DataGridViewRow row in dgvSelectedProducts.Rows) { if (row.Cells["ProductCode"].Value?.ToString() == selectedProduct["你的商品编码数据库字段名"].ToString()) { // 重复商品直接累加数量,可根据业务需求调整 int currentQty = Convert.ToInt32(row.Cells["Quantity"].Value); row.Cells["Quantity"].Value = currentQty + 1; // 同步更新小计 row.Cells["SubTotal"].Value = currentQty * Convert.ToDecimal(row.Cells["Price"].Value); return; } } // 新增行到选中商品列表,注意替换为你实际的数据库字段名 decimal price = Convert.ToDecimal(selectedProduct["你的单价字段名"]); dgvSelectedProducts.Rows.Add( selectedProduct["你的商品编码字段名"], selectedProduct["你的商品名字段名"], selectedProduct["你的规格字段名"], price, 1, // 默认数量为1,可自定义 price // 初始小计为单价*1 ); }
可选优化点
- 给搜索框绑定回车事件,触发查询无需点击按钮
- 新增复选框列支持批量选中多个搜索结果,一次性添加到选中列表
- 给选中商品列表增加修改数量、删除单个商品、清空全部的操作按钮
内容的提问来源于stack exchange,提问作者Rameljay Cuña
相关产品推荐
相关产品推荐

