DataGridView AddRange,将IEnumerable <object []>转换为DataGridViewRow [](如果可能,使用LINQ)

时间:2016-01-12 04:28:22

标签: c# winforms linq datagridview rows

如果我们要向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
}

然后它工作正常!为什么会这样?

2 个答案:

答案 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());