這裡的文章是我個人的備份。
如果要閱讀原文,請到我的主網站:http://www.dotblogs.com.tw/mis2000lab/
本篇文章的原始出處(原文),位於:ADO.NET #9 FormView + SqlDataSource完全手寫、後置程式碼!
http://www.dotblogs.com.tw/mis2000lab/archive/2009/11/10/formview_sqldatasource.aspx
=====================================================
我的網站上有一篇文章 -- ADO.NET #3 (GridView + SqlDataSource)完全手寫、後置程式碼!
這篇文章有助於初學者,徹底瞭解 GridView背後是怎麼進行編輯、更新等等的動作。
但難度有點高..............
這篇文章是改用 FormView來作,
1). 原本我以為大同小異,但是在「改變畫面(模式)」的時候,我發現原本的作法不能運作。
以 GridView為例,只要把 Button的 CommandName設定為 Edit。一按下去就能進去編輯模式
但在 FormView我則作不到,
只好強制寫程式碼 -- FormView1.ChangeMode(FormViewMode.Edit) 來完成之。
2). 也因此,這個程式的按鈕,統統不在 FormView「內部」而在 FormView的外部。可惜啊~
3). 我只示範資料更新(Update)的部份而已,並非全部功能都寫完了。
...........................................................................................................................................................
HTML的畫面:
02 <head runat="server">
03 <title>(正確版)</title>
04 </head>
05 <body>
06 <form id="form1" runat="server">
07 <div>
08 <br />
09 100% 自己動手寫程式
10 <hr />
11 <asp:GridView ID="GridView1" runat="server" AllowPaging="True"
12 AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="id"
13 DataSourceID="SqlDataSource1" PageSize="5">
14 <Columns>
15 <asp:CommandField ButtonType="Button" ShowSelectButton="True" />
16 <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False"
17 ReadOnly="True" SortExpression="id" />
18 <asp:BoundField DataField="test_time" HeaderText="test_time"
19 SortExpression="test_time" />
20 <asp:BoundField DataField="title" HeaderText="title" SortExpression="title" />
21 </Columns>
22 </asp:GridView>
23 <asp:SqlDataSource ID="SqlDataSource1" runat="server"
24 ConnectionString="<%$ ConnectionStrings:testConnectionString %>"
25 SelectCommand="SELECT [id], [test_time], [title] FROM [test]">
26 </asp:SqlDataSource>
27 <br />
28 <br />
29
30 <hr />
31 <br />
32 <asp:FormView ID="FormView1" runat="server" >
33 <EditItemTemplate>
34 文章編號:<asp:Label ID="Label_E_id" runat="server" Text='<%# Eval("id") %>'></asp:Label>
35 <br />
36 日期:<asp:TextBox ID="TextBox_E_Test_time" runat="server" Text='<%# Bind("test_time") %>'></asp:TextBox>
37 <br />
38 分類:<asp:TextBox ID="TextBox_E_class" runat="server" Text='<%# Bind("class") %>'></asp:TextBox>
39 <br />
40 <br />
41 標題:<asp:TextBox ID="TextBox_E_title" runat="server" Width="400px" Text='<%# Bind("title") %>'></asp:TextBox>
42 <br />
43 摘要:<asp:TextBox ID="TextBox_E_summary" runat="server" Height="50px" TextMode="MultiLine"
44 Width="400px" Text='<%# Bind("summary") %>'></asp:TextBox>
45 <br />
46 內容:<asp:TextBox ID="TextBox_E_article" runat="server" Height="200px"
47 TextMode="MultiLine" Width="400px" Text='<%# Bind("article") %>'></asp:TextBox>
48 <br />
49 作者:<asp:TextBox ID="TextBox_E_author" runat="server" Text='<%# Bind("author") %>'></asp:TextBox>
50 </EditItemTemplate>
51
52 <ItemTemplate>
53 文章編號:<asp:Label ID="Label_id" runat="server" Text='<%# Eval("id") %>'></asp:Label>
54 <br />
55 日期:<asp:Label ID="Label_test_time" runat="server" Text='<%# Eval("test_time") %>'></asp:Label>
56 <br />
57 分類:<asp:Label ID="Label_class" runat="server" Text='<%# Eval("class") %>'></asp:Label>
58 <br />
59 <br />
60 標題:<asp:Label ID="Label_title" runat="server" Text='<%# Eval("title") %>'></asp:Label>
61 <br />
62 摘要:<asp:Label ID="Label_summary" runat="server" Text='<%# Eval("summary") %>'></asp:Label>
63 <br />
64 內容:<asp:Label ID="Label_article" runat="server" Text='<%# Eval("article") %>'></asp:Label>
65 <br />
66 作者:<asp:Label ID="Label_author" runat="server" Text='<%# Eval("author") %>'></asp:Label>
67
68 <br />
69 </ItemTemplate>
70 </asp:FormView>
71 <hr />
72 <br />
73
74 <!-- '*** 自己設計 Button按鈕,修改 FormView的模式 ***************** -->
75 <asp:Button ID="ButtonEdit" runat="server" Text="Edit(編輯)" />
76 <asp:Button ID="ButtonUpdate" runat="server" Text="Update(更新)" visible=false/>
77 <asp:Button ID="ButtonCancle" runat="server" Text="Cancle(取消)" visible=false/>
78 </div>
79 </form>
80 </body>
81 </html>
Code Behind 後置程式碼:
002

