上述的程序代码范例还不能够将使用者所作的修改更新回数据源,接下来我们将上述程序改成有数据更新的能力:
<%@Import Namespace=System.Data.ADO%> <%@Import Namespace=System.Data%> <Html> <Form Runat="Server"> <ASP:DataGrid Id="dgA" AllowPaging="True" PageSize="5" OnPageIndexChanged="dgA_PageChg" Runat="Server" PagerStyle-Mode="NumericPages" BorderColor="#808080" HeaderStyle-Font-Names="Courier New" HeaderStyle-BackColor="#D1DCEB" HeaderStyle-Font-Bold="True" HeaderStyle-HorizontalAlign="Center" AutoGenerateColumns="False" OnEditCommand="dgA_ECmd" OnUpdateCommand="dgA_UCmd" OnCancelCommand="dgA_CCmd" > <Property Name="Columns"> <ASP:BoundColumn HeaderText="姓名" DataField="UserName"/> <ASP:BoundColumn HeaderText="电话" DataField="UserTel"/> <ASP:EditCommandColumn HeaderText="编辑" ButtonType="PushButton" EditText="编辑" UpdateText="更新" CancelText="放弃" /> </Property> </ASP:DataGrid> </Form> <Script Language="VB" Runat="Server"> Dim dscA As ADODataSetCommand=New ADODataSetCommand("Select * From Members", _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:InetPubwwwrootCRCh08MyWeb.Mdb") Dim dsDataSet As DataSet=New DataSet Sub Page_Load(Sender As Object, e As EventArgs) If Page.IsPostBack=False Then BindGrid() End If End Sub '将数据从数据源中取回,并和控件系结 Sub BindGrid() dscA.FillDataSet(dsDataSet,"Members") dgA.DataSource=dsDataSet.Tables("Members").DefaultView Page.DataBind() End Sub Sub dgA_PageChg(Sender As Object, e As DataGridPageChangedEventArgs) BindGrid() End Sub Sub dgA_ECmd(Sender As Object, e As DataGridCommandEventArgs) dgA.EditItemIndex=e.Item.ItemIndex BindGrid() End Sub Sub dgA_UCmd(Sender As Object, e As DataGridCommandEventArgs) BindGrid() Dim shtR As Short=(dgA.CurrentPageIndex * dgA.PageSize) + dgA.EditItemIndex Dim txtTemp As TextBox txtTemp=e.Item.Cells(0).Controls(0) '取回第一个储存格中的 TextBox '将数据填回对应的DataTable 中 dsDataSet.Tables("Members").Rows(shtR)("UserName")=txtTemp.Te xt txtTemp=e.Item.Cells(1).Controls(0) '取回第二个储存格中的 TextBox '将数据填回对应的DataTable 中 dsDataSet.Tables("Members").Rows(shtR)("UserTel")=txtTemp.Tex t '将DataTable 的数据更新回数据源 dscA.Update(dsDataSet,"Members") dgA.EditItemIndex=-1 BindGrid() End Sub Sub dgA_CCmd(Sender As Object, e As DataGridCommandEventArgs) dgA.EditItemIndex=-1 BindGrid() End Sub </SCRIPT> </Html> 由于我们要在许多程序中和数据源系结,并使用DataSetCommand 对象,所以我们将 DataSetCommand、DataSet 对象宣告在网页阶层的宣告区;并且撰写从数据源取回数据、呼叫Page.DataBind() 方法的程序BindGrid:
Sub BindGrid() dscA.FillDataSet(dsDataSet,"Members") dgA.DataSource=dsDataSet.Tables("Members").DefaultView Page.DataBind() End Sub
另外我们也完成将使用者所作的改变更新回数据源的程序dgA_Ucmd,如下程序代码片段所示:
Sub dgA_UCmd(Sender As Object, e As DataGridCommandEventArgs) BindGrid() Dim shtR As Short=(dgA.CurrentPageIndex * dgA.PageSize) + dgA.EditItemIndex Dim txtTemp As TextBox txtTemp=e.Item.Cells(0).Controls(0) '取回第一个储存格中的 TextBox '将数据填回对应的DataTable 中 dsDataSet.Tables("Members").Rows(shtR)("UserName")=txtTemp.Text txtTemp=e.Item.Cells(1).Controls(0) '取回第二个储存格中的TextBox '将数据填回对应的DataTable 中 dsDataSet.Tables("Members").Rows(shtR)("UserTel")=txtTemp.Text '将DataTable 的数据更新回数据源 dscA.Update(dsDataSet,"Members") dgA.EditItemIndex=-1 BindGrid() End Sub
由于我们将数据更新回数据源时,要指定数据在记录的绝对地址;所以我们将数据的绝对位置计算完毕后存入变量shtR 中,待数据更新时使用。接下来的程序代码将使用者所编修的内容取回,并存回DataSet 对象中,如下程序代码片段所示:
Dim txtTemp As TextBox txtTemp=e.Item.Cells(0).Controls(0) dsDataSet.Tables("Members").Rows(shtR)("UserName")=txtTemp.Text 首先我们宣告了一个指向TextBox 对象的变量txtTemp,并传回DataListItem 中第一个字段的第一个控件之参考。因为DataListItem 是以表格的方式来呈现字段所以每一个DataListItem 都有一个Cells 集合,用来管理每笔资料所要显示的所有字段,而呈现每个字段的控件被放置于 Cell 对象中;如下图所示: 所以要取得显示使用者名称的TextBox 控件之内存地址,以下列叙述即可:
txtTemp=e.Item.Cells(0).Controls(0) 而假设要取回「放弃」TextBox 的内存地址,并将其Text 属性显示出来;那么只要写成下列程序代码片段即可:
txtTemp=e.Item.Cells(2).Controls(1) Response.Write(txtTemp.Text) 我们取得TextBox 的参考后,就可以将使用者所作的修改更新回DataTable 中,如下程序代码片所示:
dsDataSet.Tables("Members").Rows(shtR)("UserName")=txtTemp.Text 将所有的字段更新完毕后,最后只要利用DataSetCommand 对象的Update 方法将数据更新回数据源即可。 |