【问题标题】:TreeNode Selection Problems in C#C# 中的 TreeNode 选择问题
【发布时间】:2013-08-27 15:00:26
【问题描述】:

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

我希望在单击时选择节点-当您单击节点文本时-而不是空格-我只假设节点宽度达到整个 Treenode?如果这与它有关,我在dock.fill 模式上有Treeview - 我尝试了一切,但无法让它正常运行。

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

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

似乎效果更好-但仍然在没有文本的空白处选择节点-显然节点宽度似乎延伸到整个树视图?

有没有更好的方法来完成我想要的?或者这是最好的方法?

更新:以前的想法行不通-叹气-我以为它做到了,但事实并非如此。

新问题:当我从树视图切换时,我认为部分问题与现在的焦点有关。

更新-

我想出的关于在 beforeSelect 事件上禁用鼠标右键选择节点的唯一代码是

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

            }

但它没有用 - 任何帮助表示赞赏 - 遵循唯一答案的建议,了解更多详细信息。

【问题讨论】:

  • 据我记得你可以检查 Selected 如果它为空则从事件处理程序返回
  • c# - Problem with NodeMouseClick 的可能重复项 - 我认为这个问题的答案将解决您的问题。
  • NodeMouseClick 事件非常提前触发,让代码有机会用它做一些有意义的事情。其中一个内置是“仅在单击文本时才有意义”。您几乎总是想要 AfterSelect 事件,这是最后一个触发的事件。
  • 看看 Cody Gray 给stackoverflow.com/questions/4333093/…的回答
  • 是的,我查看了 Javed 帖子 - 从帖子看来,包装器处理 TreeView 中的选择事件的方式存在故障。我将测试 AfterSelect- 但我觉得它可能是徒劳的。希望帖子是错误的,您可以在不继承和覆盖右键单击的情况下解决它。如果这是唯一的方法——我会忍受鬼魂。

标签: c# winforms treeview


【解决方案1】:

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

【讨论】:

  • 我的 FullRowSelect 属性是假的,这就是我一开始的想法。
  • 你使用 WinForms 还是其他的?
  • 我使用 WinForms TreeView,它在 FullRowSelect 上将属性显示为 false。
  • NodeMouseClick 事件中执行bool clickedItem = e.Node.Bounds.Contains(e.Location); 的方法似乎要长得多。
  • 谢谢,这让它变得更好了——但是,我有一个分配给 TreeControl 的 ContextMenuStrip,每当我右键单击以访问它时(没有节点标签)——它会像以前一样选择一个节点一秒钟然后回到第一个节点。
【解决方案2】:

使用 .AfterSelect 和/或 .BeforeSelect 事件而不是 .Click 事件来处理选择处理。然后它只会在你点击文本时选择节点,当你点击空白时它不会触发 .AfterSelect 或 .BeforeSelect 。

【讨论】:

  • 我会尝试-我只检查了BeforeSelect-您如何取消选择事件或通过AfterSelect检查它? EventArgs 没有取消属性?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
相关资源
最近更新 更多