DataGridView AddRange,强制转换IEnumerable<;object[]>;到DataGr
本文关键字:object gt DataGr AddRange lt 转换 IEnumerable DataGridView | 更新日期: 2023-09-27 18:30:03
如果我们想向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));
并且不需要逐个添加CCD_ 9?
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
}
那么它工作得很好!为什么会这样?
作为一个选项,您可以向接受IEnumerable<object[]>
作为参数的DataGridViewRowCollection
添加一个AddRange
扩展方法:
public static class DataGridViewExtensions
{
public static void AddRange(this DataGridViewRowCollection collection, IEnumerable<object[]> rows)
{
foreach (object[] item in rows)
{
collection.Add(item);
}
}
}
有关扩展方法的更多信息:
- 扩展方法
在这里,我们可以使用带有IEnumerable<object[]>
的linq创建DataGridViewRow
的列表,因此我们可以使用DataGridViewRowCollection
的AddRange
,因此在它调用方法之前。尝试选择一个新的DataGridViewRow
查看它:
dgv.Rows.AddRange(ienumObjArray.Select(cols => PrepareDataGridViewRow(dgv,cols)).ToArray());
private static DataGridViewRow PrepareDataGridViewRow(DataGridView dgv, object[] cols)
{
var result = new DataGridViewRow();
result.CreateCells(dgv,cols);
return result;
};