zoukankan      html  css  js  c++  java
  • 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 OnMouseClick(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 = 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;
        }
    }
  • 相关阅读:
    String类型和包装类型作为参数传递时,是属于值传递还是引用传递呢?
    RPC 框架
    大型分布式电商系统架构演进史?
    框架演变
    SSM和springboot对比
    什么是微服务,SpringBoot和SpringCloud的关系和区别
    Springboot,SSM及SSH的概念、优点、区别及缺点
    Spring Cloud 和dubbo
    LeetCode 048 Rotate Image
    LeetCode 047 Permutations II
  • 原文地址:https://www.cnblogs.com/wpcnblog/p/3899471.html
Copyright © 2011-2022 走看看