none
gridview 排序 RRS feed

  • 问题

  • 我的gridview绑定一个datatable,datatable中有一列是int型的 排序的时候改怎么办?现在的状况是排序的时候总是以string的形式排序的,int型该怎么处理呢?
    • 已移动 肖小勇Moderator 2010年4月22日 10:28 asp.net 相关问题 (发件人:.NET Framework 一般性问题讨论区)
    2010年4月22日 8:41

答案

  • count(employeeName) 读取出来的字段应该是 int32 这是没有问题的。

    dataRow["CountAll"] = Convert.ToInt32('01'); CountAll 列的类型是与 DataColumn 的 DataType 有关,与值无关。

    如果 CountAll 是字符型,这个表达式等同于 dataRow["CountAll"] = Convert.ToInt32('01').ToString();

    我写了个示例你对比一下,如果还不能解决你的问题,请把你的 SQL 与代码发出来。

     

    <%@ Page Language="C#" AutoEventWireup="true" %>
    <%@ Import Namespace="System.Data" %>
    <script runat="server">
     protected void Page_Load(object sender, EventArgs e)
     {
      DataTable dt = new DataTable();
      dt.Columns.Add("Id", typeof(Int32));
      dt.Columns.Add("Name", typeof(string));
      
    
      dt.Rows.Add(new object[] { 0, "" });
      dt.Rows.Add(new object[] { 1, ""});
      dt.Rows.Add(new object[] { 2, "" });
      dt.Rows.Add(new object[] { 10, "" });
      dt.Rows.Add(new object[] { 1000, "" });
      dt.Rows.Add(new object[] { 500, "" });
    
      DataView dv = dt.DefaultView;
      dv.Sort = "Id desc";
      this.GridView1.DataSource = dv;
      this.GridView1.DataBind();
     }
    
    </script>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
     <title></title>
    </head>
    <body>
     <form id="form1" runat="server">
     <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" >
      <Columns>
       <asp:BoundField DataField="Id" HeaderText="Id" >
       </asp:BoundField>
       <asp:BoundField DataField="Name" HeaderText="Name" >
       </asp:BoundField>
      </Columns>
     </asp:GridView>
     </form>
    </body>
    </html>
    

     


    知识改变命运,奋斗成就人生!
    • 已标记为答案 heartg 2010年4月23日 2:54
    2010年4月23日 2:26
    版主

