下列兩個范例都是將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:\InetPub\wwwroot\CR\Ch05\MyWeb.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:\InetPub\wwwroot\CR\Ch05\MyWeb.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>