用DataRelation給多個DataTable建立關係並顯示到TreeView,datarelation
DataRelation 對象執行兩種功能:
它可使與正使用的記錄相關的記錄可用。如果在父記錄 (GetChildRows) 中,則它提供子記錄;如果正使用子記錄 (GetParentRow),則它提供父記錄。
它可強制限制式的參考完整性,如刪除父記錄時刪除相關的子記錄。
瞭解真正的聯結與 DataRelation 對象功能之間的差異很重要。在真正的聯結中,從父表和子表擷取記錄並將其放入單個的平面記錄集。當使用 DataRelation 對象時,不建立新記錄集。而關係跟蹤表之間的關係並使父記錄和子記錄保持同步。
public partial class DataRelationDemo : System.Web.UI.Page{ private SqlConnection conn; private SqlDataAdapter dad; private DataSet ds; protected void Page_Load(object sender, EventArgs e) { //串連資料庫pubs,且把三張表填充到DataSet裡; this.conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["pubsConnectionString"].ToString()); this.dad = new SqlDataAdapter("select job_id,job_desc from jobs select pub_id,pub_name from publishers select pub_id,job_id,fname,lname from employee", conn); this.ds=new DataSet(); this.dad.Fill(ds); //給三張表建立不同的關係; //通過job_id給employee和jobs建立主外間關係;注意主表(父表)在前,從表(子表)在後,注意參數的順序 DataRelation relationjob = new DataRelation("empjob", ds.Tables[0].Columns["job_id"], ds.Tables[2].Columns["job_id"]); //添加到DataSet裡的Relations中; ds.Relations.Add(relationjob); //通過pub_id給employee和publishers建立主外間關係;注意主表(父表)在前,從表(子表)在後,注意參數的順序 DataRelation relationpub = new DataRelation("emppub", ds.Tables[1].Columns["pub_id"], ds.Tables[2].Columns["pub_id"]); //添加到DataSet裡的Relations中; ds.Relations.Add(relationpub); //迴圈遍力主表(父表), foreach (DataRow drpub in ds.Tables[1].Rows) { //建立父節點 TreeNode nodepart = new TreeNode(); nodepart.Text = drpub["pub_name"].ToString(); this.TreeView1.Nodes.Add(nodepart);//將父節點添加到樹控制項; //在迴圈遍力主表所對應的從表(子表),用GetChildRows(relationpub)得到的是一個DataRow數組; foreach (DataRow dremp in drpub.GetChildRows(relationpub)) { //在建立子節點; TreeNode nodechild = new TreeNode(); nodechild.Text = dremp["fname"].ToString() + " " + dremp["lname"].ToString(); nodepart.ChildNodes.Add(nodechild);//將子節點添加到父節點裡; //通過dremp.GetParentRow(relationjob)這個方法得到從表(子表)所對應的主表(父表),而返回的是一行DataRow資料; //因此不需要用迴圈遍曆; DataRow dr=dremp.GetParentRow(relationjob); ////在建立子節點; TreeNode nodechch = new TreeNode(); nodechch.Text = dr["job_desc"].ToString(); nodechild.ChildNodes.Add(nodechch);//將子節點添加到上以及子節點裡; } } }}