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;
}
}
}
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;
}
}
}