全部回复

  • 你在你的SQL语句里面加上ORDER BY 字段


    努力+方法=成功
    2010年4月22日 9:56
  • 你好!

    两种方式:

    1 在 SQL 中使用 ORDER BY 进行排序

    如:SELECT * FROM Table1 ORDER BY Id DESC

    2 使用 DataView 进行排序。

    如:

    DataView dv = dt.DefaultView; // dt 是 datatable

    dv.Sort = "Id desc";

    this.GridView1.DataSource = dv;

    this.GridView1.DataBind();


    知识改变命运,奋斗成就人生!
    2010年4月22日 10:30
    版主
  • 我这么修改过,可是它还是把数值按照string排序的方式给排序了

    首先我的datatable是多个datatable合并的,绑定到gridview后,想里面的其中departmentName和countAll  2列进行排序,departmentName可以正确的排序,可是int型的countAll还是按照string型排序。我一开始担心countAll这列可能类型有问题,就在合并的时候把这一列转换为int型的,Convert.toInt16(dt.Rows[i]["countAll"])。然后

     DataView dv = dt.DefaultView;
     dv.Sort = sort + " " + order;
     dt = dv.ToTable();

    GridView2.DataSource = dt;

    GridView2.DataBind();

    其中的sort=“countAll” order=“asc”,这样排序的结果还是string型的排序

    这个要怎么处理dt中的countAll这列呢?

    countAll这列是以下面的形式出现的

    0

    0

    10

    10

    11

    11

    12

    8

    9

     

    2010年4月23日 0:26
  • 你好!

    应该是你的 countAll 字段的类型是字符型。


    知识改变命运,奋斗成就人生!
    2010年4月23日 1:48
    版主
  • countAll这列是通过sql的count(employeeName)这种聚合方式统计出来的,然后我经过了类型转换Convert.toInt16(dt.Rows[i]["countAll"]),难道说这样也不行吗?

     

    2010年4月23日 1:52
  • count(employeeName) 读取出来的字段应该是 int32 这是没有问题的。

    dataRow["CountAll"] = Convert.ToInt32('01'); CountAll 列的类型是与 DataColumn 的 DataType 有关,与值无关。

    如果 CountAll 是字符型,这个表达式等同于 dataRow["CountAll"] = Convert.ToInt32('01').ToString();

    我写了个示例你对比一下,如果还不能解决你的问题,请把你的 SQL 与代码发出来。

     

    <%@ Page Language="C#" AutoEventWireup="true" %>
    <%@ Import Namespace="System.Data" %>
    <script runat="server">
     protected void Page_Load(object sender, EventArgs e)
     {
      DataTable dt = new DataTable();
      dt.Columns.Add("Id", typeof(Int32));
      dt.Columns.Add("Name", typeof(string));
      
    
      dt.Rows.Add(new object[] { 0, "" });
      dt.Rows.Add(new object[] { 1, ""});
      dt.Rows.Add(new object[] { 2, "" });
      dt.Rows.Add(new object[] { 10, "" });
      dt.Rows.Add(new object[] { 1000, "" });
      dt.Rows.Add(new object[] { 500, "" });
    
      DataView dv = dt.DefaultView;
      dv.Sort = "Id desc";
      this.GridView1.DataSource = dv;
      this.GridView1.DataBind();
     }
    
    </script>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
     <title></title>
    </head>
    <body>
     <form id="form1" runat="server">
     <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" >
      <Columns>
       <asp:BoundField DataField="Id" HeaderText="Id" >
       </asp:BoundField>
       <asp:BoundField DataField="Name" HeaderText="Name" >
       </asp:BoundField>
      </Columns>
     </asp:GridView>
     </form>
    </body>
    </html>
    

     


    知识改变命运,奋斗成就人生!
    • 已标记为答案 heartg 2010年4月23日 2:54
    2010年4月23日 2:26
    版主
  •  

    我的问题解决了

    正如您说的,countAll这列的类型就没有弄对

     

     private DataTable MergeDataTable(DataTable dt1, DataTable dt2, String KeyColName)
    {
    DataTable dtReturn = new DataTable();
    int i=0;
    int j=0;
    int k=0;
    int colKey1=0;
    int colKey2=0;

    dtReturn.TableName = dt1.TableName;
    for (i = 0; i < dt1.Columns.Count; i++)
    {
    if (dt1.Columns[i].ColumnName == KeyColName)
    {
    colKey1 = i;
    }
    dtReturn.Columns.Add(dt1.Columns[i].ColumnName);
    }
    for (j = 0; j < dt2.Columns.Count; j++)
    {
    if (dt2.Columns[j].ColumnName == KeyColName)
    {
    colKey2 = j;
    }
    else
    {
    if (dt2.Columns[j].ColumnName.ToString().Equals("countAll"))
    {
    dtReturn.Columns.Add(dt2.Columns[j].ColumnName, typeof(Int32));
    }
    else
    {
    dtReturn.Columns.Add(dt2.Columns[j].ColumnName);
    }
    }
    }
    for (i = 0; i < dt1.Rows.Count; i++)
    {
    DataRow dr;
    dr = dtReturn.NewRow();
    dtReturn.Rows.Add(dr);
    }

    for (i = 0; i < dt1.Rows.Count; i++)
    {
    int m = -1;
    for (j = 0; j < dt1.Columns.Count; j++)
    {
    dtReturn.Rows[i][j] = dt1.Rows[i][j].ToString();
    }
    for (k = 0; k < dt2.Rows.Count; k++)
    {
    if (dt1.Rows[i][colKey1].ToString() == dt2.Rows[k][colKey2].ToString())
    {
    m = k;
    }
    }
    if (m != -1)
    {
    for (int x = 0; x < dt2.Columns.Count; x++)
    {
    if (x != colKey2)
    {
    dtReturn.Rows[i][j] = dt2.Rows[m][x];
    j++;
    }
    }
    }
    }
    return dtReturn ;
    }
    我在合并2个datatable的时候判断了一下,

    if (dt2.Columns[j].ColumnName.ToString().Equals("countAll"))
             {
               dtReturn.Columns.Add(dt2.Columns[j].ColumnName, typeof(Int32));
             }

    增加countAll这列的时候直接把类型定义好了就ok了

    多谢您的指导,谢谢

    2010年4月23日 2:54