我有一存贮过程,在sqlserver端,经过行列转换后,返回一个数据集 
由于需要行列转换,所以最终返回多少列,哪些列,就不知道了
在查询分析器里面执行该存贮过程,发现列顺序按照我的要求,正常的 
但绑定到页面中的GridView后,发现列的顺序,完全都乱了 
GridView设置如下: 
<asp:GridView   ID="GridView1"   runat="server"   CssClass="statTable"   AutoGenerateColumns="true"   EnableViewState="false"> 
                <AlternatingRowStyle   CssClass="title2"   /> 
</asp:GridView> 
绑定语句: 
GridView1.DataSource   =   ds.Tables[0].DefaultView; 
GridView1.DataBind(); 
再次说明,由于sql端需要行列转换,所以最终返回多少列,哪些列,就不知道了,这样,导致无法事先固定设置GridView列
请问这是怎么回事?

解决方案 »

  1.   

    给你个动态改变列的例子.
    给你写了个例子: <%@   Page   Language= "VB "   %> 
    <%@   Import   Namespace= "System.Data "   %> <script   runat= "server "> 
            Private   ReadOnly   Property   Datas()   As   DataTable 
                    Get 
                            Dim   Ret   As   New   DataTable 
                            Ret.Columns.Add(New   DataColumn( "Column   1 ",   GetType(String))) 
                            Ret.Columns.Add(New   DataColumn( "Column   2 ",   GetType(String))) 
                            Ret.Columns.Add(New   DataColumn( "Column   3 ",   GetType(String))) 
                            Dim   DR   As   DataRow   =   Ret.NewRow 
                            DR(0)   =   "adfa " 
                            DR(1)   =   1 
                            DR(2)   =   "上 " 
                            Ret.Rows.Add(DR) 
                            DR   =   Ret.NewRow 
                            DR(0)   =   "1111 " 
                            DR(1)   =   2 
                            DR(2)   =   "中 " 
                            Ret.Rows.Add(DR) 
                            Return   Ret 
                    End   Get 
            End   Property         Protected   Sub   Page_Load(ByVal   sender   As   Object,   ByVal   e   As   System.EventArgs)   Handles   Me.Load 
                    If   Not   Me.IsPostBack   Then   BindGridView1() 
            End   Sub 
            
            Private   Sub   BindGridView1() 
                    Me.GridView1.DataSource   =   Datas 
                    Me.GridView1.DataBind() 
            End   Sub         Protected   Sub   Button1_Click(ByVal   sender   As   Object,   ByVal   e   As   System.EventArgs)   Handles   Button1.Click 
                    Dim   n   As   Integer   =   Integer.Parse(Me.TextBox1.Text)   -   1 
                    Dim   Cf   As   DataControlField   =   Me.GridView1.Columns(n) 
                    Me.GridView1.Columns.RemoveAt(n) 
                    Me.GridView1.Columns.Insert(0,   Cf) 
                    BindGridView1() 
            End   Sub 
    </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   runat= "server "> 
            <title> 无标题页 </title> 
    </head> 
    <body> 
            <form   id= "form1 "   runat= "server "> 
                    <asp:GridView   ID= "GridView1 "   runat= "server "   AutoGenerateColumns= "False "> 
                            <Columns> 
                                    <asp:BoundField   DataField= "Column   1 "   HeaderText= "黄大仙 "   /> 
                                    <asp:BoundField   DataField= "Column   2 "   HeaderText= "林妹妹 "   /> 
                                    <asp:BoundField   DataField= "Column   3 "   HeaderText= "西门庆 "   /> 
                            </Columns> 
                    </asp:GridView> 
                    &nbsp; 
                    <br   /> 
                    输入列号: <asp:TextBox   ID= "TextBox1 "   runat= "server "   Width= "40px "> </asp:TextBox> 
                    <asp:Button   ID= "Button1 "   runat= "server "   Text= "将此列提前 "   /> 
                    <asp:Button   ID= "Button2 "   runat= "server "   Text= "什么也不做,测试液面控件状态 "   /> 
            </form> 
    </body> 
    </html> 
      

  2.   

    应用动态添加数据绑定列
    首先将遍历datatable.columns,获取caption,根据你的需要保存下caption,创建BoundField再GridView1.Columns.Add(boundfield);根据需求调整顺序.
      

  3.   

    http://topic.csdn.net/u/20070704/21/14ebd5f4-190e-4ef8-9029-ec9e3eb53b5e.html
      

  4.   

    现在看来,只能这样了
    得到sql端返回的table后,获取列名,
    我的列名是时段,半小时为一个时段,比如:
    00:00-00:30
    00:30-01:00
    01:00-01:30
    ....
    23:30-00:00将期载入一个数组,然后进行排序
    最后,根据数组的字段顺序,逐个动态设置GridView的模板列,然后直接绑定到GridView不知这样可否
      

  5.   

    谢谢大家的回复,我已经实现功能private DataSet FormatDataTable(DataSet ds)
        {
            //由于返回的数据列顺序经绑定后,会出现混乱
            if(ds == null && ds.Tables.Count < 1 && ds.Tables[0].Rows.Count < 1)
                return null;
            DataTable db = ds.Tables[0];
            if (db.Columns.Count < 5)
                return ds;
            int i = 0;        
            string firstColumnName = db.Columns[0].ColumnName.Trim();
            for (i = 0; i < db.Columns.Count; i++)
            {
                if (Axis == 3 && i == 0)
                    continue;
                arrCols.Add(db.Columns[i].ColumnName.Trim());
            }
            arrCols.Sort();
            if (Axis == 3)
                arrCols.Insert(0, firstColumnName);        DataTable db2 = new DataTable();
            string columnName = "";
            for (i = 0; i < arrCols.Count; i++)
            {
                columnName = arrCols[i].ToString();
                db2.Columns.Add(new DataColumn(columnName));
            }
            foreach (DataRow dr in db.Rows)
            {
                DataRow dr2 = db2.NewRow();
                for (i = 0; i < arrCols.Count; i++)
                { 
                    columnName = arrCols[i].ToString();
                    dr2[columnName] = dr[columnName];
                }
                db2.Rows.Add(dr2);
            }
            ds.Tables.Clear();        
            ds.Tables.Add(db2);
            return ds;        
        }对于代码的一点说明,
    arrcols是我定义的一个Arrlist
    由于我还需要用dataset用来输出excel或csv,所以最终返回dataset
    由于我经过反复测试,发现列数达到10列以后,有可能出现列顺序混乱的情况,所以代码里面,做了列数限制(保险起见,5列)
    由于,我还需要在页面上,输出图表,所以,其中的Axis是外部传进来的维数,表示,这个图表是三维的,还是二维的,因为有些二维数据,也是多行数据,所以不能简单的认为多行了,就是三维的
    同时,说明的是,我这个项目,二维数据,采用了OWC来输出图片,三维数据采用Excel来输出图片
    由于列数很多,所以,根据配置,可以设定多少列需要拆分为另一个表格展示,同时,对于三维的数据,还需要考虑,表格拆分后,第一列还需要在第二个表格里面展现。
    所以,这些代码,都被封装到了一个自定义控件里面,当需要调用的时候,只需要传递存贮过程名、和相关参数,就可以提供
    1)文件输出
    2)图片输出
    3)打印()等这个项目完成后,我会写篇文章,总结一下,谢谢大家的关注
      

  6.   

    再罗嗦一句
    only_endure 的回复里面
    http://topic.csdn.net/u/20070704/21/14ebd5f4-190e-4ef8-9029-ec9e3eb53b5e.html我觉得最好的方式,采用客户端js的方式来做列移动,同时,将用户的设置存入cookie,提供记忆功能和友好性再次谢谢大家的回复,谢谢!
      

  7.   

    其实实现功能很简单,我就是很奇怪,怎么会遇到这个问题
    在以前的多个项目中,也涉及到行列转换,但从来没有出现这个问题,以前的项目是vs2003+sqlserver2000其实,很多时候,不是技术能力不够,而是在遇到问题的时候,能不能立马想到最好的解决方法,在这里我提供一个连接,里面讲到了这个问题
    http://www.cnblogs.com/justinw/archive/2008/01/23/1049402.html
    其实,在不同的应用上下文里面,可能有不同的解决方案,但最合适的就是最好的
      

  8.   

    THX.  :-)
      

  9.   

    再次说明一下,不同的应用上下文,要求不一样
    yuxuanji 可能没有看清我的要求,或者我没有表达清楚仅仅客户展示,自然用js来处理,但是我提到了,我还需要用dataset来做别的处理,比如文件输出
    如果仅仅客户端显示正确了,但导出到excel后,列顺序也还是乱的
    也许,说到这里,大家又会说,直接用gridview输出啊,
    但我还需要输出excel文件,同时在excel文件里面,自动插入图表所以,还是那句老话,context不一样,解决方案不一样
      

  10.   

    ths again  :-D  受益菲浅