在C#中从Dataview中排序后选择前N行

5

我有一个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行?

我似乎没有更好的主意!请帮忙!

2个回答

4
您正在访问DataView,但随后要求访问其绑定的Table - 表本身未排序,而提供了表的排序“视图”。
因此,请尝试以下代码(注意:这是草稿!)
DvPopBlogs.DataViewRows.Take(5)

要获取前5个(按排序顺序)DataViewRows。如果您想要DataRows

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

很有可能DataView中的枚举器是DataViewRows集合,所以如果你愿意,你可以直接使用DvPopBlogs.Take(5)....


是的,我在尝试调试时发现了这一点,DataView似乎有排序顺序,但是一旦我添加了Table,排序顺序就丢失了,现在我明白Table是原始数据。谢谢。但是,DvPopBlogs是一个DataView,它既没有.Take()方法也没有.DataViewRows()方法! - iamserious
尝试使用dvPopBlogs.AsEnumerable().Take或者在最坏的情况下使用dvPopBlogs.ToTable()。后者将从视图内容创建一个新的DataTable。 - Philip Rieck
抱歉,如果我使用.ToTable()方法,重复器会在绑定时抱怨某些列不存在。调试显示它确实存在,可能是我做错了什么,我确定你没有完整的代码也无法找出问题所在。你建议我现在该怎么办?谢谢,并为问了太多问题而道歉! - iamserious
谢谢,我实际上已经弄清楚这个问题了,我的代码有一个小错误,我在错误的地方花了五天时间!我真是个傻瓜! - iamserious

1

既然您已经将其转换为通用列表,为什么不将数据视图转换而不是数据表呢?

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

你好,它仍然抛出相同的错误,即其中一列不存在!我已经尝试过调试它,我可以清楚地看到该列,但在数据绑定时确实会抛出此错误! - iamserious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接