首先,C#里面的TreeNode有curNode.NextNode获取下一个节点的方法,但前提是获取的兄弟节点(即同级节点),最后一个节点返回的是null。
而我们一般查找TreeView里面的节点后,下一节点一般指视图上的下一个节点,若与当前节点同一级则是取下一个兄弟节点;若是最后1个节点,则需返回母节点的兄弟节点。
居然,网上还没类似的方案,只有自己动手解决了。
解决方案如下:
public TreeNode GetNextNode(TreeNode curNode)
{
if (curNode == null) return null;
if (curNode.Nodes.Count > 0)
{
return curNode.FirstNode; //1.返回自己的子节点优先
}
else //2.返回自己的兄弟节点
{
if (curNode.NextNode != null)
{
return curNode.NextNode;
}
else //3.返回 父节点的兄弟节点
{
while (curNode.Parent != null)
{
curNode = curNode.Parent;
if (curNode.NextNode != null) return curNode.NextNode;
}
}
}
return null;
}
测试:
private void button1_Click(object sender, EventArgs e)
{
treeview1.SelectedNode = GetNextNode(treeview1.SelectedNode);
if (treeview1.SelectedNode != null)
{
treeview1.SelectedNode.BackColor = Color.Red;
}
}
//把查找下一个的代码也Mark一下,免得下次找不到
public static bool Contains(string sourceStr, string subStr, StringComparison comp)
{
return sourceStr.IndexOf(subStr, comp) >= 0;
}
public void FindNextNode(TreeView curTreeView, TreeNode curNode, string strValue)
{
if (string.IsNullOrEmpty(strValue))
{
// MessageBox.Show("查找内容为空,请重新设置。");
return;
}
curNode = ClsCommon.GetNextNode(curTreeView.SelectedNode);
// 忽略大小写
while (curNode != null && !ClsCommon.Contains(curNode.Text, strValue, StringComparison.CurrentCultureIgnoreCase))
{
curNode = ClsCommon.GetNextNode(curNode);
}
if (curNode != null)
{
curTreeView.SelectedNode = curNode;
curNode.BackColor = Color.YellowGreen; //改变查找的节点背景色showNodes(tn);
this.Hide();
// this.Close();
return;
}
MessageBox.Show("没有匹配项。");
}
测试:
private void btn_next_Click(object sender, EventArgs e)
{
FindNextNode(tv_psiSi, tv_psiSi.SelectedNode, findText);
}