摘要:ADO.NET #9 FormView + SqlDataSource完全手寫、後置程式碼!
我的網站上有一篇文章 -- 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>
千萬不要為SqlDataSource "動手" 寫程式
本文的範例,我只是寫給大家看,SqlDataSource其實骨子裡面就是「ADO.NET」
寫法與流程都一樣。
您千萬不要為了「SqlDataSource精靈」寫程式。讓他來服務你,你不用服務他!你才是主人!!!!
Code Behind 後置程式碼:
002
'----自己寫的---- 003
Imports System004
Imports System.Web.Configuration005
Imports System.Data006
Imports System.Data.SqlClient 007 '----自己寫的----
008

009
Partial Class _Book_Ch6_Insert_FormView010
Inherits System.Web.UI.Page011

012

013
Sub myDBInit()014
'====從資料庫連結開始,100%都用手寫程式==== 015
Dim SqlDataSource2 As SqlDataSource = New SqlDataSource016
'== 連結資料庫的連接字串 ConnectionString == 017
SqlDataSource2.ConnectionString = WebConfigurationManager.ConnectionStrings("testConnectionString").ConnectionString018
'== 撰寫SQL指令 == 019
If ViewState("t_id") = Nothing Then020
ViewState("t_id") = 5021
End If022
'-- ViewState一旦沒有值,就會出錯! 023
SqlDataSource2.SelectCommand = "SELECT * FROM [test] where id = " & ViewState("t_id")024
'== 執行SQL指令 .select() == 025
SqlDataSource2.DataSourceMode = SqlDataSourceMode.DataSet026
Dim dv As DataView = SqlDataSource2.Select(New DataSourceSelectArguments)027

028
'============================================ 029
FormView1.DataSource = dv030
FormView1.DataBind()031
'============================================ 032

033
SqlDataSource1.Dispose()034
End Sub035

036

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

044
Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged045
ViewState("t_id") = GridView1.SelectedValue '-- 被選取的那一列資料「主索引鍵」 046
myDBInit()047
End Sub048

049

050
'==================================================================================== 051
'== 改變 FormView的畫面模式 == 052
'==================================================================================== 053
Protected Sub ButtonEdit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonEdit.Click054
FormView1.ChangeMode(FormViewMode.Edit) '-- 改變成「編輯」模式 055
ButtonEdit.Visible = False056
ButtonCancle.Visible = True057
ButtonUpdate.Visible = True058
myDBInit()059
End Sub060

061

062
Protected Sub ButtonUpdate_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonUpdate.Click063
'-- 開始更新(Update)資料,寫入資料庫。 064
Dim SqlDataSource3 As SqlDataSource = New SqlDataSource065

066
'== 連結資料庫的連接字串 ConnectionString == 067
SqlDataSource3.ConnectionString = WebConfigurationManager.ConnectionStrings("testConnectionString").ConnectionString068

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 Then097
Response.Write("資料新增失敗!")098
Else099
Response.Write("資料新增成功!")100
End If101

102
SqlDataSource3.Dispose()103

104
'======================================== 105
'== 更新資料完成! 106
FormView1.ChangeMode(FormViewMode.ReadOnly) '-- 改變成「瀏覽(唯讀)」模式 107

108
ButtonEdit.Visible = True109
ButtonCancle.Visible = False110
ButtonUpdate.Visible = False111
myDBInit()112

113
GridView1.DataBind()114
End Sub115

116

117
Protected Sub ButtonCancle_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonCancle.Click118
FormView1.ChangeMode(FormViewMode.ReadOnly) '-- 取消編輯模式,回到「瀏覽(唯讀)」模式 119

120
ButtonEdit.Visible = True121
ButtonCancle.Visible = False122
ButtonUpdate.Visible = False123
myDBInit()124
End Sub125
'==================================================================================== 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 --
===========================================================================
我將思想傳授他人, 他人之所得,亦無損於我之所有;
猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson
線上課程教學,遠距教學 (Web Form 約 51hr) https://dotblogs.com.tw/mis2000lab/2016/02/01/aspnet_online_learning_distance_education_VS2015
線上課程教學,遠距教學 (ASP.NET MVC 約 140hr) https://dotblogs.com.tw/mis2000lab/2018/08/14/ASPnet_MVC_Online_Learning_MIS2000Lab
寫信給我,不要私訊 -- mis2000lab (at) yahoo.com.tw 或 school (at) mis2000lab.net
(1) 第一天 ASP.NET MVC5 完整影片(5.5小時 / .NET 4.x版)免費試聽。影片 https://youtu.be/9spaHik87-A
(2) 第一天 ASP.NET Core MVC 完整影片(3小時 / .NET Core 6.0~8.0)免費試聽。影片 https://youtu.be/TSmwpT-Bx4I
[學員感言] mis2000lab課程評價 - ASP.NET MVC , WebForm 。 https://mis2000lab.medium.com/%E5%AD%B8%E5%93%A1%E6%84%9F%E8%A8%80-mis2000lab%E8%AA%B2%E7%A8%8B%E8%A9%95%E5%83%B9-asp-net-mvc-webform-77903ce9680b
ASP.NET遠距教學、線上課程(Web Form + MVC)。 第一天課程, "完整" 試聽。
......... facebook社團 https://www.facebook.com/mis2000lab ......................
......... YouTube (ASP.NET) 線上教學影片 https://www.youtube.com/channel/UC6IPPf6tvsNG8zX3u1LddvA/
Blog文章 "附的範例" 無法下載,請看 https://dotblogs.com.tw/mis2000lab/2016/03/14/2008_2015_mis2000lab_sample_download
請看我們的「售後服務」範圍(嚴格認定)。
......................................................................................................................................................
ASP.NET MVC => .NET Core MVC 線上教學 ...... 第一天課程 完整內容 "免費"讓您評估 / 試聽

[遠距教學、教學影片] ASP.NET (Web Form) 課程 上線了!MIS2000Lab.主講 事先錄好的影片,並非上課側錄! 觀看時,有如「一對一」面對面講課。

'----自己寫的----
Protected