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

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為主表單的TableName55
BindingSource bsd = new BindingSource(bsm, "UserInfo");//DataSource為主選單的BindingSource,DataMember為RelationName.56

57 gridM.DataSource = bsm;//主表單的BindingSource
58
gridS.DataSource = bsd;//次表單的BindingSource59
}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的這個功能囉.
參考資料 :
範例下載 :
