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

如何将数据库返回的DataTable数据添加至已有表头的DataGridView

解决DataGridView保留自定义表头仅添加新行的问题

核心问题是直接赋值DataSource会让DataGridView自动根据DataTable结构重新生成列,覆盖你手动设置的自定义表头。按以下步骤修改即可:

1. 关闭自动列生成

先确保DataGridView不会自动生成列,保留你预设的表头:

  • 要么在设计器中找到datagridView1的AutoGenerateColumns属性,设为False
  • 要么在窗体加载事件中添加代码:
private void YourForm_Load(object sender, EventArgs e)
{
    datagridView1.AutoGenerateColumns = false;
    // 关键:把自定义列和DataTable的字段一一绑定(列名对应DataTable的字段名)
    // 示例:假设你的自定义列NameColumn对应数据库的name字段,LastNameColumn对应lastname
    datagridView1.Columns["NameColumn"].DataPropertyName = "name";
    datagridView1.Columns["LastNameColumn"].DataPropertyName = "lastname";
    // 如果有id列,同理绑定:datagridView1.Columns["IdColumn"].DataPropertyName = "id";
}

2. 修改搜索按钮的加载逻辑

方法一:用BindingSource绑定(推荐,更符合WinForms规范)

先在窗体类里声明一个BindingSource作为中间数据源:

private BindingSource _subjectBindingSource = new BindingSource();

然后在窗体加载时初始化绑定:

private void YourForm_Load(object sender, EventArgs e)
{
    datagridView1.AutoGenerateColumns = false;
    // 绑定列和字段(同上)
    datagridView1.Columns["NameColumn"].DataPropertyName = "name";
    datagridView1.Columns["LastNameColumn"].DataPropertyName = "lastname";
    
    // 把BindingSource设为DataGridView的数据源
    datagridView1.DataSource = _subjectBindingSource;
}

修改搜索按钮事件:

private void searchButton_Click(object sender, EventArgs e)
{
    Data.SubjectRepository dataRepo = new Data.SubjectRepository();
    DataTable subjectTable = dataRepo.SubjectList();

    // 若需要清空原有数据再加载新数据,调用Clear();若要追加则跳过此步
    _subjectBindingSource.Clear();
    // 将新数据表绑定到BindingSource,自动同步到DataGridView
    _subjectBindingSource.DataSource = subjectTable;
}

方法二:直接添加行到DataGridView

如果不需要数据绑定,也可以手动遍历DataTable的行添加:

private void searchButton_Click(object sender, EventArgs e)
{
    Data.SubjectRepository dataRepo = new Data.SubjectRepository();
    DataTable subjectTable = dataRepo.SubjectList();

    // 清空现有行(可选,根据需求决定)
    datagridView1.Rows.Clear();

    foreach (DataRow row in subjectTable.Rows)
    {
        // 注意:添加的内容顺序要和DataGridView的自定义列顺序完全一致
        datagridView1.Rows.Add(
            row["id"]?.ToString(), // 若SQL没查id,这里去掉或设为null
            row["name"]?.ToString(),
            row["lastname"]?.ToString()
        );
    }
}

额外注意

  • 你的SQL语句当前只查询了name和lastname,如果DataGridView有id列,需要修改SQL为select id, name, lastname from subjekti,否则id列无法获取数据
  • 原按钮代码里的datagridView1.DataSource = data;是错误的,data是Repository实例,必须调用SubjectList()获取DataTable

内容的提问来源于stack exchange,提问作者Ivan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:27:39