如何将Dataset数据映射至WinForm自定义列的DataGridView单元格?
解决WinForms DataGridView绑定存储过程数据的问题
嗨,针对你的需求,我整理了两种常用的实现方式——直接绑定是最简洁高效的首选方案,手动赋值则适合需要自定义处理数据的场景:
方式一:直接绑定数据源(推荐)
这种方式会自动把存储过程返回的字段对应到DataGridView的列上,核心是要把列的DataPropertyName和存储过程返回的字段名一一对应好。
步骤1:配置DataGridView列的DataPropertyName
你可以通过设计器快速设置:
- 选中DataGridView,打开【编辑列】对话框
- 给每个自定义列设置
DataPropertyName:- Item Code →
inv_item_code - Description →
inv_item_desc - Quantity →
inv_item_qty - Rate →
inv_item_rate - Item Total →
item_total
- Item Code →
也可以在窗体的Load事件里用代码设置(假设你的DataGridView名为dataGridView1):
dataGridView1.Columns["Item Code"].DataPropertyName = "inv_item_code"; dataGridView1.Columns["Description"].DataPropertyName = "inv_item_desc"; dataGridView1.Columns["Quantity"].DataPropertyName = "inv_item_qty"; dataGridView1.Columns["Rate"].DataPropertyName = "inv_item_rate"; dataGridView1.Columns["Item Total"].DataPropertyName = "item_total";
步骤2:调用存储过程并绑定数据
使用ADO.NET执行存储过程,填充DataTable后直接绑定到DataGridView:
using System.Data; using System.Data.SqlClient; // 替换为你的数据库连接字符串 string connectionString = "Your Database Connection String"; int invoiceNumber = 123; // 替换为实际要查询的inv_no参数值 using (SqlConnection conn = new SqlConnection(connectionString)) { using (SqlCommand cmd = new SqlCommand("get_an_invoice_details", conn)) { cmd.CommandType = CommandType.StoredProcedure; // 添加存储过程参数 cmd.Parameters.AddWithValue("@inv_no", invoiceNumber); SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); adapter.Fill(dt); // 绑定数据到DataGridView,自动匹配列 dataGridView1.DataSource = dt; } }
这样数据会自动填充到对应的列中,无需手动操作单元格,效率很高。
方式二:手动遍历数据填充单元格(适合自定义处理)
如果需要在填充前对数据做额外处理(比如格式化数值、修改内容),可以手动遍历查询结果,逐个赋值到DataGridView的单元格:
using System.Data; using System.Data.SqlClient; string connectionString = "Your Database Connection String"; int invoiceNumber = 123; using (SqlConnection conn = new SqlConnection(connectionString)) { using (SqlCommand cmd = new SqlCommand("get_an_invoice_details", conn)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@inv_no", invoiceNumber); conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); dataGridView1.Rows.Clear(); // 先清空现有行 while (reader.Read()) { // 创建新行并逐个单元格赋值 int rowIndex = dataGridView1.Rows.Add(); dataGridView1.Rows[rowIndex].Cells["Item Code"].Value = reader["inv_item_code"]; dataGridView1.Rows[rowIndex].Cells["Description"].Value = reader["inv_item_desc"]; dataGridView1.Rows[rowIndex].Cells["Quantity"].Value = reader["inv_item_qty"]; dataGridView1.Rows[rowIndex].Cells["Rate"].Value = reader["inv_item_rate"]; dataGridView1.Rows[rowIndex].Cells["Item Total"].Value = reader["item_total"]; } reader.Close(); } }
注意事项
- 确保数据库连接字符串正确,且应用程序拥有数据库访问权限
- 使用直接绑定时,要把DataGridView的
AutoGenerateColumns属性设为false,避免自动生成重复列 - 始终用
using语句管理数据库连接、命令等资源,确保资源被正确释放,避免内存泄漏
内容的提问来源于stack exchange,提问作者Sijo George Oommen
相关产品推荐
相关产品推荐

