为什么我的自定义TreeNode与我的自定义TreeView不匹配?

时间:2019-06-19 10:39:04

标签: c# winforms

我已自定义TreeNodeTreeView,因为我的TreeView具有普通复选框TreeNode和自定义的TreeNode,其中包含组合框。我的树视图是可滚动的,但是当我向下滚动时,带有组合框的TreeNode不会与树视图一起滚动。为什么?

示例:

see the example

MyTreeNode具有ComboBox属性:

 public ComboBox ComboBox
        {
            get
            {
                likelihood.DropDownStyle = ComboBoxStyle.DropDownList;
                return likelihood;
            }
            set
            {
                likelihood = value;
                likelihood.DropDownStyle = ComboBoxStyle.DropDownList;
            }
        }

MyTreeView具有此方法:

protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e)
        {                
            if (e.Node is MyTreeNode)
            {
                myTreeNode = (MyTreeNode)e.Node;
                Controls.Add(myTreeNode.ComboBox);
                myTreeNode.ComboBox.SetBounds(myTreeNode.Bounds.X, myTreeNode.Bounds.Y, myTreeNode.Bounds.Width + 25, myTreeNode.Bounds.Height);   

                myTreeNode.ComboBox.Show();
            }
        }

MyTreeView是在两个事件(AfterCheckDrawNode)上“注册”的,属性DrawModeOwnerDrawAll

谢谢

1 个答案:

答案 0 :(得分:0)

这是预期的行为。 TreeView对ComboBox一无所知,并且在滚动时不会同步其位置。您应该手动进行同步。

除了在显示时立即计算ComboBox边界外,还应该在TreeView滚动事件和节点展开/折叠事件后重新定位ComboBox。

要处理展开/折叠,您应覆盖OnAfterExpandOnAfterCollapse

处理滚动事件不是一件容易的事,因为TreeView不会公开滚动事件。但这是可行的,这是来自MSDN社区问答的一个示例:treeview scrollbar event (detecting/controlling)