Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LINQ (Language-Integrated Query) > Запрос из DataGridView


Автор: Stratus 1.8.2011, 23:44
Нужно из DataGridView вытянуть массив строк

Пытаюсь создать запрос таким образом:

Код

var QueryAllSelectedNames = 
         from Names in dataGridView_SelectedNames.Rows
         select Names;


Не получается какая то нестыковка типов происходит..

Что можно придумать?

Автор: Kolovorot 3.8.2011, 01:30
Так попробуй:
var QueryAllSelectedNames = 
         from Names in dataGridView_SelectedNames.Rows
         select Name;
 smile 

Автор: Stratus 3.8.2011, 16:20
Что то я разницы не вижу.... в чем разница?
Говорю в данном виде не получается не стыкуются типы Names и dataGridView_SelectedNames.Rows.
Что предпринять не знаю...

Автор: WarHog 3.8.2011, 17:11
Цитата

Код

var QueryAllSelectedNames = 
         from Names in dataGridView_SelectedNames.Rows
         select Name


и получить ошибку при компиляции. Откуда Name возьмется?

Stratus, проблема в том, что Rows имеют тип DataGridViewRowCollection, который не реализует дженерик интерфейсов. А linq-методы, интересующие тебя, реализованы как экстеншены к IEnumerable<T>, например

Автор: Stratus 3.8.2011, 18:12
ОК спасибо.
А что можно сделать?
В IEnumerable конвернтнуть не получается, с AsQueryable() нестыковки....

Автор: WarHog 3.8.2011, 18:40
попробуй прокастить т.о.
Код

dataGridView_SelectedNames.Rows.Cast<DataGridViewRow>()

Автор: Stratus 4.8.2011, 12:51
Не работает - не допустим в этом контексте.
Проблема видимо в том, что DataGrid  не IEnumerable...
Как его с конвертировать в этот тип или реализовать этот интерфейс я не знаю.
Неужели медицина бессильна?!

Автор: WarHog 4.8.2011, 15:59
Stratus, каст нужно применять не к гриду, который, естественно, никаких IEnumerable не имплементит. Применяй к проперти Rows у грида
Код

DataGridViewRowCollection Rows { get; }

class DataGridViewRowCollection : IList, ICollection, IEnumerable

static IEnumerable<TResult> Cast<TResult>(this IEnumerable source)


Автор: Stratus 11.8.2011, 00:57
WarHog, что то я не соображу как вытянуть значения ячеек из грида?
Делаю так:
Код

            var QSelectedNames = (
                from DG in dataGridView_SelectedNames.Rows.Cast<DataGridViewRow>()
                select DG.Cells);

            foreach (DataGridViewCellCollection str in QSelectedTickers)
                Console.WriteLine(str);


Мне на выходе желательно массив значений ячеек бы получить....

Автор: WarHog 11.8.2011, 09:47
из-за того, что проперти Cells у строки типа DataGridViewCellCollection, которое аналогично DataGridViewRowCollection не релизует дженерик интерфейсов, нужен еще один Cast:
Код

var bar = dataGridView1.Rows.Cast<DataGridViewRow>()
    .SelectMany(r => r.Cells.Cast<DataGridViewCell>(), (r, c) => c)
    .Select(c => c.Value);

На выходе - значения всех ячеек. Если нужны, например, значения ячеек определенного столбца, то можно сделать фильтрацию
Код

var bar = dataGridView1.Rows.Cast<DataGridViewRow>()
    .SelectMany(r => r.Cells.Cast<DataGridViewCell>(), (r, c) => c)
    .Where(c => c.ColumnIndex == 1)
    .Select(c => c.Value);

Автор: Stratus 15.8.2011, 23:28
WarHog спасибо сам бы недопер.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)