c# sorting datatable dataview

c# - Clasificación de DataTable con Datacolumn Name con coma



sorting dataview (3)

Tengo una tabla de datos que muestra estadísticas de diferentes ciudades para diferentes períodos. Tiene los siguientes nombres de columnas

Period | city1,state | city2,state | city3,state Jan 15 25 20 Feb 5 26 29 Mar 35 27 21

He aplicado un poco de lógica y me da nombre de columna para ordenar el nombre de columna respectivo y vincular los datos nuevamente con la cuadrícula en el front-end.

Ahora vienen los problemas cuando probé el siguiente código para ordenar

griData.DefaultView.Sort = string.Format("{0} {1}", orderByField, sortDirection)

Debido a la coma en el nombre de la columna, la trata como dos columnas y da una excepción. Ejemplo: Si estoy ordenando por columna city1, estado en orden ascendente, entonces la expresión de clasificación será city1, state asc y al ejecutar la declaración arroja una excepción que la columna city1 no existe en lugar de ordenar. Gracias


Intenta cambiar tu formato de esta manera

griData.DefaultView.Sort = string.Format("[{0}] {1}", orderByField, sortDirection)

La forma habitual de tratar nombres de columna que contiene caracteres reservados es incluir el nombre entre corchetes.

EDITAR No puedo encontrar una solución para este caso. (Por supuesto, es una mala decisión tener este tipo de nombres, pero sinceramente, estaba convencido de que los corchetes podrían manejar eso)

La única solución posible, hasta ahora, es cambiar, de alguna manera, su consulta, crear un alias para los nombres de sus columnas y luego puede ordenar estos alias. Algo como esto

SELECT Period, [city1,state] AS City1State, [city2,state] AS City2State, [city3,state] AS City3State FROM yourTable .... orderByField = "City1State" sortDirection = "DESC" griData.DefaultView.Sort = string.Format("{0} {1}", orderByField, sortDirection)

EDIT OTRA VEZ Su pregunta realmente ha afectado mi curiosidad, así que he buscado el código utilizado para la propiedad Sort de un DataView y he llegado a un método interno que parece ser el culpable. Divide la secuencia de ordenación en la coma e ignora por completo los corchetes puestos alrededor de la cadena. Entonces, parece que no hay forma de usar ese nombre.

Código para la propiedad Sort de DataView .....

internal unsafe IndexField[] ParseSortString(string sortString) { string str; int num; int num2; string[] strArray; IndexField[] fieldArray; DataColumn column; bool flag; char[] chArray; fieldArray = zeroIndexField; if (sortString == null) { goto Label_011A; } if (0 >= sortString.Length) { goto Label_011A; } // Here the split on the comma char (0x2C) ignoring the fact that // the whole sort expression is inside square brackets???? strArray = sortString.Split(new char[] { 0x2c }); fieldArray = new IndexField[(int) strArray.Length]; num2 = 0; goto Label_0111; Label_0041: str = strArray[num2].Trim(); num = str.Length; flag = 0; if (num < 5) { goto Label_007D; } if (string.Compare(str, num - 4, " ASC", 0, 4, 5) != null) { goto Label_007D; } str = str.Substring(0, num - 4).Trim(); goto Label_00A7; Label_007D: if (num < 6) { goto Label_00A7; } if (string.Compare(str, num - 5, " DESC", 0, 5, 5) != null) { goto Label_00A7; } flag = 1; str = str.Substring(0, num - 5).Trim(); Label_00A7: if (str.StartsWith("[", 4) == null) { goto Label_00DE; } if (str.EndsWith("]", 4) == null) { goto Label_00D5; } str = str.Substring(1, str.Length - 2); goto Label_00DE; Label_00D5: throw ExceptionBuilder.InvalidSortString(strArray[num2]); Label_00DE: column = this.Columns[str]; if (column != null) { goto Label_00F7; } throw ExceptionBuilder.ColumnOutOfRange(str); Label_00F7: *(&(fieldArray[num2])) = new IndexField(column, flag); num2 += 1; Label_0111: if (num2 < ((int) strArray.Length)) { goto Label_0041; } Label_011A: return fieldArray; }


Tu podrías intentar:

griData.DefaultView.Sort = string.Format("[{0}] {1}", orderByField, sortDirection)

Solo como un punto de interés, esta es también la forma de manejarlo en SQL Server: poniendo corchetes alrededor de un campo que contenía caracteres reservados, como comas y espacios en blanco.


Así que esto parece ser una especie de "error" en ASP.NET. He buscado en otros foros y todos han experimentado el mismo problema. FYI, traté de adjuntar el nombre de la columna que contiene la coma con varias combinaciones. Ninguno de estos funcionó:

[column,name] DESC [''column,name''] DESC ["column,name"] DESC [column,,name] DESC

Entonces, el mejor método para hacer que esto funcione es este:

table.Columns["column,name"].ColumnName = "Temporary"; table.DefaultView.Sort = "Temporary DESC"; table = table.DefaultView.ToTable(); table.Columns["Temporary"].ColumnName = "column,name";