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

发布于 2024-09-25 19:16:13 字数 229 浏览 6 评论 0原文

我想将 DataGridView 的列设置为只读(除了一两列之外)。

我正在尝试这样做。

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

但我发现这些扩展方法在 DataGridViewColumnCollection 中不可用,

我怎样才能通过这种方式做同样的事情

I want to set DataGridView's columns to ReadOnly except one or two columns.

I was trying to do this.

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

But I found that these extension methods are not available at DataGridViewColumnCollection

How can I do the same by this way

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

染年凉城似染瑾 2024-10-02 19:16:13

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); 

BTW...
将其编写为 LINQ 扩展确实值得,因为使用 2 行旧的命令式代码就可以做同样的事情?

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

The original idea of LINQ is not to modify existing collections, but to return new ones, so methods like ForEach are not among the default LINQ methods.

You could easily write your own ForEach like:

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

and so your code would become:

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

BTW...
it is really worthwhile writing it as LINQ extension, when with 2 lines of old imperative-school code you can do the same ?

foreach (DataGridViewColumn col in this.dataGridView1.Columns)
    col.ReadOnly = true;
你げ笑在眉眼 2024-10-02 19:16:13

ForEach 方法在 DataGridViewColumnCollection 和 IQueryable 接口中均未实现。 这里是关于来自埃里克·利珀特的博客。

如果您需要此功能,您可以轻松实现扩展方法

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;

ForEach method isn't implemented neither in DataGridViewColumnCollection nor in IQueryable interface. Here is the post about it from Eric Lippert's blog.

If you need this functionality you can easily implement extension method

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

And then use it:

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

But, I think, it's much more easier just to iterate throw the columns.

foreach (var column in dgv.Columns)
   column.ReadOnly = true;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文