下列两个范例都是将DataList Web 控件加入编辑数据的功能,第一个范例只用OnItemCommand 事件,第二个范例综合OnEditCommand、OnCancelCommand,以及OnUpdateCommand 事件。使用者在选择一个项目展开SelectedItemTemplate 样版显示详细资料后,若选择「编辑」选项时会显示EditItemTemplate 样版,EditItemTemplate 样版是以TextBox来显示使用者资料,并且可以接受使用者的修改。修改完成后可以按「确定」执行将数据更新回数据源的动作,「放弃」可以回到显示使用者详细数据的选项:
范例一只使用OnItemCommand 事件
<%@Import Namespace=System.Data.ADO%> <%@Import Namespace=System.Data%> <Html> <Form runat="Server"> <ASP:DataList Id="dlA" OnItemCommand="dlA_ICMD" GridLines="both" Runat="Server"> <Template Name="ItemTemplate"> <ASP:Image ImageUrl="ico1.gif" Runat="Server"/> 姓名: <%#Container.DataItem("UserName")%> <ASP:LinkButton Id="lbShow" Text=">" Runat="Server"/> </Template> <Template Name="EditItemTemplate"> <ASP:Image ImageUrl="ico1.gif" Runat="Server"/> 姓名: <%#Container.DataItem("UserName")%><br> 电话:<ASP:TextBox Id="T1" Text='<%#Container.DataItem("UserTel")%>' Runat="Server"/><br> 住址:<ASP:TextBox Id="T2" Text='<%#Container.DataItem("UserAdd")%>' Runat="Server"/><br> 电邮:<ASP:TextBox Id="T3" Text='<%#Container.DataItem("UserEMail")%>' Runat="Server"/><br> <ASP:LinkButton Id="lbCancel" Text="[放弃]" Runat="Server"/> <ASP:LinkButton Id="lbSubmit" Text="[确定]" Runat="Server"/><br> </Template> <Template Name="SelectedItemTemplate"> <ASP:Image ImageUrl="ico1.gif" Runat="Server"/> 姓名: <%#Container.DataItem("UserName")%> <ASP:LinkButton Id="lbClose" Text="<" Runat="Server"/><br> 电话: <%#Container.DataItem("UserTel")%><br> 住址: <%#Container.DataItem("UserAdd")%><br> 电邮: <%#Container.DataItem("UserEmail")%><br> <ASP:LinkButton Id="lbEdit" Text="[编辑]" Runat="Server"/><br> </Template> </ASP:DataList> </Form> <Script Language="VB" Runat="Server"> Dim dscA As ADODataSetCommand=New ADODataSetCommand("Select * From Members", _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:InetPubwwwrootCRCh05MyWeb.Mdb") Dim dsDataSet As DataSet=New DataSet Dim dtDataTable As DataTable Sub Page_Load(Sender As Object, e As EventArgs) dscA.FillDataSet(dsDataSet,"Members") dtDataTable=dsDataSet.Tables("Members") dlA.DataSource=dtDataTable.DefaultView If Not Page.IsPostBack Then Page.DataBind() End Sub Sub dlA_ICMD(Sender As Object, e As DataListCommandEventArgs) If e.CommandSource.Id="lbShow" Then dlA.SelectedIndex=e.Item.ItemIndex ElseIf e.CommandSource.Id="lbClose" Then dlA.SelectedIndex=-1 ElseIf e.CommandSource.Id="lbEdit" Then dlA.EditItemIndex=e.Item.ItemIndex ElseIf e.CommandSource.Id="lbCancel" Then dlA.EditItemIndex=-1 ElseIf e.CommandSource.Id="lbSubmit" Then Dim txtTemp As TextBox txtTemp=e.Item.FindControl("T1") '取回ListItem 中名为T1 的控件参 考 dtDataTable.Rows(dlA.EditItemIndex)("UserTel")=txtTemp.Text txtTemp=e.Item.FindControl("T2") '取回ListItem 中名为T2 的控件参 考 dtDataTable.Rows(dlA.EditItemIndex)("UserAdd")=txtTemp.Text txtTemp=e.Item.FindControl("T3") '取回ListItem 中名为T3 的控件参 考 dtDataTable.Rows(dlA.EditItemIndex)("UserEmail")=txtTemp.Text dscA.Update(dsDataSet,"Members") dlA.EditItemIndex=-1 End If dlA.DataBind() End Sub </SCRIPT> </Html>
由于我们要在许多程序中使用DataTable、DataSet 以及DataSetCommand 对象,所我们将这些对象变量宣告在网页阶层的宣告区。程序开始执行时,先以ItemTemplate 样版来显示资料。待任意项目被选择后,便以SelectedItemTemplate 样版来显示该项目,如下图所示:
选择「编辑」选项后,便以EditItemTemplate 样版来显示所要编辑的记录;使用者可以在TextBox中编修数据,如下图所示:
待使用者将数据编辑完毕点选「确定」按钮时,我们就在dlA_ICMD 事件程序中将使用者所作的修改更新回数据源;如下程序代码片段所示:
ElseIf e.CommandSource.Id="lbSubmit" Then Dim txtTemp As TextBox txtTemp=e.Item.FindControl("T1") '取回ListItem 中名为T1 的控件参 考 dtDataTable.Rows(dlA.EditItemIndex)("UserTel")=txtTemp.Text txtTemp=e.Item.FindControl("T2") '取回ListItem 中名为T2 的控件参 考 dtDataTable.Rows(dlA.EditItemIndex)("UserAdd")=txtTemp.Text txtTemp=e.Item.FindControl("T3") '取回ListItem 中名为T3 的控件参 考 Then dtDataTable.Rows(dlA.EditItemIndex)("UserEmail")=txtTemp.Text dscA.Update(dsDataSet,"Members") dlA.EditItemIndex=-1 End If
上述程序代码片段宣告一个TextBox 型态的对象变量,用来存放ListItem 中TextBox 控件的参考;此时我们就可以用ListItem 对象的FindControl() 方法来取得指定的控件参考,FindControl只要传入想要传回对象参考的Id 属性即可。最后只要呼叫DataSetCommand 对象的Update 方法,就可以将使用者所作的修改更新回原来的数据源。所以选择「确定」回到SelectedItemTanplate 样版的模式来显示数据时,就可以看到资料已经被更新了;如下图所示:
范例二综合相关事件
<%@Import Namespace=System.Data.ADO%> <%@Import Namespace=System.Data%> <Html> <Form runat="Server"> <ASP:DataList Id="dlA" OnItemCommand="dlA_ICmd" OnEditCommand="dlA_ECmd" OnCancelCommand="dlA_CCmd" GridLines="both" Runat="Server"> <Template Name="ItemTemplate"> <ASP:Image ImageUrl="ico1.gif" Runat="Server"/> 姓名: <%#Container.DataItem("UserName")%> <ASP:LinkButton Id="lbShow" Text=">" CommandName="Show" Runat="Server"/> </Template> <Template Name="EditItemTemplate"> <ASP:Image ImageUrl="ico1.gif" Runat="Server"/> 姓名: <%#Container.DataItem("UserName")%><br> 电话:<ASP:TextBox Id="T1" Text='<%#Container.DataItem("UserTel")%>' Runat="Server"/><br> 住址:<ASP:TextBox Id="T2" Text='<%#Container.DataItem("UserAdd")%>' Runat="Server"/><br> 电邮:<ASP:TextBox Id="T3" Text='<%#Container.DataItem("UserEMail")%>' Runat="Server"/><br> <ASP:LinkButton Id="lbCancel" Text="[放弃]" CommandName="Cancel" Runat="Server"/> <ASP:LinkButton Id="lbSubmit" Text="[确定]" CommandName="Submit" Runat="Server"/><br> </Template> <Template Name="SelectedItemTemplate"> <ASP:Image ImageUrl="ico1.gif" Runat="Server"/> 姓名: <%#Container.DataItem("UserName")%> <ASP:LinkButton Id="lbClose" Text="<" CommandName="Close" Runat="Server"/><br> 电话: <%#Container.DataItem("UserTel")%><br> 住址: <%#Container.DataItem("UserAdd")%><br> 电邮: <%#Container.DataItem("UserEmail")%><br> <ASP:LinkButton Id="lbEdit" Text="[编辑]" CommandName="Edit" Runat="Server"/><br> </Template> </ASP:DataList> </Form> <Script Language="VB" Runat="Server"> Dim dscA As ADODataSetCommand=New ADODataSetCommand("Select * From Members", _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:InetPubwwwrootCRCh05MyWeb.Mdb") Dim dsDataSet As DataSet=New DataSet Dim dtDataTable As DataTable Sub Page_Load(Sender As Object, e As EventArgs) dscA.FillDataSet(dsDataSet,"Members") dtDataTable=dsDataSet.Tables("Members") dlA.DataSource=dtDataTable.DefaultView If Not Page.IsPostBack Then Page.DataBind() End Sub Sub dlA_ICmd(Sender As Object, e As DataListCommandEventArgs) If e.CommandSource.CommandName="Show" Then dlA.SelectedIndex=e.Item.ItemIndex ElseIf e.CommandSource.CommandName="Close" Then dlA.SelectedIndex=-1 ElseIf e.CommandSource.CommandName="Submit" Then Dim txtTemp As TextBox txtTemp=e.Item.FindControl("T1") '取回ListItem 中名为T1 的控件参 考 dtDataTable.Rows(dlA.EditItemIndex)("UserTel")=txtTemp.Text txtTemp=e.Item.FindControl("T2") '取回ListItem 中名为T2 的控件参 考 dtDataTable.Rows(dlA.EditItemIndex)("UserAdd")=txtTemp.Text txtTemp=e.Item.FindControl("T3") '取回ListItem 中名为T3 的控件参 考 dtDataTable.Rows(dlA.EditItemIndex)("UserEmail")=txtTemp.Text dscA.Update(dsDataSet,"Members") dlA.EditItemIndex=-1 End If dlA.DataBind() End Sub Sub dlA_ECmd(Sender As Object, e As DataListCommandEventArgs) dlA.EditItemIndex=e.Item.ItemIndex dlA.DataBind() End Sub Sub dlA_CCmd(Sender As Object, e As DataListCommandEventArgs) dlA.EditItemIndex=-1 dlA.DataBind() End Sub </SCRIPT> </Html> 上述范例二的执行结果和范例一完全一样。
|