从Cassandra数据库填充DataGridView时仅显示一行的问题排查
代码核心问题定位
- 循环判断条件书写错误:原代码中循环判断写为
for (int i = 0; 2 < 3; i++),判断条件2 < 3恒为真,既没有绑定实际需要遍历的行范围,属于逻辑完全失效的死循环写法,大概率是编写时手滑将判断条件里的变量i误写为字面量2。 - 单元格赋值逻辑错位:内层循环中,对同一位置的单元格连续执行4次赋值操作,依次写入staff_id、username、password、name四个字段,每次赋值都会覆盖上一次的内容,最终每个单元格只会留存name字段的值,无法实现不同列对应不同字段的展示效果。
- 行索引与数据库记录脱钩:foreach遍历数据库返回结果时,循环内的i值从未随遍历进度动态更新,所有从数据库读取到的记录,都会被反复赋值到固定索引的行位置,没有为后续读取到的记录创建对应的DataGridView行承载,最终界面只会留存最后一次覆盖写入的单行内容。
修正后的实现代码
public void show_db() { var cluster = Cluster.Builder().AddContactPoint("127.0.0.1").Build(); var session = cluster.Connect("hotel"); RowSet rs = session.Execute("SELECT * FROM hotel.staff"); // 清空原有行,避免重复加载出现冗余内容 staff_info.Rows.Clear(); foreach (var res in rs) { // 每读取一条数据库记录,新增一行DataGridView行 int newRowIndex = staff_info.Rows.Add(); // 按列索引匹配对应字段赋值 staff_info.Rows[newRowIndex].Cells[0].Value = res.GetValue<string>("staff_id"); staff_info.Rows[newRowIndex].Cells[1].Value = res.GetValue<string>("username"); staff_info.Rows[newRowIndex].Cells[2].Value = res.GetValue<string>("password"); staff_info.Rows[newRowIndex].Cells[3].Value = res.GetValue<string>("name"); } }
关键改动说明
- 移除无意义的双层硬嵌套循环,避免固定索引反复覆盖的问题
- 建立数据库记录与DataGridView行的一一对应关系,每读取一条查询结果就创建对应行
- 按列的实际顺序匹配对应字段赋值,避免同一单元格被多字段反复覆盖
- 增加行清空逻辑,避免多次调用方法时出现重复加载的冗余数据
内容的提问来源于stack exchange,提问作者leywww
相关产品推荐
相关产品推荐

