[习题]DataBinding?资料系结?资料绑定? #6 -- 伤脑筋的 GridView加总、小计
http://www.dotblogs.com.tw/mis2000lab/archive/2010/10/12/databinding_6_gridview_rowdatabound.aspx
之前有两个范例,颇为有趣:
文章一: DataBinding?资料绑定? #4--绑定表达式原来可以这样用?(DataSet / DataReader) (2010-10-28 17:37)
文章二: [习题]GridView样版内部,改用CheckBox/Radio/DropDownList(单/复选)控件,取代TextBox
(这篇文章有三种解法,我使用第三种方法来作。)
=========================================================================================
我把这两个范例混合起来,发现一件怪事。
本范例可以放在「下集 / ASP.NET专题实务 II -- 范例集与 4.0新功能」
的 第六章 作为补充习题!
Q:我想要用 DataBinding Expression(数据细节表达式),如同上面的文章一。
来撰写 GridView的「加总」功能。
下图是学生数据,我要增加一个新的「总分」字段放在最后。
这是一个很简单的功能,有很多方法可以完成。
您不一定要依照我的方法来作,至少有三种方法可以做出相同结果。
正确运作的结果应该类似(图一):
但我刚好上课讲解到DataBinding Expression(资料绑定表达式)
所以想用类似的方法做出来。
融合上面两篇文章的技巧,写出来的成果竟然会是这样?!(请看下面,图二)
让我大吃一惊!!!
错误的状况 --
1). 使用上面「文章一」的技巧来作,后置程序代码的「公用变数」搭配HTML网页里面的DataBinding Expression(资料细节表达式)。
DataBinding?资料绑定? #4--绑定表达式原来可以这样用?(DataSet / DataReader) (2010-10-28 17:37)
2). 再来搭配「文章二」的 GridView1_RowDataBound事件.....照理来说应该万无一失啊!
但是.....第一列记录一定会出现 0,
真正的第一列数据,却出现在第二列了。
我放一个正确的蓝色GridView给您比对看看.......这结果实在伤脑筋!!!
错误的程序(上图)如下:
HTML画面:
使用这个技巧 DataBinding?资料系结?资料绑定? #4--系结表达式原来可以这样用?(DataSet / DataReader)
<asp:GridViewID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="id" DataSourceID="SqlDataSource1"
onrowdatabound="GridView1_RowDataBound" >
<Columns>
<asp:BoundField DataField="id" HeaderText="id" InsertVisible="False"
ReadOnly="True" SortExpression="id" />
<asp:BoundField DataField="name" HeaderText="name" SortExpression="name"/>
<asp:BoundField DataField="student_id" HeaderText="student_id"
SortExpression="student_id" />
<asp:BoundField DataField="city" HeaderText="city"
SortExpression="city" />
<asp:TemplateField HeaderText="chinese" SortExpression="chinese">
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# myNO1 %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="math" SortExpression="math">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# myNO2 %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="总分<br>(自己动手加入的字段)">
<ItemTemplate>
<font color="blue"><b>
<%# myTotal %></b></font>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:testConnectionString %>"
SelectCommand="SELECT * FROM [student_test]"></asp:SqlDataSource>
后置程序代码:
使用这个技巧,请看 [习题]GridView样版内部,改用CheckBox/Radio/DropDownList(单/复选)控件,取代TextBox
(这篇文章有三种解法,我使用第三种方法来作。)
01
02 //----自己写的(宣告)----
03 using ...System.Web.Configuration;
04 using System.Data;
05 using System.Data.SqlClient;
06 //----自己写的----
07
08
09
10 //== 重点 =================================
11 //== 必须设定为 public。否则就会视为 private而发生错误。
12 public int myNO1, myNO2, myTotal;
13 public int i = 0;
14 //=======================================
15
16
17 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
18 ...{
19 //----连结数据库----
20 SqlConnection Conn = new SqlConnection("数据库连结字符串");
21 SqlDataAdapter myAdapter= new SqlDataAdapter("select * from student_test", Conn);
22
23 DataSet ds = new DataSet();
24
25
26 myAdapter.Fill(ds, "s_test"); //---- 执行SQL指令。取出数据放进 DataSet。
27
28 //批注:执行SQL指令之后,把数据库捞出来的结果,交由画面上 DataBinding Expression来呈现。
29 //****************************************
30
33 if (e.Row.RowType == DataControlRowType.DataRow)
34 {
35 myNO1= Convert.ToInt32(ds.Tables["s_test"].Rows[i]["chinese"]);
36 myNO2= Convert.ToInt32(ds.Tables["s_test"].Rows[i]["math"]);
37
38 myTotal = myNO1 + myNO2;
39
40 i++;
41 }
42
43 }
为什么会出错呢???
.......WHY? WHY?? WHY???
請看下一篇文章的解說(提供範例下載)
DataBinding?资料绑定?#7 -- 伤脑筋的GridView加总、小计(原来如此/ 范例下载)
....................................................................................................寄信给我 mis2000lab (at)雅虎.com.台湾 ........
ASP.NET案例精编(清华大学出版社 / 作者MIS2000Lab)
http://www.china-pub.com/46063
2009/5/15上市
市场价 :¥59.80 RMB(人民幣)