Сортировка DataTable с именем столбца данных с запятой

У меня есть таблица данных, показывающая статистику разных городов за разные периоды. Он имеет следующие имена столбцов

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

Я применил некоторую логику, и она дает мне имя столбца, чтобы отсортировать имя соответствующего столбца и снова связать данные с сеткой на внешнем интерфейсе.

Теперь проблемы возникают, когда я пробовал следующий код для сортировки

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

Из-за запятой в имени столбца он обрабатывает его как два столбца и выдает исключение. Пример: если я сортирую по столбцу city1,state в порядке возрастания, тогда выражением сортировки будет city1,state asc, и при выполнении инструкции выдается исключение, которого нет в столбце city1. не существует вместо сортировки. Спасибо


person Haseeb Asif    schedule 28.02.2014    source источник


Ответы (3)


Попробуйте изменить свой формат таким образом

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

Обычный способ обработки имен столбцов, содержащих зарезервированные символы, заключается в заключении имени в квадратные скобки.

ИЗМЕНИТЬ Я не могу найти обходной путь для этого случая. (Конечно, это плохое решение иметь такие имена, но, честно говоря, я был убежден, что квадратные скобки справятся с этим)

Единственный возможный обходной путь, найденный до сих пор, состоит в том, чтобы каким-то образом изменить ваш запрос, создав псевдоним для имен ваших столбцов, а затем вы можете отсортировать этот псевдоним. Что-то вроде этого

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)

РЕДАКТИРОВАТЬ СНОВА Ваш вопрос действительно затронул мое любопытство, поэтому я просмотрел код, используемый для свойства Sort в DataView, и нашел внутренний метод, который, похоже, виноват. Он разбивает строку сортировки по запятой и полностью игнорирует любые квадратные скобки, заключенные вокруг строки. Таким образом, кажется, что нет никакого способа использовать это имя.

Код для свойства Sort 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;
}
person Steve    schedule 28.02.2014
comment
Спасибо за быстрый ответ. Он говорит, что [city1 не является допустимой записью строки сортировки. - person Haseeb Asif; 28.02.2014
comment
Что ж, проверено и эффективно Sort не любит квадратные скобки для этого случая. Ищем обходной путь - person Steve; 28.02.2014
comment
Спасибо, что поделились кодом. Как вы можете взглянуть на внутренний код фреймворка? - person Haseeb Asif; 28.02.2014

Так что это похоже на «ошибку» в ASP.NET. Я искал несколько других форумов, и все столкнулись с той же проблемой. К вашему сведению, я попытался заключить имя столбца, содержащее запятую, в различных комбинациях. Ни один из них не работал:

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

Итак, лучший способ сделать эту работу таков:

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

Вы можете попробовать:

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

Для интереса, это также то, как вы справитесь с этим в SQL Server: поместите квадратные скобки вокруг поля, которое содержит зарезервированные символы, такие как запятые и пробелы.

person Ann L.    schedule 28.02.2014
comment
Спасибо за быстрый ответ. Он говорит, что [city1 не является допустимой записью строки сортировки. - person Haseeb Asif; 28.02.2014