使用DataRelation快速建立Master與Detail連動

使用DataRelation,快速的建立主檔Table與副檔Table的關係,在點擊主檔的DataGrid後,能立即自動的顯示該項目的明細資料於另一個DataGrid裡.

  寫Master及Detail連動的功能很常見,就是點擊主清單時,在副清單會顯示出該項目的明細資料,但很多時候因為資料量的考量,都是點擊主清單時,再依點擊的項目至資料庫取回明細資料,這種寫法用久了,很容易就忘了還有DataRelation這種東西,沒錯,如果一開始就將所有的明細資料都從資料庫取出,資料量是很可怕的,所以點主檔再取明細是較好的做法,那DataRelation不就沒用處了?答案不盡然,就看是否用在對的地方,那些方面可以運作就不介紹了,接下來要講的是如何使用DataRelation.

這範例所表現出來的畫面如下 :

程式開始會先產生一些基本資料,左邊的Grid為主檔,右邊則為相關明細,當我點左邊的Judy時,右邊就會顯示Judy的資料,注意看,No是一樣的.

當我點擊Jack後,右邊的明細馬上就會自動帶出Jack的資料,此時的No一樣都是1了.

  要做到這樣的效果一點也不難,也不用很久,除去基本資料的準備,建立DataRelation及丟到Grid,不過就五行程式碼(也可說只有三行,如果丟到DataGrid.DataSource不算).

程式碼如下 :

01         private void Form1_Load(object sender, EventArgs e)
02         {
03             try
04             {
05                 #region 準備預設顯示資料
06                 DataSet ds = new DataSet();
07                 DataTable dtm = new DataTable("BasicMaster");
08                 dtm.Columns.Add("UserNo", typeof(int)).ReadOnly = true; ;
09                 dtm.Columns.Add("UserName", typeof(string));
10                 dtm.Columns["UserNo"].AutoIncrement = true;
11
12                 DataRow dr1 = dtm.NewRow();
13                 dr1["UserNo"] = 0;
14                 dr1["UserName"] = "Judy";
15                 dtm.Rows.Add(dr1);
16
17                 DataRow dr2 = dtm.NewRow();
18                 dr2["UserNo"] = 1;
19                 dr2["UserName"] = "Jack";
20                 dtm.Rows.Add(dr2);
21
22                 DataTable dtd = new DataTable("BasicDetail");
23                 dtd.Columns.Add("UserNo", typeof(int)).ReadOnly = true;
24                 dtd.Columns.Add("Phone", typeof(string));
25
26                 DataRow dr3 = dtd.NewRow();
27                 dr3["UserNo"] = 0;
28                 dr3["Phone"] = "123456789";
29                 dtd.Rows.Add(dr3);
30                 DataRow dr31 = dtd.NewRow();
31                 dr31["UserNo"] = 0;
32                 dr31["Phone"] = "987654321";
33                 dtd.Rows.Add(dr31);
34
35                 DataRow dr4 = dtd.NewRow();
36                 dr4["UserNo"] = 1;
37                 dr4["Phone"] = "159753456";
38                 dtd.Rows.Add(dr4);
39                 DataRow dr41 = dtd.NewRow();
40                 dr41["UserNo"] = 1;
41                 dr41["Phone"] = "951357654";
42                 dtd.Rows.Add(dr41);
43                 DataRow dr42 = dtd.NewRow();
44                 dr42["UserNo"] = 1;
45                 dr42["Phone"] = "987456321";
46                 dtd.Rows.Add(dr42);
47
48                 ds.Tables.Add(dtm);
49                 ds.Tables.Add(dtd);
50                 #endregion

51
52                 //建立Relation
53                 ds.Relations.Add(new DataRelation("UserInfo", ds.Tables["BasicMaster"].Columns["UserNo"], ds.Tables["BasicDetail"].Columns["UserNo"]));
54                 BindingSource bsm = new BindingSource(ds, "BasicMaster");//DataSource為DataSet,DataMember為主表單的TableName
55                 BindingSource bsd = new BindingSource(bsm, "UserInfo");//DataSource為主選單的BindingSource,DataMember為RelationName.
56
57                 gridM.DataSource = bsm;//主表單的BindingSource
58                 gridS.DataSource = bsd;//次表單的BindingSource
59             }

60             catch (Exception ex)
61             {
62                 MessageBox.Show(ex.Message);
63             }

64         }

  從第5行到50行都是準備資料,不是重點,重點在第53行,這行就是在建立主檔跟明細檔之間的關係"Relation",兩個Table要用那個欄位來串起來,以這個範來說,UserNo就是兩個Table的關聯欄位.

  接下來第54行跟第55行分別是主檔跟副檔的BindingSource,基本上看起來差不多,但還是有些許差異,在第54行的主檔部份,可以看到new BindingSource(ds,"BasicMaster"),括號內的第一個參數是DataSet,第二個為主檔的Table名稱,而第55行的副檔部份就不一樣了,第一個參數放的是主檔的BindingSource,第二個參數則為DataRelation的名稱,接下來只要把這兩個BindingSource分別丟到主副DataGrid的DataSource即可.

 

就這麼簡單,Master跟Detail的連動就做好了,接下來就看各位怎麼去運用DataRelation的這個功能囉.

 

參考資料 :

MSDN DataRelation類別

範例下載 :

MDForm.rar