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";