首页 > 代码库 > ComboTree

ComboTree

首先,要新建一个组件。

 

 

using System;using System.Collections.Generic;using System.ComponentModel;using System.Diagnostics;using System.Linq;using System.Text;using System.Windows.Forms;using System.Data;namespace BaseControls{    public partial class DMComboTree : ComboBox    {        private bool m_blDropShow = false;        private bool m_blPopupAutoSize = false;        private const int WM_LBUTTONDOWN = 0x201, WM_LBUTTONDBLCLK = 0x203;        private ToolStripControlHost treeHost;        private ToolStripDropDown dropDown;        TreeView vTreeView = new TreeView();        public DMComboTree()        {            //InitializeComponent();        }        public DMComboTree(IContainer container)        {            container.Add(this);                         InitializeComponent();        }        void DrawTree()         {            vTreeView.Scrollable = true;            //下拉框的大小需要调整树的大小来调整。            vTreeView.Height = 200;            vTreeView.NodeMouseDoubleClick -= new TreeNodeMouseClickEventHandler(TreeView_NodeMouseDoubleClick);            vTreeView.NodeMouseDoubleClick += new TreeNodeMouseClickEventHandler(TreeView_NodeMouseDoubleClick);            treeHost = new ToolStripControlHost(vTreeView);            treeHost.AutoSize = true;            dropDown = new ToolStripDropDown();            dropDown.Items.Add(treeHost);        }        protected override void onm ouseClick(MouseEventArgs e)        {            base.OnMouseClick(e);            if (this.Width - e.X < 20)             {                DrawTree();                dropDown.Show(this, 0, this.Height);                vTreeView.ExpandAll();                dropDown.Focus();            }        }        /// <summary>        /// 树形双击事件        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        void TreeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)        {            base.Text = e.Node.Text;            TreeValue = e.Node.Name;            dropDown.Close();        }        string _treeValue = http://www.mamicode.com/null;        public string TreeValue        {            get { return _treeValue; }            set             {                _treeValue = value;                if (TreeValueChanged != null)                 {                    if (TreeValueChanged != null)                     {                        TreeValueChanged(this, new EventArgs());                    }                }            }        }        //protected override void WndProc(ref Message m)        //{        //    if (m.Msg == WM_LBUTTONDBLCLK || m.Msg == WM_LBUTTONDOWN)        //    {        //        if (m_blDropShow)        //        {        //            m_blDropShow = false;        //        }        //        else        //        {        //            m_blDropShow = true;        //        }        //        if (m_blDropShow)        //        {        //            DrawTree();        //            dropDown.Show(this, 0, this.Height);        //        }        //        else        //        {        //            dropDown.Close();        //        }        //        return;        //    }        //    base.WndProc(ref m);        //}        public void BindTree(DataTable vDt)         {            var q = from b in vDt.AsEnumerable() where b.Field<Int32>("Parent") == 0 select b;            if (q != null && q.Count<DataRow>() > 0)            {                DataTable dt = q.CopyToDataTable<DataRow>();                q = null;                foreach (DataRow dr in dt.Rows)                {                    TreeNode n = new TreeNode();                    n.Name = dr["Id"].ToString();                    n.Text = dr["Name"].ToString();                    BindTree(n, vDt);                    vTreeView.Nodes.Add(n);                }                dt.Dispose();            }                        vDt.Dispose();            //设置一个全部品牌用来取消选择项            TreeNode nullNode = new TreeNode();            nullNode.Name = null;            nullNode.Text = "全部品牌";            vTreeView.Nodes.Insert(0, nullNode);        }        /// <summary>        /// 递归绑定Node        /// </summary>        /// <param name="node"></param>        /// <param name="vDt"></param>        void BindTree(TreeNode node, DataTable vDt)         {            var q = from b in vDt.AsEnumerable() where b.Field<Int32>("Parent") == int.Parse(node.Name) select b;            if (q != null && q.Count<DataRow>() > 0)            {                DataTable dt = q.CopyToDataTable<DataRow>();                q = null;                foreach (DataRow dr in dt.Rows)                {                    TreeNode n = new TreeNode();                    n.Name = dr["Id"].ToString();                    n.Text = dr["Name"].ToString();                    BindTree(n, vDt);                    node.Nodes.Add(n);                }                dt.Dispose();            }        }        public delegate void OnTreeValueChanged(object sender, EventArgs e);        public event OnTreeValueChanged TreeValueChanged;    }}