用逗号分隔的Datacolumn名称进行DataTable排序

5

我有一个数据表,显示不同城市在不同时间段的统计信息。它具有以下列名:

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)

由于列名中有逗号,它会将其视为两个列并导致异常。例子:如果我按照城市1、州的顺序升序排序,则排序表达式将为city1,state asc,执行该语句时,它会抛出一个异常,指出城市1列不存在,而不是进行排序。谢谢。
3个回答

4

尝试以这种方式更改您的格式

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)

再次编辑 你的问题真的引起了我的好奇心,所以我搜索了DataView的Sort属性所使用的代码,并找到了一个似乎有问题的内部方法。它会在逗号处分割排序字符串,并完全忽略任何放在字符串周围的方括号。因此,似乎没有办法使用那个名称。

DataView的Sort属性代码.....

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

感谢您快速回复。它说“[city1]不是一个有效的排序字符串条目。” - Haseeb Asif
1
噢,好吧,测试过了,Sort 对于这种情况不喜欢方括号。正在寻找解决方法。 - Steve
感谢分享代码,您如何查看框架内部的代码? - Haseeb Asif

4

看起来这是.NET中的一个bug。我搜索了其他几个论坛,发现它们都遇到了同样的问题。

顺便说一下,我试过用各种组合方式将包含逗号的列名括起来,但都无效:

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

0

你可以尝试以下方法:

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

仅作为一个有趣的点,这也是在SQL Server中处理包含保留字符(如逗号和空格)的字段的方法:通过在该字段周围放置方括号。


1
感谢您的快速回复。它说“city1不是有效的排序字符串条目”。 - Haseeb Asif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接