如果我们要向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
}
然后它工作正常!为什么会这样?
答案 0 :(得分:3)
作为一个选项,您可以向接受AddRange
作为参数的DataGridViewRowCollection
添加IEnumerable<object[]>
扩展方法:
public static class DataGridViewExtensions
{
public static void AddRange(this DataGridViewRowCollection collection, IEnumerable<object[]> rows)
{
foreach (object[] item in rows)
{
collection.Add(item);
}
}
}
有关扩展方法的更多信息:
答案 1 :(得分:1)
在这里,我们可以使用带有DataGridViewRow
的linq创建IEnumerable<object[]>
的列表,因此我们可以使用AddRange
的{{1}},因此在调用方法之前。尝试选择一个新的DataGridViewRowCollection
看到它:
DataGridViewRow
dgv.Rows.AddRange(ienumObjArray.Select(cols => PrepareDataGridViewRow(dgv,cols)).ToArray());