C#中如何将DataGrid行值显示到文本框?偶现失效求助
排查DataGrid行值显示到文本框时灵时不灵的问题
我来帮你拆解下这个问题,你的代码里有几个关键的点可能导致功能不稳定,咱们一个个来解决:
1. 事件触发范围太窄是核心原因
你用的是CellContentClick事件,这个事件只有点击单元格里的内容(比如文字、内嵌控件)才会触发,如果点击单元格的空白区域(比如边框、没有文字的地方),事件根本不会执行,这就会让你觉得“有时失效”——其实只是点击位置不对而已。
解决办法:把事件换成CellClick,这个事件只要点击单元格的任何区域都会触发,覆盖范围更全。
2. 空值未处理会导致代码中断
如果DataGrid里的某个单元格值是null,你直接调用.ToString()会抛出空引用异常,后续的文本框赋值代码就会中断,看起来就是“失效”了。
解决办法:取值的时候加上空值判断,用?.ToString() ?? ""来兜底,避免异常。
3. 数据操作和UI同步容易出问题
你在事件里直接移除DataTable的行再插入到顶部,然后手动选中第一行,这个过程中如果DataGrid和DataTable的绑定没有及时同步,可能会出现行索引混乱的情况,导致取错值。
优化建议:如果你的需求是把选中行移到顶部,可以通过BindingSource来操作(如果用了绑定源的话),或者操作后强制刷新DataGrid的UI,确保索引正确。
修改后的完整代码示例
// 注意:要把事件绑定换成CellClick,而不是CellContentClick private void CRUD_CellClick(object sender, DataGridViewCellEventArgs e) { // 先判断是否点击的是有效行(排除表头行) if (e.RowIndex < 0) return; // 处理空值,避免空引用异常 txtBoxID.Text = CRUD.Rows[e.RowIndex].Cells[0].Value?.ToString() ?? ""; txtBoxStates.Text = CRUD.Rows[e.RowIndex].Cells[1].Value?.ToString() ?? ""; txtBoxName.Text = CRUD.Rows[e.RowIndex].Cells[2].Value?.ToString() ?? ""; txtBoxAddress.Text = CRUD.Rows[e.RowIndex].Cells[3].Value?.ToString() ?? ""; txtBoxCenter.Text = CRUD.Rows[e.RowIndex].Cells[4].Value?.ToString() ?? ""; txtBoxCity.Text = CRUD.Rows[e.RowIndex].Cells[5].Value?.ToString() ?? ""; // 优化数据行移动逻辑,确保索引正确 DataRow Row = tblCRUD.Rows[e.RowIndex]; DataRow newRow = tblCRUD.NewRow(); newRow.ItemArray = Row.ItemArray; tblCRUD.Rows.Remove(Row); tblCRUD.Rows.InsertAt(newRow, 0); // 刷新DataGrid的UI,确保数据同步 CRUD.Refresh(); // 重新选中第一行 foreach (DataGridViewRow item in CRUD.Rows) { item.Selected = false; } if (CRUD.Rows.Count > 0) { CRUD.Rows[0].Selected = true; } }
额外测试建议
- 测试时点击单元格的不同区域(空白处、文字处),看看是否都能触发赋值
- 检查DataGrid里的单元格是否存在
null值,验证空值处理是否生效 - 如果用了
BindingSource绑定DataTable,建议直接操作BindingSource的行,而不是直接操作DataTable,这样UI同步会更可靠
内容的提问来源于stack exchange,提问作者Hariom Kumar Singh
相关产品推荐
相关产品推荐

