摘要: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 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()
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(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(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(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(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(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 --
===========================================================================
我將思想傳授他人, 他人之所得,亦無損於我之所有;
猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----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.主講 事先錄好的影片,並非上課側錄! 觀看時,有如「一對一」面對面講課。