2010-09-30 22 views
5

我有一个有10行的数据表说,其中一列 随机编号1到10。 我想对它们进行排序。通常,我这样做:从c#中的数据视图排序后选择排名前N行

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

现在,我只想绑定此Dataview中的前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行?

我似乎用尽了想法! 请帮忙!

回答

4

您正在访问DataView,但后来要求Table它被绑定 - 表本身没有排序,DataView提供了表的排序“视图”。

所以尝试(警告drycode!)

DvPopBlogs.DataViewRows.Take(5) 

为了得到第5(排序顺序)DataViewRows。如果你想DataRows

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

它很可能从数据视图枚举是DataViewRows集,所以你可以只使用DvPopBlogs.Take(5)....如果你想。

+0

是啊,我发现了这一点,当我试图调试,数据视图似乎有的排序顺序,但只要我添加表,排序顺序丢了,现在我明白表是原始数据。谢谢。但是,DvPopBlogs是一个DataView,它既没有.Take()或.DataViewRows()方法! – iamserious 2010-09-30 13:33:00

+0

尝试使用dvPopBlogs.AsEnumerable()。或者在最坏的情况下dvPopBlogs.ToTable()后者将从视图的内容创建一个新的DataTable。 – 2010-09-30 14:34:26

+0

嗨,对不起,如果我使用.ToTable()方法中继器抱怨(绑定)某个列不存在。调试显示它确实存在,可能是我做错了什么,我相信你没法找到完整的代码。你建议我现在做什么?谢谢,并且很抱歉提出太多问题! – iamserious 2010-09-30 16:48:30

1

由于您已经转换为通用列表,为什么不转换数据视图而不是数据表?

IEnumerable<DataRow> sortedRows = DvPopBlogs.Cast<DataRowView>().Take(5).Select(r => r.Row); 
+0

嗨,它仍然抛出同样的错误,其中一列不存在!我试图调试它,我可以清楚地看到该列,但是,在数据绑定上它确实会抛出此错误! – iamserious 2010-10-11 08:59:47