2015-01-15 2 views
1

EDIT: Теперь я понимаю, что мой код ниже не имеет большого смысла, но оставляю его как есть, чтобы сохранить вопрос. Мой ответ ниже показывает мой окончательный, правильный код того, чего я пытался достичь.Выбор отсутствует на TableCellCollection

Я пытаюсь изменить некоторые ячейки в ряд на GridView в обработчике события OnRowDataBound с Select вызова:

e.Row.Cells.AsParallel().Select(c => c.Font.Bold = true); 

Но я получаю следующее сообщение об ошибке:

'System.Linq.ParallelQuery' does not contain a definition for 'Select'and no 
extension method 'Select' accepting a first argument of type 
'System.Linq.ParallelQuery' could be found (are you missing a using 
directive or an assembly reference?) 

У меня есть директива using для Linq (using System.Linq;), и если у меня есть другой объект IEnumerable, то метод Select находится на нем без ошибок:

IEnumerable<string> test; 
test.Select(s => s); 

(очевидно, приведенный выше тестовый код будет сгенерировано исключение, но дело в том, что он компилирует правильно)

Почему я не могу назвать Select на TableCellCollection?

ответ

1

Потому что TableCellCollection не реализует общий интерфейс IEnumerable<T>. Он реализует IEnumerable, который не является общим. Поскольку вы используете AsParallel на IEnumerable, он использует this overload, который возвращает IEnumerable. Вот почему вы не можете использовать Select. Если вы хотите получить Перечислимый из ячеек таблицы вы можете бросить их:

e.Row.Cells.Cast<TableCell>().AsParallel() 

Это будет использовать overload для IEnumerable<T> и возвращает ParallelQuery<TSource>, который реализует IEnumerable<T>. И вы сможете использовать Select или другие методы LINQ для результата.

+0

Спасибо, звонок «Cast» был именно тем, что мне нужно. Я также подчеркиваю, что мой код не имеет большого смысла. Для краткости я также отправил ответ на этот вопрос, показывая свое окончательное решение. – PseudoPsyche

0

Я правильно оцениваю ответ Selman22, так как он решил мою актуальную проблему, независимо от моего проблемного кода. Я просто хотел также предоставить свое окончательное решение для краткости.

Как уже упоминалось Selman22, мне нужно было позвонить Cast<TableCell>(), прежде чем получить доступ к методам LINQ.

Кроме того, моя оригинальная строка кода не имеет большого смысла, поскольку я явно не уделял много внимания тому, что делаю. Вот мой рабочий код:

e.Row.Cells.Cast<TableCell>().Where(c => c.Font.Bold == true).ToList().ForEach(c => c.ForeColor = Color.Red); 
Смежные вопросы