我想将DataGridView的列设置为ReadOnly,除了一列或两列。
我试图这样做。
dgv.Columns.AsQueryable().ForEach(col=>col.ReadOnly=true);
但我发现这些扩展方法在DataGridViewColumnCollection
中不可用我怎样才能这样做
答案 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;