DataGrid Web 控件的进阶应用--使用Template 的数据更新

发表于:2007-07-14来源:作者:点击数: 标签:
上述的程序代码范例中,对于数据编修的功能还不是很完整,无法将记录的修改状况更新回数据源。接下来我们利用EditCommandColumn、TemplateColumn 以及一些事件程序将数据更新的功能完成。 %@Import Namespace=System.Data.ADO% %@Import Namespace=System.Da


    上述的程序代码范例中,对于数据编修的功能还不是很完整,无法将记录的修改状况更新回数据源。接下来我们利用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:\InetPub\wwwroot\CR\Ch08\MyWeb.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。这里有一点要特别注意, 在还没将DataGridWeb 控件中使用者所修改的资料更新回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 的情形:

原文转自:http://www.ltesting.net