這裡是文章備份,原文請看我的網站---- http://www.dotblogs.com.tw/mis2000lab/
[習題]DataBinding?資料繫結?資料綁定? #6 -- 傷腦筋的 GridView加總、小計
http://www.dotblogs.com.tw/mis2000lab/archive/2010/10/12/databinding_6_gridview_rowdatabound.aspx
之前有兩個範例,頗為有趣:
文章一: DataBinding?資料繫結?資料綁定? #4--繫結運算式原來可以這樣用?(DataSet / DataReader)
文章二: [習題]GridView樣版內部,改用CheckBox/Radio/DropDownList(單/複選)控制項,取代TextBox
(這篇文章有三種解法,我使用第三種方法來作。)
=========================================================================================
我把這兩個範例混合起來,發現一件怪事。
本範例可以放在「下集 / ASP.NET專題實務 II -- 範例集與 4.0新功能」
的 第六章 作為補充習題!
Q:我想要用 DataBinding Expression(資料細節運算式),如同上面的文章一。
來撰寫 GridView的「加總」功能。
下圖是學生資料,我要增加一個新的「總分」欄位放在最後。
這是一個很簡單的功能,有很多方法可以完成。
您不一定要依照我的方法來作,至少有三種方法可以做出相同結果。
正確運作的結果應該類似(圖一):
但我剛好上課講解到DataBinding Expression(資料細節運算式)
所以想用類似的方法做出來。
融合上面兩篇文章的技巧,寫出來的成果竟然會是這樣?!(請看下面,圖二)
讓我大吃一驚!!!
錯誤的狀況 --
1). 使用上面「文章一」的技巧來作,後置程式碼的「公用變數」搭配HTML網頁裡面的DataBinding Expression(資料細節運算式)。
2). 再來搭配「文章二」的 GridView1_RowDataBound事件.....照理來說應該萬無一失啊!
但是.....第一列記錄一定會出現 0,
真正的第一列資料,卻出現在第二列了。
我放一個正確的藍色GridView給您比對看看.......這結果實在傷腦筋!!!
錯誤的程式(上圖二)如下:
HTML畫面:
使用這個技巧 DataBinding?資料繫結?資料綁定? #4--繫結運算式原來可以這樣用?(DataSet / DataReader)
<asp:GridView ID="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
(這篇文章有三種解法,我使用第三種方法來作。)
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加總、小計(原來如此 / 範例下載)
http://www.dotblogs.com.tw/mis2000lab/archive/2010/10/12/databinding_7_gridview_rowcreated.aspx
...... 寄信給我 mis2000lab (at) 雅虎.com.台灣 ....................................................................................................
(松崗出版,VB版 / C#版)
範例比上一本書增加 166%,內容(頁數)增加 135%
上 / 下兩集 (2010年)已經出版囉 ~ 歡迎到此參加團購
ASP.NET專題實務( II ):範例集 與 4.0新功能
.................................................................................................... 寄信給我 mis2000lab (at) 雅虎.com.台灣 ........
留言列表