'----自己寫的---- 003
Imports ...System 004
Imports System.Web.Configuration 005
Imports System.Data 006
Imports System.Data.SqlClient 007 '----自己寫的----
008
009
Partial Class _Book_Ch6_Insert_FormView 010
Inherits System.Web.UI.Page 011
012
013

Sub myDBInit() myDBInit() 014
'====從資料庫連結開始,100%都用手寫程式==== 015
Dim SqlDataSource2 As SqlDataSource = New SqlDataSource 016
'== 連結資料庫的連接字串 ConnectionString == 017
SqlDataSource2.ConnectionString = WebConfigurationManager.ConnectionStrings("testConnectionString").ConnectionString 018
'== 撰寫SQL指令 == 019
If ViewState("t_id") = Nothing Then 020
ViewState("t_id") = 5 021
End If 022
'-- ViewState一旦沒有值,就會出錯! 023
SqlDataSource2.SelectCommand = "SELECT * FROM [test] where id = " & ViewState("t_id") 024
'== 執行SQL指令 .select() == 025
SqlDataSource2.DataSourceMode = SqlDataSourceMode.DataSet 026
Dim dv As DataView = SqlDataSource2.Select(New DataSourceSelectArguments) 027
028
'============================================ 029
FormView1.DataSource = dv 030
FormView1.DataBind() 031
'============================================ 032
033
SqlDataSource1.Dispose() 034
End Sub 035
036
037

Protected Sub Page_Load() Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 038
If Not Page.IsPostBack Then 039
'== 不要小看這一段 IF判別式喔!他會讓你的資料更新產生很大的變化!! 040
myDBInit() 041
End If 042
End Sub 043
044

Protected Sub GridView1_SelectedIndexChanged() Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged 045
ViewState("t_id") = GridView1.SelectedValue '-- 被選取的那一列資料「主索引鍵」 046
myDBInit() 047
End Sub 048
049
050
'==================================================================================== 051
'== 改變 FormView的畫面模式 == 052
'==================================================================================== 053

Protected Sub ButtonEdit_Click() Sub ButtonEdit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonEdit.Click 054
FormView1.ChangeMode(FormViewMode.Edit) '-- 改變成「編輯」模式 055
ButtonEdit.Visible = False 056
ButtonCancle.Visible = True 057
ButtonUpdate.Visible = True 058
myDBInit() 059
End Sub 060
061
062

