2009-07-30 20 views
13

Estoy confundido en DataTable.DefaultView.Sort. Este es el segmento del código quiero utilizarlo en.DataTable.DefaultView.Sort no ordena

actionLogDT.DefaultView.Sort = "StartDate"; 

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

Las muestras que he visto, no utilice el bucle foreach y por lo tanto me es confuso sobre cómo procesar esto. No está ordenando como pensé que debería ser.

Veo que .DefaultView devuelve una vista y .Table da un error de compilación.

+0

¿Cuál es su pregunta/confusión? ¿Qué error de compilación estás obteniendo? – shahkalpesh

+1

No está ordenando. –

+2

Al ordenar en una columna de fecha, esa columna se debe definir como DateTime en DataTable. De lo contrario, puede tratarse como una cadena y ordenarse en un orden inesperado. – DOK

Respuesta

7

que tenía que tomar un enfoque ligeramente diferente. This post fue lo más cercano que pude encontrar para que mi código funcionara. Aquí está el resultado de trabajo:

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

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

A partir de ahí solo tengo que volver a poner el valor en su tipo correcto.

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

Cast es redundante ... '.ToString()' debería ser suficiente. – vapcguy

10

Ordenar la vista no cambiará el orden de clasificación de los datos en la tabla, solo el orden en la vista. Debería funcionar si hace su foreach en la vista, echando la fila de DataRowView a su fila fuertemente tipada.

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

Al hacerlo, aparece el mensaje "No se puede lanzar el objeto de tipo 'System.Data.DataRowView' para escribir 'ActionLogStartEndRow'." error. –

+0

¿'ActionLogStartEndRow' deriva de DataRow? –

+0

@Jeromy - Estoy seguro de que sí. Estoy usando la capa de datos .XSD para lograr todo esto. –

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

Sólo por curiosidad: ¿Por qué utiliza el DataRowView?

es decir

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

No entiendo su pregunta. –

+1

Porque la pregunta era sobre ordenar una tabla de datos. Para enumerar los datos ordenados, debe enumerar la vista, no la tabla en sí misma. –

1

Por favor, intente esto:

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

Lo intentaré la próxima vez que tenga este problema. –

22
actionLogDT.DefaultView.Sort = "StartDate"; 

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

¡Gracias! Justo lo que necesitaba.Obtenga una tabla, oriéntela y úsela mientras está ordenada de cierta manera. – Lukas

+0

Escenario/síntomas ligeramente diferentes para mí, pero el .toTable() resolvió esto para mí. Gracias. En mi caso, estaba aplicando la expresión DefaultView.Sort muy bien y viendo que la ordenación surta efecto para DropDownList, pero no estaba tomando efecto para un DataGrid. YMMV: El DataGrid al que lo estamos aplicando es una tabla de solo lectura muy básica que no proporciona clasificación dinámica, etc. – storsoc

0

Si necesita una tabla de datos en ese entonces se puede hacer algo como:

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

actionLogDT = dv.ToTable(); 
3

Además, puesto que Parecía que querías recorrer registros, puede simplemente recorrer los objetos dataRowView en el 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(); 
} 
Cuestiones relacionadas