WinForms DataGridView使用AddRange批量加列报错:存在无单元格模板列
DataGridView批量添加列报错:“至少一个列没有单元格模板”的解决方法
问题现象
逐个循环添加DataGridView列的代码可以正常运行:
var columNames = ... //List<string> foreach (var columnName in columNames) { var column = new DataGridViewColumn() { Name = columnName, HeaderText = columnName, CellTemplate = new DataGridViewTextBoxCell(), AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells, }; _dataGrid.Columns.Add(column); }
但使用LINQ创建所有列后通过AddRange批量添加时,会抛出错误:
var columns = columNames.Select(columnName => new DataGridViewColumn() { Name = columnName, HeaderText = columnName, CellTemplate = new DataGridViewTextBoxCell(), AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells, }).ToArray(); _dataGrid.Columns.AddRange(columns);
错误信息:
System.InvalidOperationException: '至少一个DataGridView控件的列没有单元格模板。'
原因分析
这是因为LINQ的Select结合对象初始化器创建列数组时,部分列对象的CellTemplate属性可能未被正确赋值。逐个添加时,每创建一个列就立即加入DataGridView的列集合,对象初始化器的所有属性赋值逻辑会完整执行;而批量创建时,运行时的优化可能导致CellTemplate的赋值未被正确应用到所有列实例上,触发了DataGridView的必填校验。
解决方法
方法一:改用构造函数显式传入CellTemplate
通过DataGridViewColumn的构造函数直接传入单元格模板,确保属性被正确初始化:
var columns = columNames.Select(columnName => { var cellTemplate = new DataGridViewTextBoxCell(); var column = new DataGridViewColumn(cellTemplate); column.Name = columnName; column.HeaderText = columnName; column.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; return column; }).ToArray(); _dataGrid.Columns.AddRange(columns);
方法二:先通过循环收集列再批量添加
保持和逐个添加一致的初始化逻辑,先把列收集到列表中,再转为数组调用AddRange:
var columns = new List<DataGridViewColumn>(); foreach (var columnName in columNames) { var column = new DataGridViewColumn() { Name = columnName, HeaderText = columnName, CellTemplate = new DataGridViewTextBoxCell(), AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells, }; columns.Add(column); } _dataGrid.Columns.AddRange(columns.ToArray());
内容的提问来源于stack exchange,提问作者Dee J. Doena
相关产品推荐
相关产品推荐

