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

如何将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

也可以在窗体的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:57:08