id pid txt
1 0 中国
2 0 日本
3 1 江西省
4 3 南昌
5 3 九江
6 4 中山街
7 4 女人街
8 1 福建省
9 8 福州
10 9 厦门
11 2 东京
----------------------------------------------------------
已知 ID=6 ,PID=4 ,如何只展开ID=6 相关的节点,其它节点都是关闭的,并把焦点定在ID=6节点上。如
[-]中国
| |---[-]江西省
| | |---[-]南昌
| | | |-----中山路 <---id=6,要展开此节点,并把焦点定在这里
| | | |-----女人街
| | |---[+]九江
| |---[+]福建省
┕[+]日本
TreeView中,已知某子节点的ID,怎样使该节点选中并展开?
简单改一下,应该可以实现你的要求
//
// 选中节点
//
private void SetNodeSelected(TreeNode node)
{
//
// 把当前节点所有父节点展开
//
TreeNode tempNode = node;
while (tempNode.Parent is TreeNode)
{
((TreeNode)tempNode.Parent).Expanded = true;
tempNode = (TreeNode)tempNode.Parent;
}
//
// 把当前节点设置树的选中节点
//
TreeView1.SelectedNodeIndex = node.GetNodeIndex();
}
或者
/// <summary>
/// 查找树中指定节点,并展开,至于选中看楼上的吧
/// 假设查找条件在TreeNode.Tag里
/// </summary>
/// <param name="tree">要查找的树</param>
/// <param name="ID">要指定的条件</param>
public void FindNode(TreeNode tree,int ID)
{
if((int)tree.Tag == ID)
{
tree.Expand();
}
else
{
foreach(TreeNode node in tree.Nodes)
{
FindNode(node,ID);
}
}
}
up
private string FindInTree()
{
string strIndex = "0";
foreach (TreeNode tn in TreeView1.Nodes)
{
if (tn.Text != "Node5")
{
strIndex = FindInTree(tn);
}
else
{
strIndex = tn.GetNodeIndex();
return strIndex;
}
}
return strIndex;
}
private string FindInTree(TreeNode objTreeNode)
{
string strIndex = "0";
foreach (TreeNode tn in objTreeNode.Nodes)
{
if (tn.Text != "Node5")
{
strIndex = FindInTree(tn);
if (strIndex.Length > 1)
{
return strIndex;
}
}
else
{
strIndex = tn.GetNodeIndex();
return strIndex;
}
}
return strIndex;
}
private void ExpandTree(string strIndex)
{
string[] aryTemp;
string strTemp = "" ;
if (strIndex.Trim().Length > 0)
{
aryTemp = strIndex.Split(new Char[]{.});
for (int i = 0; i < aryTemp.Length; i++)
{
strTemp = "";
for (int j = 0; j <= i; j++)
{
strTemp = strTemp + aryTemp[j] + ".";
}
strTemp = strTemp.Substring(0,strTemp.Length - 1);
TreeView1.SelectedNodeIndex = strTemp;
TreeView1.GetNodeFromIndex(strTemp).Expanded = true;
}
}
}
执行ExpandTree(FindInTree());即可。
替换程序中的"Node5"为你的"中山街"。
绝对原创,保证能用。
优化了一下算法,呵呵。
执行FindInTree("中山路");即可。
private void FindInTree(string strNodeName)
{
foreach (TreeNode tn in TreeView1.Nodes)
{
if (tn.Text != strNodeName)
{
FindInTree(tn,strNodeName);
}
else
{
ExpandTree(tn);
return;
}
}
}
private void FindInTree(TreeNode objTreeNode,string strNodeName)
{
foreach (TreeNode tn in objTreeNode.Nodes)
{
if (tn.Text != strNodeName)
{
FindInTree(tn,strNodeName);
}
else
{
ExpandTree(tn);
return;
}
}
}
private void ExpandTree(TreeNode objTreeNode)
{
string strIndex = "0";
objTreeNode.Expanded = true;
strIndex = objTreeNode.GetNodeIndex();
while (objTreeNode.Parent is TreeNode)
{
objTreeNode = ((TreeNode)objTreeNode.Parent);
objTreeNode.Expanded = true;
}
TreeView1.SelectedNodeIndex = strIndex;
}