Protected Sub ButtonUpdate_Click() Sub ButtonUpdate_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonUpdate.Click 063
'-- 開始更新(Update)資料,寫入資料庫。 064
Dim SqlDataSource3 As SqlDataSource = New SqlDataSource 065
066
'== 連結資料庫的連接字串 ConnectionString == 067
SqlDataSource3.ConnectionString = WebConfigurationManager.ConnectionStrings("testConnectionString").ConnectionString 068
069
'******************************************************************************* 070
'== 撰寫SQL指令(Insert Into) == 071
'== (使用參數來做,避免 SQL Injection攻擊) 072
Dim myLabel_id As Label = FormView1.FindControl("Label_E_id") 073
Dim myTextBox_Test_time As TextBox = FormView1.FindControl("TextBox_E_Test_time") 074
Dim myTextBox_class As TextBox = FormView1.FindControl("TextBox_E_class") 075
Dim myTextBox_title As TextBox = FormView1.FindControl("TextBox_E_title") 076
Dim myTextBox_summary As TextBox = FormView1.FindControl("TextBox_E_summary") 077
Dim myTextBox_article As TextBox = FormView1.FindControl("TextBox_E_article") 078
Dim myTextBox_author As TextBox = FormView1.FindControl("TextBox_E_author") 079
080
SqlDataSource3.UpdateParameters.Add("myID", myLabel_id.Text) 081
SqlDataSource3.UpdateParameters.Add("myTest_time", myTextBox_Test_time.Text) 082
'SqlDataSource3.UpdateParameters.Add("myTest_time", FormatDateTime(Now(), DateFormat.ShortDate)) '--以目前的時間為日期 083
SqlDataSource3.UpdateParameters.Add("myTitle", myTextBox_title.Text) 084
SqlDataSource3.UpdateParameters.Add("myClass", myTextBox_class.Text) 085
SqlDataSource3.UpdateParameters.Add("mySummary", myTextBox_summary.Text) 086
SqlDataSource3.UpdateParameters.Add("myArticle", myTextBox_article.Text) 087
SqlDataSource3.UpdateParameters.Add("myAuthor", myTextBox_author.Text) 088
089
SqlDataSource3.UpdateCommand = "Update test set test_time = @myTest_time, class=@myClass, title=@mytitle, summary=@mysummary, article=@myArticle, author=@myAuthor where id = @myID" 090
'==使用 @參數的時候,前後沒有加上單引號(’)。 091
'******************************************************************************* 092
093
'== 執行SQL指令 / 新增 .Insert() == 094
Dim aff_row As Integer = SqlDataSource3.Update() 095
096
If aff_row = 0 Then 097
Response.Write("資料新增失敗!") 098
Else 099
Response.Write("資料新增成功!") 100
End If 101
102
SqlDataSource3.Dispose() 103
104
'======================================== 105
'== 更新資料完成! 106
FormView1.ChangeMode(FormViewMode.ReadOnly) '-- 改變成「瀏覽(唯讀)」模式 107
108
ButtonEdit.Visible = True 109
ButtonCancle.Visible = False 110
ButtonUpdate.Visible = False 111
myDBInit() 112
113
GridView1.DataBind() 114
End Sub 115
116
117

Protected Sub ButtonCancle_Click() Sub ButtonCancle_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonCancle.Click 118
FormView1.ChangeMode(FormViewMode.ReadOnly) '-- 取消編輯模式,回到「瀏覽(唯讀)」模式 119
120
ButtonEdit.Visible = True 121
ButtonCancle.Visible = False 122
ButtonUpdate.Visible = False 123
myDBInit() 124
End Sub 125
'==================================================================================== 126
End Class
除了基本的 ADO.NET程式以外,
大概就是 FindControl()的用法,是初學者比較不清楚的,請看我幫各位寫好的範例:http://www.dotblogs.com.tw/mis2000lab/Tags/FindControl/default.aspx
===========================================================================
目前的書(ASP.NET專題實務 /文魁出版)只列出自己動手寫程式 100%控制 GridView的範例,
有讀者希望看見 ListView、FormView、DetailsView,也都可以自己動手打造。
到了這篇文章,算是把這四大天王的範例,都提供出來了。
ListView ----
FormView ----
GridView --
DetailsView --
===========================================================================
...... 寄信給我 mis2000lab (at) 雅虎.com.台灣 ................................................................................................................
ASP.NET專題實務
(文魁出版,VB版 P8187 / C#版P09027)
.............................................................................................................. 寄信給我 mis2000lab (at) 雅虎.com.台灣 ........
留言列表