若在頁面中包含了一個 GridView 及 DetailsView 控制項,當 GridView 選取某一筆時,希望在 DetailsView 中顯示那一筆的詳細資料。一般的作法會讓 GridView 及 DetailsView 會繫結各別獨立的 SqlDataSoruce,當 GridView 選取時就以主鍵去對 DetailsView 的 SqlDataSource 做篩選資料的動作。
不過本文的作法不同,讓 GirdView 與 DetailsView 繫結到同一個 SqlDataSource,而且只要撰寫很少的程式碼,就可以達到 GridView 與 DetailsView 連動的需求。
以 Northwind 資料庫的 Products 資料表為資料來源,首先在頁面放置一個 SqlDataSource 控制項。頁面左邊放置一個 GridView,GridView啟用分頁及選取。頁面右邊放置一個 DetailsView,並啟用編輯。GridView 與 DetailsView 繫結到同一個 SqlDataSource。
aspx 程式碼如下
1
<%
@ Page Language
=
"
VB
"
AutoEventWireup
=
"
false
"
CodeFile
=
"
Default.aspx.vb
"
Inherits
=
"
_Default
"
%>
2
3
<!
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
4
5
<
html
xmlns
="http://www.w3.org/1999/xhtml"
>
6
<
head
runat
="server"
>
7
<
title
>
未命名頁面
</
title
>
8
</
head
>
9
<
body
>
10
<
form
id
="form1"
runat
="server"
>
11
<
div
>
12
<
table
style
="width:100%"
>
13
<
tr
>
14
<
td
style
="width: 337px"
valign
="top"
>
15
<
asp:GridView
ID
="GridView1"
runat
="server"
AllowPaging
="True"
AutoGenerateColumns
="False"
16
DataKeyNames
="ProductID"
DataSourceID
="SqlDataSource1"
EmptyDataText
="沒有資料錄可顯示。"
CellPadding
="4"
ForeColor
="#333333"
GridLines
="None"
>
17
<
Columns
>
18
<
asp:CommandField
ShowSelectButton
="True"
/>
19
<
asp:BoundField
DataField
="ProductID"
HeaderText
="ProductID"
ReadOnly
="True"
SortExpression
="ProductID"
/>
20
<
asp:BoundField
DataField
="ProductName"
HeaderText
="ProductName"
SortExpression
="ProductName"
/>
21
</
Columns
>
22
<
FooterStyle
BackColor
="#5D7B9D"
Font-Bold
="True"
ForeColor
="White"
/>
23
<
RowStyle
BackColor
="#F7F6F3"
ForeColor
="#333333"
/>
24
<
EditRowStyle
BackColor
="#999999"
/>
25
<
SelectedRowStyle
BackColor
="#E2DED6"
Font-Bold
="True"
ForeColor
="#333333"
/>
26
<
PagerStyle
BackColor
="#284775"
ForeColor
="White"
HorizontalAlign
="Center"
/>
27
<
HeaderStyle
BackColor
="#5D7B9D"
Font-Bold
="True"
ForeColor
="White"
/>
28
<
AlternatingRowStyle
BackColor
="White"
ForeColor
="#284775"
/>
29
</
asp:GridView
>
30
</
td
>
31
<
td
valign
="top"
>
32
<
asp:DetailsView
ID
="DetailsView1"
runat
="server"
AutoGenerateRows
="False"
DataKeyNames
="ProductID"
33
DataSourceID
="SqlDataSource1"
Height
="50px"
Width
="400px"
CellPadding
="4"
ForeColor
="#333333"
GridLines
="None"
>
34
<
Fields
>
35
<
asp:BoundField
DataField
="ProductID"
HeaderText
="ProductID"
InsertVisible
="False"
36
ReadOnly
="True"
SortExpression
="ProductID"
/>
37
<
asp:BoundField
DataField
="ProductName"
HeaderText
="ProductName"
SortExpression
="ProductName"
/>
38
<
asp:BoundField
DataField
="SupplierID"
HeaderText
="SupplierID"
SortExpression
="SupplierID"
/>
39
<
asp:BoundField
DataField
="CategoryID"
HeaderText
="CategoryID"
SortExpression
="CategoryID"
/>
40
<
asp:BoundField
DataField
="QuantityPerUnit"
HeaderText
="QuantityPerUnit"
SortExpression
="QuantityPerUnit"
/>
41
<
asp:BoundField
DataField
="UnitPrice"
HeaderText
="UnitPrice"
SortExpression
="UnitPrice"
/>
42
<
asp:BoundField
DataField
="UnitsInStock"
HeaderText
="UnitsInStock"
SortExpression
="UnitsInStock"
/>
43
<
asp:BoundField
DataField
="UnitsOnOrder"
HeaderText
="UnitsOnOrder"
SortExpression
="UnitsOnOrder"
/>
44
<
asp:BoundField
DataField
="ReorderLevel"
HeaderText
="ReorderLevel"
SortExpression
="ReorderLevel"
/>
45
<
asp:CheckBoxField
DataField
="Discontinued"
HeaderText
="Discontinued"
SortExpression
="Discontinued"
/>
46
<
asp:CommandField
ShowEditButton
="True"
/>
47
</
Fields
>
48
<
FooterStyle
BackColor
="#990000"
Font-Bold
="True"
ForeColor
="White"
/>
49
<
CommandRowStyle
BackColor
="#FFFFC0"
Font-Bold
="True"
/>
50
<
RowStyle
BackColor
="#FFFBD6"
ForeColor
="#333333"
/>
51
<
PagerStyle
BackColor
="#FFCC66"
ForeColor
="#333333"
HorizontalAlign
="Center"
/>
52
<
FieldHeaderStyle
BackColor
="#FFFF99"
Font-Bold
="True"
/>
53
<
HeaderStyle
BackColor
="#990000"
Font-Bold
="True"
ForeColor
="White"
/>
54
<
AlternatingRowStyle
BackColor
="White"
/>
55
</
asp:DetailsView
>
56
</
td
>
57
</
tr
>
58
</
table
>
59
<
br
/>
60
<
br
/>
61
</
div
>
62
<
asp:SqlDataSource
ID
="SqlDataSource1"
runat
="server"
ConnectionString
="<%$ ConnectionStrings:NorthwindConnectionString1 %>"
63
DeleteCommand
="DELETE FROM [Products] WHERE [ProductID] = @ProductID"
InsertCommand
="INSERT INTO [Products] ([ProductName], [SupplierID], [CategoryID], [QuantityPerUnit], [UnitPrice], [UnitsInStock], [UnitsOnOrder], [ReorderLevel], [Discontinued]) VALUES (@ProductName, @SupplierID, @CategoryID, @QuantityPerUnit, @UnitPrice, @UnitsInStock, @UnitsOnOrder, @ReorderLevel, @Discontinued)"
64
ProviderName
="<%$ ConnectionStrings:NorthwindConnectionString1.ProviderName %>"
65
SelectCommand
="SELECT [ProductID], [ProductName], [SupplierID], [CategoryID], [QuantityPerUnit], [UnitPrice], [UnitsInStock], [UnitsOnOrder], [ReorderLevel], [Discontinued] FROM [Products]"
66
UpdateCommand
="UPDATE [Products] SET [ProductName] = @ProductName, [SupplierID] = @SupplierID, [CategoryID] = @CategoryID, [QuantityPerUnit] = @QuantityPerUnit, [UnitPrice] = @UnitPrice, [UnitsInStock] = @UnitsInStock, [UnitsOnOrder] = @UnitsOnOrder, [ReorderLevel] = @ReorderLevel, [Discontinued] = @Discontinued WHERE [ProductID] = @ProductID"
>
67
<
InsertParameters
>
68
<
asp:Parameter
Name
="ProductName"
Type
="String"
/>
69
<
asp:Parameter
Name
="SupplierID"
Type
="Int32"
/>
70
<
asp:Parameter
Name
="CategoryID"
Type
="Int32"
/>
71
<
asp:Parameter
Name
="QuantityPerUnit"
Type
="String"
/>
72
<
asp:Parameter
Name
="UnitPrice"
Type
="Decimal"
/>
73
<
asp:Parameter
Name
="UnitsInStock"
Type
="Int16"
/>
74
<
asp:Parameter
Name
="UnitsOnOrder"
Type
="Int16"
/>
75
<
asp:Parameter
Name
="ReorderLevel"
Type
="Int16"
/>
76
<
asp:Parameter
Name
="Discontinued"
Type
="Boolean"
/>
77
</
InsertParameters
>
78
<
UpdateParameters
>
79
<
asp:Parameter
Name
="ProductName"
Type
="String"
/>
80
<
asp:Parameter
Name
="SupplierID"
Type
="Int32"
/>
81
<
asp:Parameter
Name
="CategoryID"
Type
="Int32"
/>
82
<
asp:Parameter
Name
="QuantityPerUnit"
Type
="String"
/>
83
<
asp:Parameter
Name
="UnitPrice"
Type
="Decimal"
/>
84
<
asp:Parameter
Name
="UnitsInStock"
Type
="Int16"
/>
85
<
asp:Parameter
Name
="UnitsOnOrder"
Type
="Int16"
/>
86
<
asp:Parameter
Name
="ReorderLevel"
Type
="Int16"
/>
87
<
asp:Parameter
Name
="Discontinued"
Type
="Boolean"
/>
88
<
asp:Parameter
Name
="ProductID"
Type
="Int32"
/>
89
</
UpdateParameters
>
90
<
DeleteParameters
>
91
<
asp:Parameter
Name
="ProductID"
Type
="Int32"
/>
92
</
DeleteParameters
>
93
</
asp:SqlDataSource
>
94
</
form
>
95
</
body
>
96
</
html
>
97
當 GridView 選取資料列時會觸發 SelectedIndexChanging 事件,在這個事件中以 GridView 的 NewSelectedIndex 為基準去計算 DetailsView 對應的 PageIndex 即可。
1
Partial
Class
_Default
2
Inherits
System.Web.UI.Page
3
4
Protected
Sub
GridView1_SelectedIndexChanging(
ByVal
sender
As
Object
,
ByVal
e
As
System.Web.UI.WebControls.GridViewSelectEventArgs)
Handles
GridView1.SelectedIndexChanging
5
Dim
iPageIndex
As
Integer
6
Dim
oGridView
As
GridView
7
8
oGridView
=
CType
(sender, GridView)
9
If
oGridView.AllowPaging
Then
10
'
GridView 有分頁時,要把考慮目前的頁數及每頁筆數
11
iPageIndex
=
(oGridView.PageIndex)
*
oGridView.PageSize
+
e.NewSelectedIndex
12
Else
13
'
GridView 無分頁時,直接使用 e.NewSelectedIndex
14
iPageIndex
=
e.NewSelectedIndex
15
End
If
16
DetailsView1.PageIndex
=
iPageIndex
17
End Sub
18
19
End Class
執行結果如下,首先 GirdView 切換到第2頁,選取 GirdView 中 ProductID 為 15 的資料列時,DetailsView 也同步顯示同一筆資料。可在 DetailsView 中編輯此筆資料儲存後,GirdView 的資料也會同步更新。