我用下面的代码通过读取 xml 文件创建一个 winform TreeView:public void CreateTree(System.Windows.Forms.TreeView tv)
{
try
{
_xDoc.Load(_xmlFilePath);
tv.Nodes.Clear();
tv.Nodes.Add(new System.Windows.Forms.TreeNode(_xDoc.DocumentElement.Attributes["Title"].Value));
System.Windows.Forms.TreeNode tNode = new System.Windows.Forms.TreeNode();
tNode = tv.Nodes[0]; // 读取顶节
tNode.Checked = true; // 将该复选框设置为选中
tNode.Tag = _xDoc.DocumentElement.Attributes["id"].Value;
AddTreeNode(_xDoc.DocumentElement, tNode);
tv.ExpandAll();
}
catch
{
//
}
}private void AddTreeNode(XmlNode x, System.Windows.Forms.TreeNode t)
{
XmlNode xNode;
XmlNodeList xNodeList; if (x.HasChildNodes)
{
xNodeList = x.ChildNodes; for (int i = 0; i < xNodeList.Count; i++)
{
xNode = x.ChildNodes[i]; t.Nodes.Add(new System.Windows.Forms.TreeNode(xNode.Attributes["Title"].Value));
t.Nodes[i].Tag = xNode.Attributes["id"].Value;
t.Nodes[i].Checked = Convert.ToBoolean(xNode.Attributes["IsShow"].Value);
AddTreeNode(xNode, t.Nodes[i]);
}
}
else
return;
}上面的代码可以正确运行。但当我添加了下面的判断后,递归一旦发现不符合条件的话,就跳出去了:private void AddTreeNode(XmlNode x, System.Windows.Forms.TreeNode t)
{
XmlNode xNode;
XmlNodeList xNodeList; if (x.HasChildNodes)
{
xNodeList = x.ChildNodes; for (int i = 0; i < xNodeList.Count; i++)
{
xNode = x.ChildNodes[i];
if (Convert.ToBoolean(xNode.Attributes["IsShow"].Value)) // 和上面的递归相比,增加了这行。
t.Nodes.Add(new System.Windows.Forms.TreeNode(xNode.Attributes["Title"].Value)); t.Nodes[i].Tag = xNode.Attributes["id"].Value;
t.Nodes[i].Checked = Convert.ToBoolean(xNode.Attributes["IsShow"].Value);
AddTreeNode(xNode, t.Nodes[i]);
}
}
else
return;
}本人才学疏浅,对递归也不太会用,代码是直接抄msdn的,但不曾想只加了个判断,就挂了~ T-T
加了判断后,现实的结果是,只要发现 if(false) 的时候,其他所有项都干脆不建立了~我现在想要的是,如何能成功在这个递归里添加这个判断呢?100 分求助~
{
try
{
_xDoc.Load(_xmlFilePath);
tv.Nodes.Clear();
tv.Nodes.Add(new System.Windows.Forms.TreeNode(_xDoc.DocumentElement.Attributes["Title"].Value));
System.Windows.Forms.TreeNode tNode = new System.Windows.Forms.TreeNode();
tNode = tv.Nodes[0]; // 读取顶节
tNode.Checked = true; // 将该复选框设置为选中
tNode.Tag = _xDoc.DocumentElement.Attributes["id"].Value;
AddTreeNode(_xDoc.DocumentElement, tNode);
tv.ExpandAll();
}
catch
{
//
}
}private void AddTreeNode(XmlNode x, System.Windows.Forms.TreeNode t)
{
XmlNode xNode;
XmlNodeList xNodeList; if (x.HasChildNodes)
{
xNodeList = x.ChildNodes; for (int i = 0; i < xNodeList.Count; i++)
{
xNode = x.ChildNodes[i]; t.Nodes.Add(new System.Windows.Forms.TreeNode(xNode.Attributes["Title"].Value));
t.Nodes[i].Tag = xNode.Attributes["id"].Value;
t.Nodes[i].Checked = Convert.ToBoolean(xNode.Attributes["IsShow"].Value);
AddTreeNode(xNode, t.Nodes[i]);
}
}
else
return;
}上面的代码可以正确运行。但当我添加了下面的判断后,递归一旦发现不符合条件的话,就跳出去了:private void AddTreeNode(XmlNode x, System.Windows.Forms.TreeNode t)
{
XmlNode xNode;
XmlNodeList xNodeList; if (x.HasChildNodes)
{
xNodeList = x.ChildNodes; for (int i = 0; i < xNodeList.Count; i++)
{
xNode = x.ChildNodes[i];
if (Convert.ToBoolean(xNode.Attributes["IsShow"].Value)) // 和上面的递归相比,增加了这行。
t.Nodes.Add(new System.Windows.Forms.TreeNode(xNode.Attributes["Title"].Value)); t.Nodes[i].Tag = xNode.Attributes["id"].Value;
t.Nodes[i].Checked = Convert.ToBoolean(xNode.Attributes["IsShow"].Value);
AddTreeNode(xNode, t.Nodes[i]);
}
}
else
return;
}本人才学疏浅,对递归也不太会用,代码是直接抄msdn的,但不曾想只加了个判断,就挂了~ T-T
加了判断后,现实的结果是,只要发现 if(false) 的时候,其他所有项都干脆不建立了~我现在想要的是,如何能成功在这个递归里添加这个判断呢?100 分求助~
你這個是不是異常了,不然怎么會跳出去
你在IF前面看下:MessageBox.Show(xNode.Attributes["IsShow"].Value);是不是為空或者Null.
就是跳出去了,IsShow 不为空。
t.Nodes.Add(new System.Windows.Forms.TreeNode(xNode.Attributes["Title"].Value));
你加了判断,如果抱错,这地方距不能执行,没有添加节点,后面的肯定不能进行了
if (Convert.ToBoolean(xNode.Attributes["IsShow"].Value)) // 和上面的递归相比,增加了这行。
{ t.Nodes.Add(new System.Windows.Forms.TreeNode(xNode.Attributes["Title"].Value)); t.Nodes[i].Tag = xNode.Attributes["id"].Value;
t.Nodes[i].Checked = Convert.ToBoolean(xNode.Attributes["IsShow"].Value);
AddTreeNode(xNode, t.Nodes[i]);
}
这样就是只要不符合,就全部不添加!
t.Nodes.Add(new System.Windows.Forms.TreeNode(xNode.Attributes["Title"].Value));
else
t.Nodes.Add(new System.Windows.Forms.TreeNode(""));加个else试一下.
加了else可以执行,但 treeview 显示了一个空节点。我现在想要的是不显示这个节点~
{
try
{
_xDoc.Load(_xmlFilePath);
tv.Nodes.Clear();
tv.Nodes.Add(new System.Windows.Forms.TreeNode(_xDoc.DocumentElement.Attributes["Title"].Value));
System.Windows.Forms.TreeNode tNode = new System.Windows.Forms.TreeNode();
tNode = tv.Nodes[0]; // 读取顶节
tNode.Checked = true; // 将该复选框设置为选中
tNode.Tag = _xDoc.DocumentElement.Attributes["id"].Value;
AddTreeNode(_xDoc.DocumentElement, tNode);
tv.ExpandAll();
}
catch
{
tv.Enabled = false;
}
}我在 catch 内添加了这行,一旦发生错误,则令 treeview 失效,但运行时 treeview 并没有失效。所以那个判断应该没有发生错误。
{
XmlNode xNode;
XmlNodeList xNodeList; if (x.HasChildNodes)
{
xNodeList = x.ChildNodes; for (int i = 0; i < xNodeList.Count; i++)
{
xNode = x.ChildNodes[i];
if (Convert.ToBoolean(xNode.Attributes["IsShow"].Value)) // 和上面的递归相比,增加了这行。
t.Nodes.Add(new System.Windows.Forms.TreeNode(xNode.Attributes["Title"].Value)); t.Nodes[i].Tag = xNode.Attributes["id"].Value;
t.Nodes[i].Checked = Convert.ToBoolean(xNode.Attributes["IsShow"].Value);
AddTreeNode(xNode, t.Nodes[i]);
}
}
else
return;
}你在这里设一个断点跟踪一下.如果不满足if条件,是继续往后面执行,你这个判断只是看看IsShow是否为true,如果为true的话添加一个节点.如果false的话就不添加节点.也就是和你上面"正确"的代码相比,这个构造出来的tree也只是节点多少的差别而已
然后你那个else 的return可以去掉
这个对递归我没看出有什么影响,就算它不执行到if (Convert.ToBoolean(xNode.Attributes["IsShow"].Value))里面去的话,后面照样会调用 AddTreeNode(xNode, t.Nodes[i]); 不是一样会递归的么?
t.Nodes[i]的值是多少,递归后到了 if (x.HasChildNodes) 后看看是否满足,如果满足的话这时的x.ChildNodes值又是多少.这样一步一步的就你知道原因了,
后面有没有走到AddTreeNode(xNode, t.Nodes[i])?
如果走到了,递归时if (x.HasChildNodes)有没有满足,你就在
两个if条件和AddTreeNode这里加断点,看看第二次有没有执行就对了
没有走到,在前一行 t.Nodes[i].Tag = xNode.Attributes["id"].Value; 已报出错误:指定的参数已超出有效值的范围。
{
xNodeList = x.ChildNodes;
for (int i = 0, j=0; i < xNodeList.Count; i++)
{
xNode = x.ChildNodes[i];
if (!IsAdministrator)
{
if (Convert.ToBoolean(xNode.Attributes["IsShow"].Value))
{
t.Nodes.Add(new System.Windows.Forms.TreeNode(xNode.Attributes["Title"].Value));
j++;
}
}
else
{
t.Nodes.Add(new System.Windows.Forms.TreeNode(xNode.Attributes["Title"].Value));
t.Nodes[j].Checked = Convert.ToBoolean(xNode.Attributes["IsShow"].Value);
j++;
} if (Convert.ToBoolean(xNode.Attributes["Is2ndSite"].Value))
t.Nodes[j].BackColor = System.Drawing.Color.Yellow;
t.Nodes[j].Tag = xNode.Attributes["id"].Value;
AddTreeNode(xNode, t.Nodes[j], IsAdministrator);
}
}问题采用上面的办法解决了,谢谢各位!