上述的程序代码范例还不能够将使用者所作的修改更新回数据源,接下来我们将上述程序改成有
数据更新的能力:
<%@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:\inetpub\wwwroot\cr\ch08\myweb.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 方法将数据更新回
数据源即可。