「主/明細」資料表常用來顯示關聯數據表間的數據。例如在MyWeb 數據庫中有兩個有關聯的數據表,分別為會員數據表以及訂單數據表;會員數據表中記錄了基本的會員數據,而訂單數據表記錄了會員所下的訂單。我們可以透過一個DataGrid Web控件將這個會員數據表呈現出來后,點選我們所要檢視的會員;此時該會員所下過的訂單細目就會列在另一個DataGred Web 控件中,如下圖所示:
要達到這個功能,只要利用DataGrid Web 控件的OnItemCommand 事件就可以辦到。我們將主數據表的使用者名稱以ButtonColumn 來呈現,這樣使用者在這個字段上點選時,就會觸發OnItemCommand 事件;我們就可以透過這個事件取得使用者所點選的記錄,并設定好條件將子記錄從數據源取回后呈現在明細數據表上:
<%@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"
OnItemCommand="dgA_ICmd">
<Property Name="Columns">
<ASP:ButtonColumn
HeaderText="姓名" DataTextField="UserName"/>
<ASP:BoundColumn
HeaderText="電話" DataField="UserTel"/>
<ASP:BoundColumn
HeaderText="住址" DataField="UserAdd"/>
<ASP:BoundColumn
HeaderText="電郵" DataField="UserEmail"/>
</Property>
</ASP:DataGrid><br>
<ASP:DataGrid Id="dgB" Runat="Server"
PagerStyle-Mode="NumericPages"
BorderColor="#808080"
HeaderStyle-Font-Names="Courier New"
HeaderStyle-BackColor="#D1DCEB"
HeaderStyle-Font-Bold="True"
HeaderStyle-HorizontalAlign="Center"
AutoGenerateColumns="False">
<Property Name="Columns">
<ASP:BoundColumn
HeaderText="日期" DataField="OrderDate"/>
<ASP:BoundColumn
HeaderText="產品名稱" DataField="ProductName"/>
<ASP:BoundColumn
HeaderText="單價" DataField="UnitPrice"/>
<ASP:BoundColumn
HeaderText="數量" DataField="Quantity"/>
<ASP:BoundColumn
HeaderText="小計" DataField="Total"/>
</Property>
</ASP:DataGrid>
</Form>
<ASP:Label Id="Label1" Runat="Server"/>
<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
dscA.SelectCommand.CommandText="Select * From Members"
dscA.FillDataSet(dsDataSet, "Members")
dgA.DataSource=dsDataSet.Tables("Members").DefaultView
dgA.DataBind()
End If
Label1.Text="您目前沒有點選任何記錄."
End Sub
Sub dgA_PageChg(Sender As Object, e As DataGridPageChangedEventArgs)
dscA.FillDataSet(dsDataSet, "Members")
dgA.DataSource=dsDataSet.Tables("Members").DefaultView
dgA.DataBind()
dgB.Visible=False
End Sub
Sub dgA_ICmd(Sender As Object, e As DataGridCommandEventArgs)
Dim shtR As Short=(dgA.CurrentPageIndex * dgA.PageSize) +
e.Item.ItemIndex
If shtR>=0 Then
dscA.FillDataSet(dsDataSet, "Members")
dscA.SelectCommand.CommandText="Select * From Orders Where
UserId='" & _
dsDataSet.Tables("Members").Rows(shtR)("UserId") & "'"
dscA.FillDataSet(dsDataSet, "Orders")
dgB.DataSource=dsDataSet.Tables("Orders").DefaultView
dgB.DataBind()
dgB.Visible=True
Label1.Text="總共有" & dsDataSet.Tables("Orders").Rows.Count & "
筆記錄"
End If
End Sub
</SCRIPT>
</Html>