本帖最后由 caozhy 于 2012-10-03 12:45:30 编辑

解决方案 »

  1.   

    其实自从WPF出现后,自定义控件就应该全交给WPF来完成了,这种功能的控件在WPF里面就是小儿科的实现,基础中的基础,虽然WPF的控件没有WinForm那么强大,但是WPF允许自定义控件,很容易将各个简单的控件拼凑成一个非常强大的复杂控件,而且做好的控件还可以被直接调用到WinForm中使用。
      

  2.   

    哗,中秋国庆都不休息啊,还发原创帖啊
    不过,说真的,这个功能真的很少用到,甚至没见过
    WinXP的Explorer.exe的地址栏也不是Combobox+TreeView,虽然有点像
      

  3.   

    一个UserControl,里面放一个Combobox和TreeView
    然后在下拉和收缩时控制TreeView显示隐蔽行不行呢
      

  4.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();            ComboTree MyComboTree = new ComboTree();
                this.Controls.Add(MyComboTree);
            }
        }    public class ComboTree : UserControl
        {
            private System.Windows.Forms.TreeView treeView1;
            private System.Windows.Forms.TextBox textBox1;
            private System.Windows.Forms.Button button1;
            private System.Windows.Forms.Panel panel1;        /// <summary> 
            /// 设计器支持所需的方法 - 不要
            /// 使用代码编辑器修改此方法的内容。
            /// </summary>
            private void InitializeComponent()
            {
                System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("节点0");
                System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("节点3");
                System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("节点4");
                System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("节点7");
                System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("节点8");
                System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("节点9");
                System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("节点5", new System.Windows.Forms.TreeNode[] {
                treeNode4,
                treeNode5,
                treeNode6});
                System.Windows.Forms.TreeNode treeNode8 = new System.Windows.Forms.TreeNode("节点6");
                System.Windows.Forms.TreeNode treeNode9 = new System.Windows.Forms.TreeNode("节点1", new System.Windows.Forms.TreeNode[] {
                treeNode2,
                treeNode3,
                treeNode7,
                treeNode8});
                System.Windows.Forms.TreeNode treeNode10 = new System.Windows.Forms.TreeNode("节点2");
                this.treeView1 = new System.Windows.Forms.TreeView();
                this.textBox1 = new System.Windows.Forms.TextBox();
                this.button1 = new System.Windows.Forms.Button();
                this.panel1 = new System.Windows.Forms.Panel();
                this.panel1.SuspendLayout();
                this.SuspendLayout();
                // 
                // treeView1
                // 
                this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill;
                this.treeView1.Location = new System.Drawing.Point(0, 23);
                this.treeView1.Name = "treeView1";
                treeNode1.Name = "节点0";
                treeNode1.Text = "节点0";
                treeNode2.Name = "节点3";
                treeNode2.Text = "节点3";
                treeNode3.Name = "节点4";
                treeNode3.Text = "节点4";
                treeNode4.Name = "节点7";
                treeNode4.Text = "节点7";
                treeNode5.Name = "节点8";
                treeNode5.Text = "节点8";
                treeNode6.Name = "节点9";
                treeNode6.Text = "节点9";
                treeNode7.Name = "节点5";
                treeNode7.Text = "节点5";
                treeNode8.Name = "节点6";
                treeNode8.Text = "节点6";
                treeNode9.Name = "节点1";
                treeNode9.Text = "节点1";
                treeNode10.Name = "节点2";
                treeNode10.Text = "节点2";
                this.treeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
                treeNode1,
                treeNode9,
                treeNode10});
                this.treeView1.Size = new System.Drawing.Size(380, 273);
                this.treeView1.TabIndex = 1;
                this.treeView1.Visible = false;
                this.treeView1.VisibleChanged += new System.EventHandler(this.treeView1_VisibleChanged);
                this.treeView1.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseClick);
                // 
                // textBox1
                // 
                this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                            | System.Windows.Forms.AnchorStyles.Right)));
                this.textBox1.BackColor = System.Drawing.Color.White;
                this.textBox1.Location = new System.Drawing.Point(0, 2);
                this.textBox1.Name = "textBox1";
                this.textBox1.ReadOnly = true;
                this.textBox1.Size = new System.Drawing.Size(347, 21);
                this.textBox1.TabIndex = 2;
                // 
                // button1
                // 
                this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
                this.button1.Location = new System.Drawing.Point(350, 3);
                this.button1.Name = "button1";
                this.button1.Size = new System.Drawing.Size(30, 20);
                this.button1.TabIndex = 3;
                this.button1.Text = "↓";
                this.button1.UseVisualStyleBackColor = true;
                this.button1.Click += new System.EventHandler(this.button1_Click);
                // 
                // panel1
                // 
                this.panel1.Controls.Add(this.textBox1);
                this.panel1.Controls.Add(this.button1);
                this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
                this.panel1.Location = new System.Drawing.Point(0, 0);
                this.panel1.Name = "panel1";
                this.panel1.Size = new System.Drawing.Size(380, 23);
                this.panel1.TabIndex = 4;
                // 
                // ComboTree
                // 
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
                this.Controls.Add(this.treeView1);
                this.Controls.Add(this.panel1);
                this.Name = "ComboTree";
                this.Size = new System.Drawing.Size(380, 296);
                this.panel1.ResumeLayout(false);
                this.panel1.PerformLayout();
                this.ResumeLayout(false);        }        public ComboTree()
            {
                InitializeComponent();            this.DoubleBuffered = true;
                treeView1.Visible = false;
            }        private void button1_Click(object sender, EventArgs e)
            {
                treeView1.Visible = !treeView1.Visible;
            }        private void treeView1_VisibleChanged(object sender, EventArgs e)
            {
                if (treeView1.Visible)
                {
                    this.Height = panel1.Height + treeView1.Height;
                }
                else
                {
                    this.Height = panel1.Height;
                }
            }        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
            {
                if (e.Node.Bounds.Contains(e.Location))
                {
                    textBox1.Text = e.Node.Text;
                    treeView1.Visible = false;
                }
            }
        }
    }
    只会简单的方法
      

  5.   

    这个有两种简单的实现方法:
    1 隐藏一个显示所有节点的大小的Treeview,在Combobox_DrawItem时遍历节点项,或者直接TreeViewer.DrawToBitmap2 纯代码绘制出一个TreeView我个人的实现方法(使用自定义控件,这个自定义控件不会接收焦点,但会响应鼠标事件,不会导致焦点抢占,内容绘制,使得整个自定义控件的显示内容是画上去的,只是通过实现鼠标交互来达到交互效果。其次,在展开自定义控件时,通过设置父窗体矩形,但不影响父窗体显示内容及背景来实现)。
      

  6.   

    MARK一下,等假期过来再好好研究研究!
      

  7.   

    OK
    ,Mark 了,慢慢学习。