2009-07-30 10 views
13

Sono confuso su DataTable.DefaultView.Sort. Qui è il segmento del codice che voglio utilizzare in.DataTable.DefaultView.Sort non Ordina

actionLogDT.DefaultView.Sort = "StartDate"; 

foreach (CustomerService.ActionLogStartEndRow logRow in actionLogDT) 
{ 
    // code here 
} 

I campioni che ho visto non utilizzare il ciclo foreach, e quindi mi è confusa su come elaborare questo. Non sta smistando come pensavo dovesse essere.

Vedo che. DefaultView restituisce una vista e .Table restituisce un errore di compilazione.

+0

qual è la tua domanda/confusione? quale errore di compilazione stai ottenendo? – shahkalpesh

+1

Non sta smistando. –

+2

Quando si ordina in una colonna di date, quella colonna deve essere definita come DateTime nel DataTable. Altrimenti può essere trattato come una stringa e ordinato in un ordine inatteso. – DOK

risposta

7

ho dovuto prendere un approccio leggermente diverso. This post era il più vicino che potessi trovare per far funzionare il mio codice. Ecco il risultato di lavoro:

actionLogDT.DefaultView.Sort = "StartDate"; 
DataView dv = actionLogDT.DefaultView; 

foreach (DataRowView logRow in dv) { . . . } 

Da lì devo solo restituire il valore nel suo tipo corretto.

(string)logRow["Status"].ToString() 
+0

Il cast è ridondante ... '.ToString()' dovrebbe essere sufficiente. – vapcguy

10

L'ordinamento della vista non modifica l'ordinamento dei dati nella tabella, ma solo l'ordine nella vista. Dovrebbe funzionare se si fa il tuo foreach sulla vista, invece, il cast della riga da DataRowView torna alla tua riga fortemente digitato.

foreach (DataRowView logRowView in actionLogDT.DefaultView) 
{ 
    CustomerService.ActionLogStartEndRow logRow = logRowView.Row as CustomerService.ActionLogStartEndRow; 
    // code here 
} 
+0

In questo modo, "Impossibile eseguire il cast di oggetto" System.Data.DataRowView "per digitare" ActionLogStartEndRow "." errore. –

+0

'ActionLogStartEndRow' deriva da DataRow? –

+0

@Jeromy - Sono sicuro che lo faccia. Sto usando il livello dati .XSD per realizzare tutto questo. –

3
foreach (var logRow in actionLogDT.DefaultView.ToDataTable()) { ... } 
0

Solo curioso: Perché si utilizza il DataRowView?

cioè

foreach (DataRow row in actionLogDT.Rows) 
{ 
    Console.WriteLine(row["Status"]); 
} 
+1

Non capisco la tua domanda. –

+1

Perché la domanda riguardava l'ordinamento di un datatable. Per enumerare i dati ordinati è necessario enumerare la vista, non la tabella stessa. –

1

Si prega di provare questo:

actionLogDT.DefaultView.Sort = "["+actionLogDT.Columns[0].ColumnName+"] asc"; 
+0

Ci proverò la prossima volta che ho questo problema. –

22
actionLogDT.DefaultView.Sort = "StartDate"; 

actionLogDT = actionLogDT.DefaultView.ToTable(); 
+1

Grazie! Proprio quello di cui avevo bisogno.Prendi un tavolo, ordinalo e usalo mentre è ordinato in un certo modo. – Lukas

+0

Scenario/sintomi leggermente diverso per me, ma il .toTable() ha risolto questo problema per me. Grazie. Nel mio caso, mi stava applicando l'espressione DefaultView.Sort bene e di vedere il genere abbia effetto per DropDownList, ma non stava prendendo vigore per un DataGrid. YMMV: Il DataGrid stiamo applicando questo è una tabella di sola lettura molto di base che non prevede l'ordinamento dinamica, etc. – storsoc

0

Se avete bisogno di un DataTable allora si può fare qualcosa di simile:

var dv = actionLogDT.DefaultView; 
dv.Sort = "StartDate"; 

actionLogDT = dv.ToTable(); 
3

Inoltre, dal momento che sembrava come se volessi andare in loop record, è possibile scorrere gli oggetti dataRowView nello DefaultView.

foreach (DataRowView drv in table.DefaultView) 
{ 
    string strValue = drv["ColumnName"].ToString(); 
    // its also worth mentioning that a DataRowView has a Row 
    strValue = drv.Row["ColumnName"].ToString(); 
}