【发布时间】:2016-01-12 04:28:21
【问题描述】:
如果我们想在DataGridView 中添加一行,除了添加一个DataGridViewRow 对象外,我们还可以通过传递一个对象数组来实现 (object[])
dgv.Rows.Add(objArray); //objArray is of type object[]
但是,如果我们想将一系列行添加到DataGridView,我们不能传递IEnumerable<object[]>,而只能传递DataGridViewRow[]
dgv.Rows.AddRange(ienumObjArray); //not allowed, ienumObjArray is of type IEnumerable<object[]>
dgv.Rows.AddRange(dgvRows); //allowed, dgvRows is DataGridViewRow[]
我的问题:有什么方法可以将 IEnumerable<object[]> 转换为 DataGridViewRow[](如果可能,使用 LINQ)以便我们可以做这样的事情
dgv.Rows.AddRange(ienumObjArray.DoSomethingWithLinq(x => doSomething));
并且不需要object[]一一添加?
foreach(object[] objArray in ienumObjArray)
dgv.Rows.Add(objArray); //adding one by one, is it possible to get rid this of?
编辑:
这是在WinForms上完成的
编辑2:
应用@abatishchev 的建议(没有AddRange),我遇到了奇怪的结果。如果我说:
ienumObjArray.Select(objArr => dgv.Rows.Add(objArr));
或
var result = ienumObjArray.Select(objArr => dgv.Rows.Add(objArr));
然后,dgv 没有添加行。
但如果我做这些,
ienumObjArray.Select(objArr => dgv.Rows.Add(objArr)).ToArray();
ienumObjArray.Select(objArr => dgv.Rows.Add(objArr)).ToList();
ienumObjArray.Select(objArr => dgv.Rows.Add(objArr)).Count();
or
var result = ienumObjArray.Select(objArr => dgv.Rows.Add(objArr))
foreach(int i in result){
//do something
}
然后它工作正常!为什么会这样?
【问题讨论】:
-
ienumObjArray.Select(objArr => dgv.Rows.Add(objArr)).ToArray()? -
@abatishchev 我试过了,但似乎我们不能这样添加
dgv.Rows......太糟糕了:(.ToArray()返回int[] -
Rows.Add() 返回添加的行数。所以返回的数组应该包含索引
-
不客气!但是我个人会坚持使用 foreach 循环。我曾经更喜欢神秘的单线,但如果它是一个严肃的应用程序,我建议使用可读性和可维护性而不是小尺寸和花哨的外观。
-
不错的选择!使用
Select调用的副作用不是一个好主意。当然,由于 LINQ 延迟执行,您会得到“奇怪的结果”,例如没有在前 2 个案例中执行。
标签: c# winforms linq datagridview rows