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

如何逐个将表记录加载至DataGridView?当前仅显示最后一条记录

嗨,我来帮你搞定这个问题!这种情况通常是因为你在循环加载记录时,每次都覆盖了DataGridView的数据源,或者没有正确保留之前添加的行。下面给你几种常见的解决思路和代码示例:

常见问题根源
  • 每次循环都重新设置DataGridView.DataSource为单条记录,导致之前的内容被完全覆盖
  • 手动添加行时,错误地清空了现有行集合,或者没有将新行追加到已有数据中
解决方案1:用DataTable绑定(推荐,最规范的做法)

这种方式会一次性把所有数据库记录加载到DataTable,再绑定到DataGridView,自动显示所有行,不用手动处理循环:

// 以SqlServer为例,其他数据库逻辑类似
DataTable dataTable = new DataTable();
string connectionString = "你的数据库连接字符串";
string query = "SELECT * FROM 你的表名";

using (SqlConnection conn = new SqlConnection(connectionString))
{
    SqlDataAdapter adapter = new SqlDataAdapter(query, conn);
    adapter.Fill(dataTable); // 一次性把所有记录填充到DataTable
}

// 最后绑定整个DataTable到DataGridView
dataGridView1.DataSource = dataTable;

这种方法不仅代码简洁,还能让DataGridView自动生成列(如果开启AutoGenerateColumns = true),效率也更高。

解决方案2:手动逐行添加(适合需要自定义处理每条记录的场景)

如果必须循环处理每条记录再添加,一定要确保新行是追加到现有集合里,而不是覆盖。先看错误示例,再看修正版:

错误示例(只会显示最后一行):

// 错误:每次循环都清空DataTable并重新绑定,之前的行全丢了
DataTable dt = new DataTable();
dt.Columns.Add("列1", typeof(string));
dt.Columns.Add("列2", typeof(int));

foreach (var record in 你的记录集合)
{
    DataRow row = dt.NewRow();
    row["列1"] = record.属性1;
    row["列2"] = record.属性2;
    
    dt.Rows.Clear(); // 清空之前的行,这是罪魁祸首!
    dt.Rows.Add(row);
    dataGridView1.DataSource = dt; // 循环里频繁绑定,效率低还覆盖数据
}

修正后的代码:

DataTable dt = new DataTable();
dt.Columns.Add("列1", typeof(string));
dt.Columns.Add("列2", typeof(int));

foreach (var record in 你的记录集合)
{
    DataRow row = dt.NewRow();
    row["列1"] = record.属性1;
    row["列2"] = record.属性2;
    
    dt.Rows.Add(row); // 直接追加新行,保留已有数据
}

// 循环结束后再一次性绑定,不要在循环里重复绑定
dataGridView1.DataSource = dt;

如果想直接操作DataGridView的行集合,也可以这么写:

// 先确保DataGridView有对应的列(可以手动添加或开启AutoGenerateColumns)
dataGridView1.AutoGenerateColumns = true;

foreach (var record in 你的记录集合)
{
    DataGridViewRow newRow = new DataGridViewRow();
    newRow.CreateCells(dataGridView1); // 匹配DataGridView的列结构
    
    newRow.Cells["列1"].Value = record.属性1;
    newRow.Cells["列2"].Value = record.属性2;
    
    dataGridView1.Rows.Add(newRow); // 追加到行集合,不会覆盖之前的内容
}
额外小提示
  • 不要在循环里频繁设置DataSource,这会导致DataGridView反复刷新,既慢又容易丢数据
  • 如果用ORM框架(比如Entity Framework),可以直接绑定查询结果列表:dataGridView1.DataSource = dbContext.你的表.ToList();
  • 先验证你的SQL查询确实返回了多条记录,可以在数据库客户端里执行SQL语句确认结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:25:45