Gridview排序方法-将数字按字符串排序-如何更改数据类型

本文关键字:排序 何更改 数据类型 字符串 数字 方法 Gridview | 更新日期: 2023-09-27 18:07:35

我有一个数据表,我绑定到GridView,我想能够单击列标题排序该列。我能够通过以下方法实现此功能:

 private const string ASCENDING = " ASC";
 private const string DESCENDING = " DESC";
 public SortDirection GridViewSortDirection
 {
    get
    {
        if (ViewState["sortDirection"] == null)
            ViewState["sortDirection"] = SortDirection.Ascending;
        return (SortDirection) ViewState["sortDirection"];                
    }
    set { ViewState["sortDirection"] = value; } 
}

protected void suiteReport_Sorting(object sender, GridViewSortEventArgs e)
{
    string sortExpression = e.SortExpression;
    if (GridViewSortDirection == SortDirection.Ascending)
    {
        GridViewSortDirection = SortDirection.Descending;
        SortGridView(sortExpression, DESCENDING);
    }
    else
    {
        GridViewSortDirection = SortDirection.Ascending;
        SortGridView(sortExpression, ASCENDING); 
    }   
}
private void SortGridView(string sortExpression,string direction)
{
    DataTable dt = (DataTable)Session["QueryTable"];
    DataView dv = new DataView(dt); 
    dv.Sort = sortExpression + direction;         
    suiteReport.DataSource = dv;
    suiteReport.DataBind();         
}

我的问题是,我所有的列排序,如果他们是字符串。这导致900这样的数字被认为比50000"大"。我意识到问题的事实是他们被排序为字符串,但我不确定如何改变这一点。

我动态创建我的列,这里是我创建边界域的地方。

 foreach (string s in headers)
 {
 BoundField bc = new BoundField();
 bc.HeaderText = s;
 bc.DataField = s.Replace(" ", string.Empty);
 bc.DataFormatString = "{0:C0}";
 bc.ItemStyle.Width = 125;
 if (s.StartsWith("S") || s.StartsWith("I"))
     bc.ItemStyle.HorizontalAlign = HorizontalAlign.Left;
 else
     bc.ItemStyle.HorizontalAlign = HorizontalAlign.Right;
 bc.SortExpression = s.Replace(" ", string.Empty);
 suiteReport.Columns.Add(bc);
 }

我应该如何/在哪里改变数据类型?

任何帮助,这将是非常感激!谢谢你

Gridview排序方法-将数字按字符串排序-如何更改数据类型

可以在将数据源绑定到网格视图之前对其进行排序。如何构建网格视图字段不应该有任何区别。确保来自viewstate的'dt' DataTable中的列'类型是正确的(并非所有列都是字符串类型),并使用linq:

private void SortGridView(string sortExpression, string direction)
    {
        DataTable dt = (DataTable)Session["QueryTable"];
        if (direction == ASCENDING)
        {
            suiteReport.DataSource = dt.AsEnumerable().OrderBy(x => x[sortExpression]);
        }
        else
        {
            suiteReport.DataSource = dt.AsEnumerable().OrderByDescending(x => x[sortExpression]);
        }
        suiteReport.DataBind();
    }

这里假设sortExpression与dt DataTable中的特定列名相同。

相关文章: