2010-09-30 7 views
5

Ich habe eine DataTable mit 10 Zeilen sagen einer der Spalten von 1 bis 10 zufällig nummeriert. Ich möchte sie sortieren. normalerweise mache ich das:Wählen Sie die obersten N Zeilen NACH dem Sortieren aus der Datenansicht in C#

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

Jetzt möchte ich nur die oberen 5 Zeilen in diesem Dataview binden. Wenn ich das versuchen:

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

OR 

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

Es funktioniert, aber das vergisst vollständig über dataview der Sortier- und wählt nur 5 Zeilen von oben.

Ich habe es auch mit allen DataViewRowStates versucht. Wie wählt man die oberen 5 Zeilen nach dem Sortieren aus?

Ich habe scheinbar keine Ideen mehr! bitte helfen!

Antwort

4

Sie greifen auf die DataView zu, fragen aber nach der Table, an die sie gebunden ist - die Tabelle selbst ist nicht sortiert, die DataView bietet eine sortierte "Ansicht" der Tabelle.

So versuchen (Warn drycode!)

DvPopBlogs.DataViewRows.Take(5) 

Um die ersten 5 (in Sortierreihenfolge) DataViewRows zu bekommen. Wenn Sie wollen, dass die DataRows:

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

Es ist durchaus möglich, der enumerator von Dataview die DataViewRows Sammlung ist, so Sie in der Lage sein können, nur DvPopBlogs.Take(5).... zu verwenden, wenn Sie es wünschen.

+0

ja, ich fand dies heraus, als ich zu debuggen versuchte, Dataview schien Reihenfolge sortiert zu haben, aber sobald ich hinzugefügt Tabelle wurde die Sortierreihenfolge verloren, jetzt verstehe ich, Tabelle sind die ursprünglichen Daten. Vielen Dank. Aber, DvPopBlogs ist ein DataView und es hat weder .Take() oder .DataViewRows() Methoden! – iamserious

+0

Versuchen Sie entweder dvPopBlogs.AsEnumerable(). Take, oder im schlimmsten Fall dvPopBlogs.ToTable() Letzteres erstellt eine neue DataTable aus dem Inhalt der Ansicht. –

+0

Hallo, tut mir leid, wenn ich die .ToTable() Methode Repeater beschwert (auf Bindung), dass bestimmte Spalte nicht existiert. Das Debuggen zeigt, dass es existiert, vielleicht mache ich etwas falsch und ich bin mir sicher, dass du es ohne den vollständigen Code nicht herausfinden kannst. Was schlägst du vor, dass ich jetzt mache? Danke und Entschuldigung, dass du zu viele Fragen gestellt hast! – iamserious

1

Da Sie bereits in eine generische Liste umwandeln, warum nicht die Datenansicht statt der Datentabelle werfen?

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

Hallo, es ist immer noch der gleiche Fehler, dass einer der Spalte nicht existiert! Ich habe versucht, es zu debuggen, und ich kann die Spalte klar sehen, aber auf der Datenbank wirft es diesen Fehler! – iamserious