帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统v4.6
栏 目:
 
您的位置:首页 > 技术文档 > ASP.NET编程 >
DataGrid Web 控件的进阶应用--使用Template 的数据更新
作者:佚名 发布时间:2005-04-02 来源:不详
 


    上述的程序代码范例中,对于数据编修的功能还不是很完整,无法将记录的修改状况更新回数据源。接下来我们利用EditCommandColumn、TemplateColumn 以及一些事件程序将数据更新的功能完成。

<%@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-HorizontalAlign="Center"
AutoGenerateColumns="False"
OnEditCommand="dgA_ECmd" OnUpdateCommand="dgA_UCmd"
OnCancelCommand="dgA_CCmd" >
<Property Name="Columns">
<ASP:TemplateColumn>
<Template Name="HeaderTemplate">
姓名
</Template>
<Template Name="ItemTemplate">
<ASP:Image ImageUrl="ico7.gif" Runat="Server"/>
<%#Container.DataItem("UserName")%>
</Template>
<Template Name="EditItemTemplate">
<ASP:Image ImageUrl="ico8.gif" Runat="Server"/>
<ASP:TextBox Id="txtUserName"
Text='<%#Container.DataItem("UserName")%>'
Runat="Server"/>
</Template>
</ASP:TemplateColumn>
<ASP:TemplateColumn>
<Template Name="HeaderTemplate">
电话
</Template>
<Template Name="ItemTemplate">
<ASP:Image ImageUrl="ico7.gif" Runat="Server"/>
<%#Container.DataItem("UserTel")%>
</Template>
<Template Name="EditItemTemplate">
<ASP:Image ImageUrl="ico8.gif" Runat="Server"/>
<ASP:TextBox Id="txtUserTel"
Text='<%#Container.DataItem("UserTel")%>'
Runat="Server"/>
</Template>
</ASP:TemplateColumn>
<ASP:TemplateColumn>
<Template Name="HeaderTemplate">
住址
</Template>
<Template Name="ItemTemplate">
<ASP:Image ImageUrl="ico7.gif" Runat="Server"/>
<%#Container.DataItem("UserAdd")%>
</Template>
<Template Name="EditItemTemplate">
<ASP:Image ImageUrl="ico8.gif" Runat="Server"/>
<ASP:TextBox Id="txtUserAdd"
Text='<%#Container.DataItem("UserAdd")%>'
Runat="Server"/>
</Template>
</ASP:TemplateColumn>
<ASP:EditCommandColumn
HeaderText="编辑"
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
Dim dtDataTable As DataTable
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")
dtDataTable=dsDataSet.Tables("Members")
dgA.DataSource=dtDataTable.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) '数据更
新程序
Dim shtR As Short=(dgA.CurrentPageIndex * dgA.PageSize) +
e.Item.ItemIndex
Dim txtTemp As TextBox
dscA.FillDataSet(dsDataSet,"Members") '先将DataTable 从资料
源取回
dtDataTable=dsDataSet.Tables("Members") '为了便利起见而将
dtDataTable 指向目标数据表
txtTemp=e.Item.FindControl("txtUserName") '搜寻
DataListItem 内的控件
dtDataTable.Rows(shtR)("UserName")=txtTemp.Text '将找到
的控制之Text 属性更新回
'相对应的记录中
txtTemp=e.Item.FindControl("txtUserTel")
dtDataTable.Rows(shtR)("UserTel")=txtTemp.Text
txtTemp=e.Item.FindControl("txtUserAdd")
dtDataTable.Rows(shtR)("UserAdd")=txtTemp.Text
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>


    上述范例码指定了DataGrid Web 控件的OnEditCommand、OnUpdateCommand、以及 OnCancelCommand 事件。所以使用者按下编辑选项并触发OnEditCommand 事件时,会执行 dgA_Ecmd 事件程序让该笔记录进入编辑模式;如下程序代码片段所示:

Sub dgA_ECmd(Sender As Object, e As DataGridCommandEventArgs)
dgA.EditItemIndex=e.Item.ItemIndex
BindGrid()
End Sub

    由于我们在EditItemTemplate 中指定进入编辑模式时,以TextBox 来让使用者编修数据,所以当使用者点选「编辑」选项时会依照我们所设定的样版来显示编辑模式;如下程序代码片段所示:

