【问题标题】:C# Stop a Treeview selecting one or more TreeNodesC# 停止选择一个或多个 TreeNode 的 Treeview
【发布时间】:2008-12-18 15:03:03
【问题描述】:

我有一个 TreeView 控件,它以有组织的层次结构显示多个 TreeNode。我想阻止用户选择最高级别的节点(这是通过使用 BeforeSelect 事件实现的)。如果用户选择它们,我还想阻止 TreeView 突出显示顶级节点,即停止 TreeView 更改节点的背景颜色并“选择”它。

我使用的 TreeView 是 WinForms 版本的控件。

以下是我目前尝试使用的源代码:

private void tree_BeforeSelect ( object sender, TreeViewCancelEventArgs e )
{
    if ( e.Node.Level == 0 )
    {
        e.Cancel = true;
    }
}

这确实会取消选择节点,但仅在不希望出现的明显闪烁(~200ms)之后。

【问题讨论】:

    标签: c# winforms treeview treenode


    【解决方案1】:

    此代码防止在取消之前绘制选择:

    private void treeView1_MouseDown(object sender, MouseEventArgs e)
    {
        treeView1.BeginUpdate();
    }
    
    private void treeView1_MouseUp(object sender, MouseEventArgs e)
    {
        treeView1.EndUpdate();
    }
    

    【讨论】:

    • +1 因为这就是我们在 WinForms 下避免闪烁的方式。
    • 这应该是真正的答案!
    • 如果你在 TreeView 上按下鼠标按钮,然后在释放鼠标按钮之前离开它,你的 TreeView 将卡在无法使用的状态...
    【解决方案2】:

    除了现有代码之外,如果您使用代码向 TreeView 上的 MouseDown 事件添加处理程序并使用其位置选择节点,则可以设置节点颜色。

    private void treeView1_MouseDown(object sender, MouseEventArgs e)
    {
        TreeNode tn = treeView1.GetNodeAt(e.Location);
        tn.BackColor = System.Drawing.Color.White;
        tn.ForeColor = System.Drawing.Color.Black;
    }
    

    还有一个小问题,选择轮廓仍然显示在 MouseDown 上,但它至少停止了蓝色背景并让你走得更远。

    HTH

    单次

    【讨论】:

    • 这是一个很好的解决方案,但最好使用Color.FromKnownColor(KnownColor.Window);Color.FromKnownColor(KnownColor.WindowText);
    【解决方案3】:

    如果通过在 BeforeSelect 的事件参数中设置 Cancel 为 true 来取消选择,则不会选择节点,因此背景颜色不会改变。

    【讨论】:

    • 那是错误的。正如您在问题中看到的那样,他正在这样做,但背景颜色仍然会发生变化。
    • 虽然不是很明显。发生的情况是他单击节点,当按钮仍然按下时节点被选中,然后选择被拒绝并且当鼠标按钮上升时节点被取消选择。
    猜你喜欢
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多