樹形結構是如何產生的
TreeView其實沒有哪個屬性指明哪個節點為根節點,TopNode真不知道是幹什麼用的;
它的樹形結構是這樣產生的:
TreeView tvEg = new TreeView( );
TreeNode rootNode = new TreeNode("Folder0");
TreeNode subNode1 = new TreeNode("Folder0.1");
TreeNode subNode2 = new TreeNode("Folder0.2");
tvEg.Nodes.Add(rootNode);
rootNode.Nodes.Add(subNode1);
rootNode.Nodes.Add(subNode2);
subNode1.Nodes.Add(new TreeNode("File1"));
subNode1.Nodes.Add(new TreeNode("File2"));
subNode2.Nodes.Add(new TreeNode("File1"));
於是就會形成這樣一個樹形結構:
還需要注意的一點就是使用TreeNode對象時,尤其關注其Name屬性和Text屬性是不同的。
問題:我想實現動態載入節點集合,但是如果事先不載入,這個父節點就不會出現+/-號,於是我就無法對應其Exband事件,怎麼辦?
我目前的實現方式是在表單Load時靜態載入全部節點,這樣就沒有必要再去處理Exband事件了;
但是,一旦節點非常多,這個載入時間可能就太長了!怎麼辦呢?
答案:可以為其添加一個虛節點,以顯示展開符號;然後在展開該節點的時候就可以先清除其所以子節點,然後動態載入其子節點
問題:如何在一個帶CheckedBox的二級TreeView中實現一種有邏輯的選擇操作,即(取消)選擇父節點則(取消)選擇了其下的所以子節點,取消全部子節點時則父節點也被取消,否則只有還有一個子節點在,父節點就是被選擇狀態。
答案:參考以下代碼
捕捉AfterCheck事件
private void tvw_AfterCheck(object sender, TreeViewEventArgs e)
{
TreeNode currentNode = e.Node;
if ( currentNode.Nodes.Count > 0 )
{
// 一級節點
foreach ( TreeNode childNode in e.Node.Nodes )
{
childNode.Checked = currentNode.Checked;
}
}
else
{
// 二級節點
bool parentNodeChecked = false;
TreeNode parentNode = currentNode.Parent;
if ( parentNode != null )
{
if (currentNode.Checked)
{
parentNodeChecked = true;
}
else
{
foreach ( TreeNode node in parentNode.Nodes )
{
if ( node.Checked )
{
//如果其中的一個已經checked
parentNodeChecked = true;
break;
}
}
}
parentNode.Checked = parentNodeChecked;
}
}
}