使用DataRelation,快速的建立主檔Table與副檔Table的關係,在點擊主檔的DataGrid後,能立即自動的顯示該項目的明細資料於另一個DataGrid裡.
寫Master及Detail連動的功能很常見,就是點擊主清單時,在副清單會顯示出該項目的明細資料,但很多時候因為資料量的考量,都是點擊主清單時,再依點擊的項目至資料庫取回明細資料,這種寫法用久了,很容易就忘了還有DataRelation這種東西,沒錯,如果一開始就將所有的明細資料都從資料庫取出,資料量是很可怕的,所以點主檔再取明細是較好的做法,那DataRelation不就沒用處了?答案不盡然,就看是否用在對的地方,那些方面可以運作就不介紹了,接下來要講的是如何使用DataRelation.
這範例所表現出來的畫面如下 :
程式開始會先產生一些基本資料,左邊的Grid為主檔,右邊則為相關明細,當我點左邊的Judy時,右邊就會顯示Judy的資料,注意看,No是一樣的.
當我點擊Jack後,右邊的明細馬上就會自動帶出Jack的資料,此時的No一樣都是1了.
要做到這樣的效果一點也不難,也不用很久,除去基本資料的準備,建立DataRelation及丟到Grid,不過就五行程式碼(也可說只有三行,如果丟到DataGrid.DataSource不算).
程式碼如下 :
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的這個功能囉.
參考資料 :
範例下載 :