C#中的TreeNode选择问题

时间:2011-01-15 22:29:39

标签: c# winforms treeview

每当我在树节点文本外部单击时,控制部分就会发生节点单击事件,但不会突出显示该节点。我不确定为什么会这样。

我希望在点击时选择节点 - 当您单击节点文本时 - 而不是空格 - 我只假设节点宽度跨越整个Treenode?我在dock.fill模式下有树视图,如果它与它有关 - 我尝试了一切,但不能让它行为正常。

也许有人会知道发生了什么。

更新: if (e.Location.IsEmpty) {

似乎工作得更好 - 但仍然在没有文本的空白处选择节点 - 显然节点宽度在整个树视图中都是如此?

有没有更好的方法来实现我想要的?或者这是最好的方式?

更新:以前的想法不起作用 - 我认为它做到了,但事实并非如此。

新问题:我认为当我从treeview切换时,问题的一部分与焦点有关。

UPDATE -

我提出的关于禁用鼠标右键单击以选择onSelect事件上的节点的唯一代码是

 if (MouseButtons == System.Windows.Forms.MouseButtons.Right)
            {
                e.Cancel = true;

            }

但它不起作用 - 任何帮助都表示赞赏 - 只有答案的建议,更多细节。

2 个答案:

答案 0 :(得分:3)

您应该使用treeView.HitTest方法来确定单击节点的哪个部分。

private bool IsClickOnText(TreeView treeView, TreeNode node, Point location)
{
    var hitTest = treeView1.HitTest(location);

    return hitTest.Node == node
        && hitTest.Location == TreeViewHitTestLocations.Label;
}

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if(IsClickOnText(treeView1, e.Node, e.Location))
    {
        MessageBox.Show("click");
    }
}

private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
    if (e.Action == TreeViewAction.ByMouse)
    {
        var position = treeView1.PointToClient(Cursor.Position);        
        e.Cancel = !IsClickOnText(treeView1, e.Node, position);
    }
}

答案 1 :(得分:0)

使用.AfterSelect和/或.BeforeSelect事件来处理选择处理而不是.Click事件。然后它将仅在您单击文本时选择节点,并且它不会触发.AfterSelect或.BeforeSelect当您单击空白区域时。