如何以编程方式单击TreeView TreeNode,使其在列表中突出显示并触发AfterSelect事件?

时间:2009-05-08 17:16:47

标签: c# winforms treeview

我在Winforms应用程序中有一个TreeView控件,基本上目标是显示一个包含TreeView控件的表单,我想显示打开节点(easy-EnsureVisible)并选中的表单。

我遇到的问题是,当我设置TreeView控件的SelectedNode属性时,节点没有突出显示,并且AfterSelect事件没有像我期望的那样触发。 AfterSelect的东西很容易编码,但缺乏突出显示很烦人。

7 个答案:

答案 0 :(得分:6)

是因为TreeView没有焦点吗?将TreeView的HideSelection属性设置为False会改变您看到的行为吗?

答案 1 :(得分:5)

设置SelectedNode后。尝试选择treeView。无论如何,为我工作。

private void button1_Click(object sender, EventArgs e)
{
this.treeView1.SelectedNode = this.treeView1.Nodes[1];
this.treeView1.Select();
}

答案 2 :(得分:4)

尝试此操作以使所选节点变为粗体:

selectedNode.NodeFont = new System.Drawing.Font(
    selectedNode.TreeView.Font,
    selectedNode.TreeView.Font.Style | FontStyle.Bold);

// You need to append an emptry string to work around this bug: 
// http://support.microsoft.com/kb/937215
selectedNode.Text += string.Empty;

答案 3 :(得分:0)

通过突出显示,我假设你的意思是使文字变粗。它不像其他一些客户端技术那样优雅,但您可以处理正在更改的节点并使所选节点变为粗体,例如

treeNode.Font = new Font(treeNode.Font, treeNode.Font.Style | treeNode.Bold);

答案 4 :(得分:0)

好吧,我想我很快就会问这个问题。 找到了解决方案:

//clear background
RadTreeNodeCollection nodes = rtrvNetworkAll.Nodes;
foreach (RadTreeNode n in nodes)
{
        this.ClearRecursive(n);
}
//search a node with the build in find function
foreach (RadTreeNode n in nodes)
{
        this.FindRecursive(n);
}

// recursively move through the treeview nodes
private void FindRecursive(RadTreeNode treeNode)
{
        foreach (RadTreeNode tn in treeNode.Nodes)
        {
                // if the text properties match, color the item
                if (tn.Text == this.txtSearch.Text)
                {
                    tn.BackColor = Color.Yellow;
                }
                FindRecursive(tn);
        }
}

private void ClearRecursive(RadTreeNode treeNode)
{
       foreach (RadTreeNode tn in treeNode.Nodes)
       {
                tn.BackColor = Color.White;
                ClearRecursive(tn);
       }
}    

答案 5 :(得分:0)

对我来说,问题是TreeView控件不一定具有焦点,因此所选节点没有显示为突出显示。以下代码对我有用:

treeView.Focus();
treeView.SelectedNode = myTreeNode;

我在为TreeView控件实现一些拖放功能时遇到了这个问题。

答案 6 :(得分:0)

(我发现)以编程方式执行此操作的最简单方法是伪造click事件。我需要这样做,因为当我使用TreeView.Nodes.Find()搜索节点时,需要它在向下的方向上单击层次结构的每个级别。所以我基本上做了以下事情:

tvMyTreeView_NodeMouseClick(tvMyTreeView, new TreeNodeMouseClickEventArgs(myNode, MouseButtons.Left, 1, 0, 0));

哪个触发了我的事件并伪造了myNode节点上的左键单击。在该事件内,您可以设置e.Node的格式,但是您希望为其着色。希望这会有所帮助。