Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的树节点选择问题_C#_Winforms_Treeview - Fatal编程技术网

C# C语言中的树节点选择问题

C# C语言中的树节点选择问题,c#,winforms,treeview,C#,Winforms,Treeview,每当我在树节点文本之外单击时,在控件部分,它就会触发一个节点单击事件,但不会高亮显示该节点。我不确定为什么会发生这种情况 我希望在单击时选择节点-当您单击节点文本时-而不是空格-我只假设节点宽度达到整个树节点?我有dock.fill模式上的树视图,如果这与此有关-我尝试了所有方法,但无法使其正确运行 也许有人会知道发生了什么 更新: 如果e.Location.IsEmpty { 似乎工作得更好——但仍然在没有文本的空白的地方选择节点——显然,节点宽度在整个树视图中延伸,似乎是 有没有更好的方法来

每当我在树节点文本之外单击时,在控件部分,它就会触发一个节点单击事件,但不会高亮显示该节点。我不确定为什么会发生这种情况

我希望在单击时选择节点-当您单击节点文本时-而不是空格-我只假设节点宽度达到整个树节点?我有dock.fill模式上的树视图,如果这与此有关-我尝试了所有方法,但无法使其正确运行

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

更新: 如果e.Location.IsEmpty {

似乎工作得更好——但仍然在没有文本的空白的地方选择节点——显然,节点宽度在整个树视图中延伸,似乎是

有没有更好的方法来实现我的目标?或者这是最好的方法

更新:之前的想法不起作用-叹气-我以为它成功了,但它没有

新问题:我认为部分问题与我从treeview切换到现在的焦点有关

更新-

关于在beforeSelect事件中禁用鼠标右键单击选择节点,我想到的唯一代码是

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

            }

但它不起作用-非常感谢任何帮助-请遵循“唯一答案”的建议,以了解更多详细信息。

您应该使用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);
    }
}

您应该使用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);
    }
}


使用.AfterSelect和/或.BeforeSelect事件来处理选择过程,而不是.Click事件。这样,只有当您单击文本时,它才会选择节点,并且当您单击空白处时,它不会触发.AfterSelect或.BeforeSelect。

使用.AfterSelect和/或.BeforeSelect事件来处理选择过程g而不是.Click事件。然后,只有当您单击文本时,它才会选择节点,而当您单击空白处时,它不会触发.AfterSelect或.beforesect。

据我所知,您只需选中Selected并从事件处理程序返回,如果它为空,则可能重复-我认为此问题的答案将解决您的问题m、 NodeMouseClick事件很早就触发了,让代码有机会用它做一些有意义的事情。其中一个内置的事件只有在文本被单击时才有意义。你几乎总是想要AfterSelect事件,最后一个触发的事件。看看Cody Gray的回答是“是的”,我查看了帖子Javed-从帖子中似乎有一个包装器处理TreeView中选择事件的方式有问题。我将测试AfterSelect-但我觉得这可能是徒劳的。希望帖子是错误的,您可以在不继承和覆盖右键单击的情况下解决它。如果这是唯一的方法-我将接受重影。据我记忆所及,您可以直接使用它ck Selected并从事件处理程序返回,如果它为空,则可能重复-我认为此问题的答案将解决您的问题。NodeMouseClick事件很早激发,使代码有机会对其执行有意义的操作。其中一个内置的事件只有在单击文本时才有意义。您几乎总是希望使用AfterSelect事件,最后一个触发的事件。看一看Cody Gray的回答是的,我查看了帖子Javed-从帖子上看,包装器在TreeView中处理选择事件的方式似乎有一个小故障。我将测试AfterSelect-但我有一种感觉,这可能是徒劳的。希望帖子是错误的,你可以不必担心就解决它继承和重写右键单击。如果这是唯一的方法-我将接受重影。但我的FullRowSelect属性为false,这是我一开始的想法。你使用WinForms还是其他什么?我使用WinForms TreeView,它在FullRowSelect上显示为false。这似乎是一种执行bool clickedI的更长的方法tem=e.Node.Bounds.Containse.Location;,在NodeMouseClick事件中。谢谢,这使它变得更好-但是,我为TreeControl分配了一个ContextMenuStrip,每当我右键单击以访问它而不使用节点标签时,它都会像以前一样选择一个节点一秒钟,然后返回到第一个节点。尽管我的FullRowSelect属性为false,但是这是我一开始的想法。你使用WinForms还是其他什么?我使用WinForms TreeView,它在FullRowSelect上显示属性为false。这似乎是在NodeMouseClick事件中执行bool clickedItem=e.Node.Bounds.Containse.Location的一种更长的方法。谢谢,这使它变得更好-但是,我有一个ContextMenuStrip分配它会自动切换到TreeControl,每当我右键单击以通过无节点标签访问它时,它会像以前一样选择一个节点一秒钟,然后返回到第一个节点。我会尝试-我只检查了BeforeSelect-如何取消选择事件或通过AfterSelect检查它?EventArgs没有cancel属性?我会尝试-Ionl y检查BeforeSelect-如何取消选择事件或通过AfterSelect检查选择事件?EventArgs没有cancel属性?