DataGridView.Rows.Add在for循环中执行效果不同的原因是什么?
问题分析与解决
核心差异:调用的Add重载完全不同
你两段代码看似类似,但实际调用了DataGridViewRowCollection.Add的不同重载,导致行为天差地别:
第一段代码:
d.Rows.Add(new DataGridViewCellCollection(c[0].Value.ToString(), c[1].Value.ToString(), c[2].Value.ToString()))这里传入的是一个
DataGridViewCellCollection对象,调用的是**Add(DataGridViewCellCollection cells)重载——作用是新增一行,将这个集合里的三个单元格依次填入该行的对应列**,最终添加1行3列的数据。第二段代码:
for(int i = 0; i < 3; i++) d.Rows.Add(c[i].Value.ToString());每次循环传入单个字符串,调用的是**
Add(object value)重载——这个重载的作用是新增一行,并将传入的值填入该行的第一列**,循环三次会添加3行,每行仅第一列有数据,这就是效果不一致的根本原因。
修正后的循环写法
如果想用循环实现和第一段代码相同的效果,需要先收集所有值,再一次性调用对应重载:
var cellValues = new List<object>(); for(int i = 0; i < 3; i++) { cellValues.Add(c[i].Value.ToString()); } d.Rows.Add(cellValues.ToArray());
或者用更简洁的写法(和第一段代码效果完全一致):
d.Rows.Add(new object[] { c[0].Value.ToString(), c[1].Value.ToString(), c[2].Value.ToString() });
内容的提问来源于stack exchange,提问作者J. Mini
相关产品推荐
相关产品推荐

