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
}

那么它工作得很好!为什么会这样?

DataGridView AddRange,强制转换IEnumerable<;object[]>;到DataGr

作为一个选项,您可以向接受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的列表,因此我们可以使用DataGridViewRowCollectionAddRange,因此在它调用方法之前。尝试选择一个新的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;
};