我尝试在Form
中调用扩展类,对于TreeView,该类是:
namespace Extension
{
public static class ExtensionClass
{
public static List<TreeNode> Parents(this TreeNode node)
{
var parents = new List<TreeNode>();
TreeNode parent = node.Parent;
while (parent != null) ;
{
parents.Add(parent);
parent = parent.Parent;
}
return parents;
}
public static void CheckChildren(this TreeNode node)
{
if (!node.Checked)
return;
foreach (TreeNode node1 in node.Nodes)
{
node1.Checked = true;
node1.CheckChildren();
}
}
public static TreeNode CheckParentsAndChildren(this TreeNode node)
{
TreeNode parent = node.Parent;
while (parent != null) ;
{
parent.Checked = true;
parent.CheckChildren();
parent = parent.Parent;
}
return parent;
}
}
}
并在Form
我添加了using Extension;
。但是这段代码不起作用,什么也没发生,而且按照我对此代码2的方式警告:&#34;可能出错的空语句&#34;。
我的问题是如何称呼这门课程?我必须在Form中添加一些内容:
using Extension;
namespace WindowsFormsApplication2
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
}
答案 0 :(得分:3)
使用这些扩展方法,就好像它们是TreeNode
类
private bool _checking;
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
if (!_checking && e.Node.Checked) {
_checking = true;
try {
e.Node.CheckParentsAndChildren();
} finally {
_checking = false;
}
}
}
请注意,这只是syntactic sugar。上面的扩展方法调用相当于:
ExtensionClass.CheckParentsAndChildren(e.Node);
您的代码存在逻辑问题。
在CheckParentsAndChildren
中,您不仅要检查节点的所有父节点,还要检查所有这些父节点的所有子节点。结果就是你正在检查整棵树!
CheckParentsAndChildren
应该只检查当前节点的子节点
public static void CheckParentsAndChildren(this TreeNode node)
{
node.CheckChildren(); // Check children of current node only.
TreeNode parent = node.Parent;
while (parent != null) // ; <-- this semicolon was the problem!!
{
parent.Checked = true;
parent = parent.Parent;
}
}
此方法也应该有void
返回类型。
此外,您应该使用AfterCheck
事件(在设置或清除复选标记后发生)而不是AfterSelect
事件(在选择节点后发生)并测试用户是在检查还是取消选中。
还有一个问题是,当您以编程方式检查节点时会触发AfterCheck
。因此,我介绍了在检查代码中的节点之前设置的guard _checking
,以防止重复调用treeView1_AfterCheck
。为了确保在作业完成后将重置防护,即使发生异常,我也会将代码放在try-finally语句中。
答案 1 :(得分:0)
当然没有任何事情发生,因为你永远不会调用那些扩展方法。只因为它们存在于您的代码中并不意味着它们会被执行。因此,在树的事件处理程序中添加相关代码:
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
e.Node.CheckParentsAndChildren();
e.Node.CheckChildren();
var parents = e.Node.Parents();
}