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


沒有留言:
張貼留言