本書 9-2節的範例,示範的是「單一主索引鍵」的狀況 -- 請看 [習題] [主細表]同一個網頁裡面,兩個GridView作關聯對應(不寫程式,只靠SqlDataSource完成)
本範例的執行畫面:

--------------------------------------------------------------------------------------------------
依照這個問題,我們繼續思考一下:
如果(畫面上方)第一個 GridView1,本身有多個主索引鍵(P.K.)那該怎麼辦?
我們可以自己寫程式,試一試。
範例 GridView1_Multi_PK.aspx 已經設定了 GridView1的 P.K.主索引鍵有兩個。如下圖

那麼,我們要擷取這兩個 P.K.值,後置程式碼應該寫成:
1 
Protected Sub GridView1_SelectedIndexChanged() Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged
2
3
Label1.Text = "第一個主索引鍵 == " & GridView1.SelectedDataKey.Values(0).ToString()
4
Label2.Text = "第二個主索引鍵 == " & GridView1.SelectedDataKey.Values(1).ToString()
5
6
Label3.Text = "GridView1.SelectedValue 主索引鍵 == " & GridView1.SelectedValue.ToString()
7
8
End Sub 請注意,我們常用的 GridView1.SelectedValue,只能取出第一個PK。如果有多個PK,那就不能用這行程式碼了。
請改用上面的 GridView1.SelectedDataKey.Values(索引號碼)
因為電腦都是從「零」算起,所以第一個PK主索引鍵,編號是零!第二個的編號是 1.....以此類推。
--------------------------------------------------------------------------------------------------
瞭解了上面的程式之後,我們可以繼續 9-2節的那個範例([習題] [主細表]同一個網頁裡面,兩個GridView作關聯對應(不寫程式,只靠SqlDataSource完成) )
GridView1 有多個 P.K. 主索引鍵時,可能就要自己動手寫程式來解決 Master-Detail(主細表)的問題了
本範例 GridView_Multi_PK_2.aspx 畫面設計很簡單,
但要注意 -- 底下的 GridView2,是空的!不搭配任何 SqlDataSource喔!
程式也不難,同一個範本改一下即可。(關於ADO.NET的程式,本書第十四章有完整說明)
本範例 GridView_Multi_PK_2.aspx 後置程式碼如下:
01 '----自己寫的---- 02 
'----自己寫的---- 03
Imports ...System
04
Imports System.Web.Configuration
05
Imports System.Data
06
Imports System.Data.SqlClient
07 '----自己寫的----
08
09
10
Partial Class test_GridView_GridView_Multi_PK_2
11
Inherits System.Web.UI.Page
12
13 
Protected Sub GridView1_SelectedIndexChanged() Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged
14
'====自己手寫的程式碼, DataAdapter / DataSet ====(Start)
15
'----上面已經事先寫好 Imports System.Web.Configuration ----
16
'----連結資料庫
17
Dim Conn As New SqlConnection(WebConfigurationManager.ConnectionStrings("testConnectionString").ConnectionString)
18
19
Dim myAdapter As SqlDataAdapter
20
myAdapter = New SqlDataAdapter("select * from test where id = " & GridView1.SelectedDataKey.Values(0) & " and title = '" & GridView1.SelectedDataKey.Values(1) & "'", Conn)
21
22
Dim ds As New DataSet
23
24
Try '==== 以下程式,只放「執行期間」的指令!=================
25
'Conn.Open() '---- 不用寫,DataAdapter會自動開啟
26
27
myAdapter.Fill(ds, "test") '---- 這時候執行SQL指令。取出資料,放進 DataSet。
28
29
GridView2.DataSource = ds '----標準寫法 GridView2.DataSource = ds.Tables("test").DefaultView ----
30
GridView2.DataBind()
31
32
Catch ex As Exception
33
Response.Write("<HR/> Exception Error Message---- " + ex.ToString())
34
Finally
35
'---- 不用寫,DataAdapter會自動關閉
36
'If (Conn.State = ConnectionState.Open) Then
37
'Conn.Close()
38
'Conn.Dispose()
39
'End If
40
End Try
41
End Sub 42
End Class
完整範例,由此下載:GridView_Multi_PK.rar
特別感謝讀者 Binsh來信詢問,我才發現這一段我好像沒講到。 現在補給大家
這個範例,我會立刻加入書本的「勘誤表」,當作 9-2節的補充習題。 謝謝!
本系列文章,共有三篇,請看下一篇 --- [習題] [主細表]同一個網頁裡面,兩個GridView作關聯對應#3 (改用Session,盡量不寫程式)
...... 寄信給我 mis2000lab (at) 雅虎.com.台灣 ................................................................................................................
ASP.NET專題實務
(文魁出版,VB版 P8187 / C#版P09027)
下集已經出版囉~~~ASP.NET專題實務II:範例應用與4.0新功能 
.............................................................................................................. 寄信給我 mis2000lab (at) 雅虎.com.台灣 ........