Как использовать типы IQueryable в DataGridViewColumnCollection в WinForm - PullRequest
0 голосов
/ 05 октября 2010

Я хочу установить для столбцов DataGridView значение ReadOnly, кроме одного или двух столбцов.

Я пытался это сделать.

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

Но я обнаружил, что эти методы расширения недоступны в DataGridViewColumnCollection

Как я могу сделать то же самое таким образом

Ответы [ 2 ]

2 голосов
/ 05 октября 2010

Первоначальная идея 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;
1 голос
/ 05 октября 2010

Метод 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;
...