如何逐个将表记录加载至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
相关产品推荐
相关产品推荐

