2010-09-30 13 views
5

Ho un DataTable con 10 righe dire una delle colonne numerate da 1 a 10 in modo casuale. Voglio ordinarli. di solito, faccio questo:Selezionare le prime righe N DOPO l'ordinamento da Dataview in C#

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

Ora, voglio solo per legare i primi 5 file di questo Dataview. Se provo questo:

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

OR 

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

Funziona, ma DataView dimentica completamente circa la selezione e seleziona solo 5 righe da top.

L'ho provato anche con tutti i DataViewRowStates. Come selezionare le prime 5 righe dopo l'ordinamento?

Mi sembra di rimanere senza idee! per favore aiuto!

risposta

4

Si sta accedendo al DataView, ma quindi si richiede il Table a cui è associato - la tabella stessa non è ordinata, lo DataView fornisce una "vista" ordinata della tabella.

in modo da provare (drycode avvertimento!)

DvPopBlogs.DataViewRows.Take(5) 

Per ottenere i primi 5 (in ordinamento) DataViewRows. Se si desidera che il DataRows:

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

E 'molto probabile l'enumeratore dal DataView è la collezione DataViewRows, in modo da essere in grado di utilizzare solo DvPopBlogs.Take(5).... se lo si desidera.

+0

sì, ho trovato questo quando stavo cercando di eseguire il debug, dataview sembrava avere ordine ordinato ma non appena ho aggiunto tabella, l'ordine è stato perso, ora capisco tabella è i dati originali. Grazie. Ma DvPopBlogs è un DataView e non ha né i metodi .Take() o .DataViewRows()! – iamserious

+0

Provare dvPopBlogs.AsEnumerable(). Take, o nel caso peggiore dvPopBlogs.ToTable() Quest'ultimo creerà un nuovo DataTable dal contenuto della vista. –

+0

Salve, scusa, se uso il ripetitore del metodo .ToTable() mi lamento (sul binding) che alcune colonne non esistono. Il debug mostra che esiste, potrebbe essere che sto facendo qualcosa di sbagliato e sono sicuro che non puoi scoprire senza il codice completo. Cosa suggerisci che io faccia ora? Grazie e scusa per aver fatto troppe domande! – iamserious

1

Poiché si sta già eseguendo il casting in un elenco generico, perché non eseguire il dataview anziché il datatable?

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

Ciao, continua a lanciare lo stesso errore, che una delle colonne non esiste! Ho provato a eseguire il debug e posso vedere chiaramente la colonna, tuttavia, sul databind viene generato questo errore! – iamserious