我有一存贮过程,在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列
请问这是怎么回事?
由于需要行列转换,所以最终返回多少列,哪些列,就不知道了
在查询分析器里面执行该存贮过程,发现列顺序按照我的要求,正常的
但绑定到页面中的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列
请问这是怎么回事?
给你写了个例子: <%@ 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>
<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>
首先将遍历datatable.columns,获取caption,根据你的需要保存下caption,创建BoundField再GridView1.Columns.Add(boundfield);根据需求调整顺序.
得到sql端返回的table后,获取列名,
我的列名是时段,半小时为一个时段,比如:
00:00-00:30
00:30-01:00
01:00-01:30
....
23:30-00:00将期载入一个数组,然后进行排序
最后,根据数组的字段顺序,逐个动态设置GridView的模板列,然后直接绑定到GridView不知这样可否
{
//由于返回的数据列顺序经绑定后,会出现混乱
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)打印()等这个项目完成后,我会写篇文章,总结一下,谢谢大家的关注
only_endure 的回复里面
http://topic.csdn.net/u/20070704/21/14ebd5f4-190e-4ef8-9029-ec9e3eb53b5e.html我觉得最好的方式,采用客户端js的方式来做列移动,同时,将用户的设置存入cookie,提供记忆功能和友好性再次谢谢大家的回复,谢谢!
在以前的多个项目中,也涉及到行列转换,但从来没有出现这个问题,以前的项目是vs2003+sqlserver2000其实,很多时候,不是技术能力不够,而是在遇到问题的时候,能不能立马想到最好的解决方法,在这里我提供一个连接,里面讲到了这个问题
http://www.cnblogs.com/justinw/archive/2008/01/23/1049402.html
其实,在不同的应用上下文里面,可能有不同的解决方案,但最合适的就是最好的
yuxuanji 可能没有看清我的要求,或者我没有表达清楚仅仅客户展示,自然用js来处理,但是我提到了,我还需要用dataset来做别的处理,比如文件输出
如果仅仅客户端显示正确了,但导出到excel后,列顺序也还是乱的
也许,说到这里,大家又会说,直接用gridview输出啊,
但我还需要输出excel文件,同时在excel文件里面,自动插入图表所以,还是那句老话,context不一样,解决方案不一样