C# WinForms:为非绑定DataGridView通过列名添加新行时“Column Path not found”错误的解决方法
解决非绑定DataGridView通过列名添加新行的问题
这个问题我之前踩过坑!你遇到的“Column Path not found”错误,核心原因是**Clone()方法复制出来的行,它的Cells并没有和原DataGridView的列建立关联,自然找不到对应的列名**——克隆操作只会复制行的外观结构(比如列的宽度、样式),但不会把列的Name属性同步到克隆行的Cells上。
下面给你两种可行的解决方案:
方案一:直接添加新行(推荐,更简单)
对于非绑定的DataGridView,完全不需要克隆行,直接调用Rows.Add()创建新行,之后就能通过列名直接赋值:
// 直接添加一行空行 dgvPaths.Rows.Add(); // 定位到刚添加的行,通过列名设置Path列的值 int newRowIndex = dgvPaths.Rows.Count - 1; dgvPaths.Rows[newRowIndex].Cells["Path"].Value = "Path xy"; // 如果需要给按钮列设置显示文本,也可以用同样的方式 dgvPaths.Rows[newRowIndex].Cells["Remove"].Value = "删除"; dgvPaths.Rows[newRowIndex].Cells["Browse"].Value = "浏览";
这种方法的好处是:不管DataGridView有没有初始行都能正常工作,逻辑更清晰,也避免了克隆带来的关联问题。
方案二:先添加克隆行再赋值
如果你一定要用克隆行的方式,记得先把克隆的行添加到DataGridView,再通过列名赋值——当行被加入控件后,它的Cells会自动和控件的列集合建立关联,此时列名就能正常识别了:
// 确保DataGridView至少有一行才能克隆(如果是空的,这个方法会报错) if(dgvPaths.Rows.Count > 0) { DataGridViewRow row = (DataGridViewRow)dgvPaths.Rows[0].Clone(); // 先把行添加到控件,建立列关联 dgvPaths.Rows.Add(row); // 现在可以通过列名设置值了 dgvPaths.Rows[dgvPaths.Rows.Count - 1].Cells["Path"].Value = "Path xy"; }
额外注意点
如果你的DataGridView初始状态是空的(没有任何行),Rows[0].Clone()会抛出索引越界异常,这种情况下方案一绝对是最优选择。
内容的提问来源于stack exchange,提问作者tar
相关产品推荐
相关产品推荐

