如何在WinForm中的DataGridViewColumnCollection中使用IQueryable类型

时间:2010-10-05 08:57:49

标签: c# winforms linq extension-methods iqueryable

我想将DataGridView的列设置为ReadOnly,除了一列或两列。

我试图这样做。

dgv.Columns.AsQueryable().ForEach(col=>col.ReadOnly=true); 

但我发现这些扩展方法在DataGridViewColumnCollection

中不可用

我怎样才能这样做

2 个答案:

答案 0 :(得分:2)

LINQ最初的想法不是修改现有的集合,而是返回新的集合,因此像ForEach这样的方法不属于默认的LINQ方法。

您可以轻松编写自己的ForEach,如:

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
    foreach (var item in source)
        action(item);
}

因此您的代码将成为:

dgv.Columns.Cast<DataGridViewColumn>.ForEach(col=>col.ReadOnly=true); 

<强>顺便说一句...
将它作为LINQ扩展编写是非常值得的,当使用2行旧的命令式学校代码时,你可以做同样的事情吗?

foreach (DataGridViewColumn col in this.dataGridView1.Columns)
    col.ReadOnly = true;

答案 1 :(得分:1)

ForEach方法既未在DataGridViewColumnCollection中实现,也未在IQueryable接口中实现。 Here是来自Eric Lippert博客的帖子。
如果您需要此功能,可以轻松实现扩展方法

public static void ForEach(this DataGridViewColumnCollection cols, Action<DataGridViewColumn> action)
    {
        foreach (DataGridViewColumn col in cols)
        {
            action(col);
        }
    }

然后使用它:

dgv.Columns.ForEach(col => col.ReadOnly = true);

但是,我认为,迭代抛出列会更容易。

foreach (var column in dgv.Columns)
   column.ReadOnly = true;