ADO.NET #9 FormView + SqlDataSource完全手寫、後置程式碼!

摘要: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的畫面:

01 <html xmlns="http://www.w3.org/1999/xhtml">
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 後置程式碼:

001 '----自己寫的----
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.主講   事先錄好的影片,並非上課側錄!   觀看時,有如「一對一」面對面講課