ADO.NET #3 (GridView + SqlDataSource)完全手写、后置程序代码,兼论 SqlDataSource与UpdateParameter/DeleteParameter的用法
http://www.dotblogs.com.tw/mis2000lab/archive/2008/09/15/5377.aspx
本范例已经收录在书本里面,敬请支持。
ASP.NET案例精编(清华大学出版社 / 作者MIS2000Lab)
http://www.china-pub.com/46063
2009/5/15上市
市场价 :¥59.80 RMB(人民幣)
这篇文章超闷!
因为全部都用后置程序代码(Code Behind)来作,
所以,GridView的「分页」、「编辑」、「删除」、「更新」......通通采用后置程序代码(自己动手写)
在许多网络论坛上,会有人发问这样的问题。因为入门书比较不会讲到这些,但学到一阵子之后,就会遇上相关问题了。
一般入门书,介绍 GridView + SqlDataSource都是靠精灵,设定画面一步一步地完成。
例如:初学者可以先看看这篇文章(PDF檔)......文章下载
这个范例,请搭配我书本里面的 test数据表,可以当成 本书 10.3节 & Ch 14章的补充范例。
Ch 13/14这两章,是我书本里面的特色。
目前的ASP.NET 2.0 /3.5 /4.0的书籍,连ADO.NET都少见了(大多只讲 SqlDataSource),更别提到「手写」的ADO.NET程序。
=========================================================================================
建议:初学者勿看!
基础不好,看了会消化不良、拉肚子的。
先把基本功夫练好,下面的范例才会感到有用。
已经学会 GridView的样版(Template)、SqlDataSource之后再看下去
底下的范例,因为自己写程序,会了解 GridView的各种事件。
例如:GridView是如何完成编辑、分页、更新等等动作,下面程序代码其实是完全公开了这些过程。
===================================================================================
第一,HTML画面设计。
只有一个 GridView,并启动「编辑」、「分页」等功能。重点是设定好 DataKeys属性!
但画面上没有 SqlDataSource作资料系结。
第二,后置程序代码(Code Behind)。 VB版的范例
因为自己动手在后置程序代码里面,撰写 SqlDataSource,我上MSDN也没找到好的范例。
自己「硬Coding」,写得不好,请大家见谅。
C#版的范例 ----
[C#]ADO.NET #3 (GridView + SqlDataSource)完全手写、后置程序代码,兼论 SqlDataSource与UpdateParameter/DeleteParameter的用法 (2010-10-22 10:15)
Sub myDBInit() '==== 自己写的程序 ====
'--------------------------------------------------
'----- 手动撰写 SqlDataSource -----
'--------------------------------------------------
Dim SqlDataSource1 As SqlDataSource= New SqlDataSource
'== 1.连结数据库的连接字符串 ConnectionString ,事先已经写在 Web.Config档案里面了==
SqlDataSource1.ConnectionString= System.Web.Configuration.WebConfigurationManager.ConnectionStrings("数据库连结字符串_ConnectionString").ConnectionString
'== 2.撰写SQL指令 ==
SqlDataSource1.SelectCommand ="SELECT * FROM [test]"
'== 3.执行SQL指令 .select() ==
SqlDataSource1.DataSourceMode= SqlDataSourceMode.DataSet
Dim args As New DataSourceSelectArguments
Dim dv As Data.DataView = SqlDataSource1.Select(args)
GridView1.DataSource = dv
GridView1.DataBind()
SqlDataSource1.Dispose()
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
myDBInit()
Response.Write("第一次进入画面.....If Not Page.IsPostBackThen.....<br>")
Else
Response.Write("第<b>N</b>次进入画面.....<br>")
End If
'批注:不要小看这一段 IF判别式喔,不信的话请看这篇文章 ---- 自己动手写 GridView的编辑/更新程序,但抓不到修改后的数据?
End Sub
Protected Sub GridView1_PageIndexChanging(ByVal sender As Object, ByVale As System.Web.UI.WebControls.GridViewPageEventArgs) Handles GridView1.PageIndexChanging
GridView1.PageIndex = e.NewPageIndex
myDBInit()
Response.Write("GridView1_PageIndexChanging()....分页ing...<br>")
End Sub
Protected Sub GridView1_RowEditing(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs)Handles GridView1.RowEditing
GridView1.EditIndex = e.NewEditIndex
myDBInit()
Response.Write("GridView1_RowEditing()....进入编辑模式....<br>")
End Sub
Protected Sub GridView1_RowCancelingEdit(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCancelEditEventArgs)Handles GridView1.RowCancelingEdit
GridView1.EditIndex = -1
myDBInit()
Response.Write("GridView1_RowCancelingEdit()....离开(取消)编辑模式....<br>")
End Sub
Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVale As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating
'==这边的程序很难。要抓格子,还要自己算一下是第几格?请看本书P. 10-20页的图片与解说
Dim myTest1 As TextBox = GridView1.Rows(e.RowIndex).Cells(2).Controls(0)
Dim myTest2 As TextBox = GridView1.Rows(e.RowIndex).Cells(3).Controls(0)
Response.Write("GridView1_RowUpdating()....开始更新数据....<br>")
Dim my_test_time, my_title, my_summary, my_article As New TextBox
my_test_time = GridView1.Rows(e.RowIndex).Cells(2).Controls(0)
my_title = GridView1.Rows(e.RowIndex).Cells(3).Controls(0)
my_summary = GridView1.Rows(e.RowIndex).Cells(4).Controls(0)
my_article = GridView1.Rows(e.RowIndex).Cells(5).Controls(0)
Dim my_id As Integer = CInt(GridView1.DataKeys(e.RowIndex).Value) '====主索引键====
'==下面的程序,只是作SQL指令的更新动作而已
Dim SqlDataSource1 As SqlDataSource = New SqlDataSource
SqlDataSource1.ConnectionString= System.Web.Configuration.WebConfigurationManager.ConnectionStrings("数据库连结字符串_ConnectionString").ConnectionString
'== 设定SQL指令将会用到的参数 ==
SqlDataSource1.UpdateParameters.Add("id",my_id)
SqlDataSource1.UpdateParameters.Add("test_time",my_test_time.Text)
SqlDataSource1.UpdateParameters.Add("title",my_title.Text)
SqlDataSource1.UpdateParameters.Add("summary",my_summary.Text)
SqlDataSource1.UpdateParameters.Add("article",my_article.Text)
SqlDataSource1.UpdateCommand = "UPDATE [test] SET [test_time] = @test_time,[title] = @title, [summary] = @summary, [article] = @article WHERE [id] = @id"
SqlDataSource1.Update()
SqlDataSource1.Dispose()
'==========================================
'==== 离开编辑模式 ====
GridView1.EditIndex = -1
myDBInit()
End Sub
Protected Sub GridView1_RowDeleting(ByVal sender As Object, ByVale As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles GridView1.RowDeleting
Dim SqlDataSource1 As SqlDataSource = New SqlDataSource
'== 连结数据库的连接字符串 ConnectionString ==
SqlDataSource1.ConnectionString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings("数据库连结字符串_ConnectionString").ConnectionString
Dim my_idAs Integer = CInt(GridView1.DataKeys(e.RowIndex).Value.ToString) '====主索引键====
SqlDataSource1.DeleteParameters.Add("id", my_id) '== 设定SQL指令将会用到的参数 ==
SqlDataSource1.DeleteCommand= "Delete from [test] WHERE [id] = @id"
SqlDataSource1.Delete()
Response.Write("***删除成功! ***")
myDBInit()
End Sub
C#版的范例 ----
[C#]ADO.NET #3 (GridView + SqlDataSource)完全手写、后置程序代码,兼论 SqlDataSource与UpdateParameter/DeleteParameter的用法 (2010-10-22 10:15)
2009/10/13补充:
特别感谢网友指正。 空赃团长说:「GridView没有指定DataSourceID时,是不会执行-ed事件,只会执行-ing事件。」
关于上述的SqlDataSource作法,这篇文章写得也不错,请各位参考---- http://blog.sqlsky.com/article.asp?id=415 (C#语法)
============================================================================
考考您 (Q&A):
上面的各个事件里面,为何都要重复执行 myDBInit()?
如果不执行的话,会怎么样?
答案请看本书 10.5节,我用一整节的文章来作说明。......[2010 新书上市]ASP.NET 4.0专题实务(I) -- 入门实战篇
============================================================================
不是我藏私啦
一本书上限600页,我都写到快850页,还有好多东西塞不进去。
ASP.NET案例精编(清华大学出版社 / 作者MIS2000Lab)
http://www.china-pub.com/46063
2009/5/15上市
市场价 :¥59.80 RMB(人民幣)
这个范例,在以前 ASP.NET 1.x版,是人人都会写的范例。
因为那个时候,没有 SqlDataSource这类的数据来源控件,很多事都要自己动手写。
到了ASP.NET 2.0以后,一切都方便、自动化了。书本也不提这一部份了,书本只谈新的控件,不会回头去谈一些基础。
(因为新东西太多,新的都谈不完,哪还有空回头谈别的)
但「出来混,总是要还的」,写到(或 学到)某一种程度,就会遇上了。
所以网络论坛上,还是很常见到这些问题。
这次公开了,基础够的话,研究一下就会懂。
如果不懂,也不要急,一定是有些基础还不稳固,有些该学的还没学到。
我的书本里面,第十章也有这个范例,但采用 DataSet+ DataAdapter来作(已经出书了,这范例暂不公开)
- 2009/11/9补充 -- 读者常见的问题,很值得思考!! 自己动手写 GridView的编辑/更新程序,但抓不到修改后的数据?
- 如果您想参考 SqlDataSource的 SelectCommand与 SelectParameter的写法,请参考我的这篇文章:http://www.dotblogs.com.tw/mis2000lab/archive/2008/04/25/3505.aspx
- 如果您想参考 SqlDataSource的 InsertCommand与 InsertParameter的写法,请参考我的这篇文章:http://www.dotblogs.com.tw/mis2000lab/archive/2009/09/30/sqldatasource_insert_insertparameters_20090930.aspx
ADO.NET 共有下面文章:
- 初探ADO.NET #1,程序与数据库互动的四大步骤 (2010-10-20 08:55)
- 初探ADO.NET #2,DataReader 与 DataSet(资料集) (2010-10-20 08:58)
- ADO.NET #3 (GridView + SqlDataSource)完全手写、后置程序代码,兼论 SqlDataSource与UpdateParameter/DeleteParameter的用法 (2010-10-22 10:04)(难度很高,初学者请略过)
- ADO.NET #4,自己设定输入画面,让SqlDataSource帮我们完成「新增」一笔数据 (2010-10-22 13:55)
- ADO.NET #5,自己设定画面,让SqlDataSource帮我们捞(呈现)数据 (2010-10-22 14:08)
- [习题]ADO.NET #6, DataSet如何新增一笔数据?
- [习题]ADO.NET #7,避免相同数据 重复输入(重复新增)
- [习题]ADO.NET #8,文章(产品)的浏览次数 / 点阅数 / 点击次数,怎么作?
- ......文章 仍在增加中......
===========================================================================
新书([新书上市]ASP.NET 4.0专题实务(I) -- 入门实战篇)已经包含下列所有范例,
有读者希望看见 ListView、FormView、DetailsView,也都可以自己动手打造。
到了这篇文章,算是把这四大天王的范例,都提供出来了。
ListView ----
FormView ----
GridView --
DetailsView --
===========================================================================
....................................................................................................寄信给我 mis2000lab (at)雅虎.com.台湾 ........
ASP.NET案例精编(清华大学出版社 / 作者MIS2000Lab)
http://www.china-pub.com/46063
2009/5/15上市
市场价 :¥59.80 RMB(人民幣)