2015年5月18日 星期一

TreeView與資料階層關係

一般TreeView的節點功能,來做資料庫階層關係設計,這時我們可以利用ADO.Net上的DataRelations,來建立資料表上的關係性
1、資料庫欄位:
MyPK:當筆資料的Key值
ParentID:父節點的Key值,若為NULL則為最上層

 2、程式部分
可用DataRelation來建立表的關連性
注意:1、表上的所有資料都需要對映到,不可有ParentID=5,但在父節點到找不到ID=5的情況
           2、ParentID為Null是允許的,代表為最上層,但ParentID若設定為""空白的話,程式上會判定還有一個父節點ID="",此時程產在查尋關聯時會產生錯誤
設定資料
        
        public Void SetData()
        {  
            //捉取資料到DataTable
            DataTable dt = qo.DoQueryToTable();
            //將關聯Table加入到DataSet以供建立關係,因目前資料關係性是在自己本表上,所以只需Add一次
            DataSet ds = new DataSet();
            ds.Tables.Add(dt);
            //產生關聯性
            ds.Relations.Add("NodeRelation", ds.Tables[0].Columns["MyPK"], ds.Tables[0].Columns["ParentID"]);
            
            foreach (DataRow dr in dt.Rows)
            {
                if(dr.IsNull("ParentID"))
                {
                    TreeNode rootNode = this.TreeView1.FindNode("WBS");
                    string strText = dr["Tag"].ToString() + " : " + dr["Memo"].ToString();                    
                    
                    TreeNode addNode = CreateNode(strText, dr["MyPK"].ToString(), true);
                    rootNode.ChildNodes.Add(addNode);
                    //搜尋子節點,並進行遞迴
                    PopulateSubTree(dr, addNode);
                }
            }
        }
建立節點
        
        private TreeNode CreateNode(string text, string id, bool expanded)
        {
            TreeNode node = new TreeNode(); 
            node.Text = text;
            node.Value = id;
            node.Expanded = true;
            return node;
        }
子節點遞迴搜尋

        
        private void PopulateSubTree(DataRow dbRow, TreeNode node)
        {
            //因有在SetData()上建立資料表上MyPK與ParentID的關連性,所以在這可用GetChildRows捉取子節點
            foreach (DataRow childRow in dbRow.GetChildRows("NodeRelation"))
            {
                string strText = childRow["Tag"].ToString() + " : " + childRow["Memo"].ToString();
                
                TreeNode childNode = CreateNode(strText, childRow["MyPK"].ToString(), true);
                node.ChildNodes.Add(childNode);
                PopulateSubTree(childRow, childNode);
            }
        }

3、最後出現的畫面如下
 而畫面上為何會有像Project一樣的表格呢?這是利用CSS來進行調整的,若去看TreeView的原始碼,可以看出他是由Table組成的,而上面的畫面,則是在TD上調整border即可

td {
    padding: 1px;
    border: 1px solid #D6DDE6;
    text-align: left;
    background-color: #FFF;
    color: #333;
    margin: 1px;
}
參考資料:
MSDN:加入 DataRelations 

動態TreeView 結合資料庫產生節點



沒有留言:

張貼留言