Выберите верхние N строк ПОСЛЕ сортировки из Dataview в с #

У меня есть DataTable с 10 строками, скажем, один из столбцов пронумерован от 1 до 10 случайным образом. Я хочу их отсортировать. обычно я делаю так:

DataView Dv = new DataView(dtPost, "", "views desc", DataViewRowState.Unchanged);
repeater.DataSource = Dv;
repeater.DataBind();

Теперь я просто хочу связать верхние 5 строк в этом представлении данных. Если я попробую это:

DvPopBlogs.Table.Rows.Cast<System.Data.DataRow>().Take(5);

OR

DvPopBlogs.Table.AsEnumerable().Take(5); //this usually works if sorting wasnt necessary

Это работает, но dataView полностью забывает о сортировке и просто выбирает 5 строк сверху.

Я тоже пробовал это со всеми DataViewRowStates. Как выбрать 5 верхних строк после сортировки?

Кажется, у меня закончились идеи! пожалуйста помоги!


person iamserious    schedule 30.09.2010    source источник


Ответы (2)


Вы получаете доступ к DataView, но затем запрашиваете Table, к которому он привязан - сама таблица не отсортирована, DataView обеспечивает отсортированное «представление» таблицы.

Так что попробуйте (предупреждение, сухой код!)

DvPopBlogs.DataViewRows.Take(5)

Чтобы получить первые 5 (в порядке сортировки) DataViewRows. Если вам нужен DataRows:

DvPopBlogs.DataViewRows.Take(5).Select(dvr => dvr.Row)

Вполне возможно, что перечислителем из DataView является коллекция DataViewRows, поэтому вы можете просто использовать DvPopBlogs.Take(5)...., если хотите.

person Philip Rieck    schedule 30.09.2010
comment
да, я обнаружил это, когда пытался отладить, dataview, похоже, отсортировал порядок, но как только я добавил таблицу, порядок сортировки был потерян, теперь я понимаю, что таблица - это исходные данные. благодаря. Но DvPopBlogs - это DataView, и у него нет методов .Take () или .DataViewRows ()! - person iamserious; 30.09.2010
comment
Попробуйте либо dvPopBlogs.AsEnumerable (). Take, либо, в худшем случае, dvPopBlogs.ToTable () Последний создаст новый DataTable из содержимого представления. - person Philip Rieck; 30.09.2010
comment
Привет, извините, если я использую повторитель метода .ToTable (), жалуется (при связывании), что определенный столбец не существует. Отладка показывает, что он существует, может быть, я делаю что-то не так, и я уверен, что вы не сможете это выяснить без полного кода. Что вы предлагаете мне делать сейчас? Спасибо и извините за слишком много вопросов! - person iamserious; 30.09.2010
comment
спасибо, я действительно понял, что это работает, у меня была небольшая ошибка в моем коде, и я лаял не на то дерево с пяти дней! Я идиот! - person iamserious; 12.10.2010

Поскольку вы уже выполняете преобразование в общий список, почему бы не преобразовать представление данных вместо таблицы данных?

IEnumerable<DataRow> sortedRows = DvPopBlogs.Cast<DataRowView>().Take(5).Select(r => r.Row);
person Peter    schedule 08.10.2010
comment
Привет, он все еще выдает ту же ошибку, что один из столбцов не существует! Я попытался отладить его, и я ясно вижу столбец, однако в привязке данных он выдает эту ошибку! - person iamserious; 11.10.2010