<Template Name= "EditItemTemplate">
<ASP:Image ImageUrl="ico8.gif" Runat="Server"/>
<ASP:TextBox Id="txtUserAdd"
Text='<%#Container.DataItem("UserAdd")%>'
Runat="Server"/>
</Template>


当使用者编辑完毕按下确定后,即执行dgA_Ucmd 这个事件程序,其程序代码片段如下所示:

Sub dgA_UCmd(Sender As Object, e As DataGridCommandEventArgs) '数据更
新程序
Dim shtR As Short=(dgA.CurrentPageIndex * dgA.PageSize) +
e.Item.ItemIndex
Dim txtTemp As TextBox
dscA.FillDataSet(dsDataSet,"Members") '先将DataTable 从资料源
取回
dtDataTable=dsDataSet.Tables("Members") '为了便利起见而将
dtDataTable 指向目标数据表
txtTemp=e.Item.FindControl("txtUserName") '搜寻DataListItem 内的
控件
dtDataTable.Rows(shtR)("UserName")=txtTemp.Text '将找到的控制之
Text 属性更新回
'相对应的记录中
'...程序代码略
dscA.Update(dsDataSet,"Members") '将所作的改变更新回数据源
dgA.EditItemIndex=-1 BindGrid()
End Sub

 ???上述程序代码片段中我们先将数据源中的Members 数据表取回,然后为了便利使用方便我们宣告了一个指向DataTable 对象的变量dtDataTable。这里有一点要特别注意, 在还没将DataGrid Web 控件中使用者所修改的资料更新回DataTable 前,不可以呼叫DataBind 方法;否则使用者所修改的数据会被原始的数据所覆盖,而造成更新回数据源的数据还是原始数据的错误,一定要小心。接下来我们利用DataListItem 的FinControl 方法将TextBox 控件的参考取回,如下程序代码片段所示:

txtTemp=e.Item.FindControl("txtUserName") '搜寻DataListItem 内的控件
dtDataTable.Rows(shtR)("UserName")=txtTemp.Text '将找到的控制之
Text 属性更新回
'相对应的记录中

    因为我们使用样版来呈现我们想要的格式,在DataListItem 中的每一个字段可能由许多复杂的控件组成;所以TextBox 不见得会是TableCell 对象中的第一个对象,故利用指定Cell 中Controls 集合的Index 值来传回控件的参考,可能需要参考很多阶层。所以我们直接以ID 属性来搜寻控件,并传环控件的参考比较方便。最后将找到的TextBox 控件之Text 属性逐一更新回对应的字段后,再呼叫DataSetCommand 的Update 方法即大功告成。

限制使用者对数据的更新
    倘若我们不允许使用者修改某个字段的数据,在没有设定Tamplate 的状况下只要指定字段的 ReadOnly 属性为True 即可;而若是有指定Template 的状况,只要不要设定该字段 EditItemTemplate 即可。下图为没有指定EditItemTemplate 的情形:
  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·强化DataGrid Web 控件的编辑接口  (2005-04-02)
 ·Data Cache(资料快取)  (2005-04-02)
 ·ASP3.0给我们带来的新技术之一--  (2005-03-12)
 ·连接到数据及创建可重用的Data C  (2005-03-12)
 ·ASP+中执行简单的Select查询,并  (2005-03-12)
 ·制作我们自己的Ebay(拍卖系统EN)  (2005-03-12)
 ·Data Shaping技术--访问分级 Rec  (2005-03-12)
 ·Data Shaping技术--Shape Append  (2005-03-12)
 ·Data Shaping技术--数据构形所需  (2005-03-12)
 ·Data Shaping技术--数据构形  (2005-03-12)

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·帝国网站管理系统采集使用教程
·帝国网站管理系统模板制作教程
·帝国CMS模板下载
·Discuz6.0.1UC版通行证发布
·帝国网站管理系统之网站迁移教程
·帝国网站管理系统实例入门教程下载
·《帝国网站管理系统》实例入门教程
   类别最新
·ASP.NET中为DataGrid添加合计字段
·.text urlRewrite介绍
·利用 ASP.NET 的内置功能抵御 Web
·ASP.NET Cache
·用 WebClient.UploadData 方法 上载
·ASP.NET 程序设计-序
·什么是客户端/伺服端(Client/Serve
·因特网应用程序的开发
·网页的种类
·.NET Framework-Microsoft Visual
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统