⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dropdowntreeview.cs

📁 VS.net 在WinCE平台下开发的下拉树形组合框
💻 CS
字号:
namespace TrueSoftware.Windows.Forms 
{
	using System;
	using System.Drawing;
	using System.Resources;
	using System.ComponentModel;
	using System.Windows.Forms;

	/// <summary>
	/// DropDownTreeView class offers TreeView that is desined to act under a drop down control
	/// You can use this control when you need to select a value from a dynamic TreeView.
	/// <p>
	/// The sub controls of this control are set to protected. You can override the control
	/// to assign values to the subcontrol of change their behaviour.
	/// </p>
	/// 
	/// </summary>
	public class DropDownTreeView : UserControl
	{
		/// <summary>
		/// protected Button control, this is the control's toggle button
		/// </summary>
		protected ButtonEx btnSelect;
		/// <summary>
		/// protected TextBox control, this is control's value TextBox.
		/// The TextBox's ReadyOnly false is by default set ti true
		/// </summary>
		protected TextBox txtValue;
		/// <summary>
		/// protected TreeView control, this is the control's TreeView.
		/// </summary>
		protected TreeView treeView;

		/// <summary>
		/// protected value that is set to true of false within the
		///  SetTextValueToSelectedNode method.
		/// </summary>
		protected bool TextValueSet;

		/// <summary>
		/// the resize label on the Control's TreeView control
		/// </summary>
		private LabelEx treeLabel;

		/// <summary>
		/// This is the margin in pixels for resizing the TreeView
		/// </summary>
		private int Margin = 10;

		/// <summary>
		/// TreeView's minimum width
		/// </summary>
		private int tvMinWidth=0;

		/// <summary>
		/// TreeView's minimum height
		/// </summary>
		private int tvMinHeight = 150;

		/// <summary>
		/// General point to access MouseMove event for resizing the TreeView
		/// </summary>
		private MouseEventArgs parentMouse;

		/// <summary>
		/// Get TreeNodeCollection collection, Herewith you can add and remove items to the treeview
		/// </summary>
		[
			Description("Gets the TreeView Nodes collection"),
			Category("TreeView")
		]
		public TreeNodeCollection Nodes 
		{
			get 
			{
				return treeView.Nodes;
			}
		}

		/// <summary>
		/// Get,set property that provides the TreeView's Selected Node
		/// </summary>
		[
			Description("Gets or sets the TreeView's Selected Node"),
			Category("TreeView")
		]
		public TreeNode SelectedNode 
		{
			get 
			{
				return treeView.SelectedNode;
			}
			set 
			{
				treeView.SelectedNode = value;
			}
		}

		/// <summary>
		/// Get, set property of boolean type, this property is mapped to the ReadOnly property of the control's TextBox
		/// </summary>
		[
			Description("Gets or sets the TextBox's ReadOnly state"),
			Category("TextBox")
		]
		public bool TextReadOnly
		{
			set
			{
				txtValue.ReadOnly = value;
			}
			get 
			{
				return txtValue.ReadOnly;
			}
		}
		

		/// <summary>
		/// Get, set property thai is mapped to the Control's treeView control's ImageList property.
		/// </summary>
		public ImageList Imagelist 
		{
			get 
			{
				return treeView.ImageList;
			}
			set 
			{
				treeView.ImageList = value;
			}
		}
		/// <summary>
		/// Control's constuctor
		/// </summary>
		public DropDownTreeView() 
		{

			// General
			TextValueSet = false;

			// Initializing Controls
			InitControls();

			// Setting The locations
			SetSizeAndLocation();

			// Adding Controls to UserControl
			this.Controls.AddRange(new Control[]{btnSelect,txtValue,treeView});

			// attaching events
			this.Resize += new EventHandler(ControlResize);
			this.LocationChanged += new EventHandler(ControlResize);

		}

		/// <summary>
		/// Control's resize handler, this handler is attached to the controls Resize and LocationChanged events
		/// </summary>
		/// <param name="sender">sender obcject</param>
		/// <param name="e">default EventArgs</param>
		private void ControlResize(object sender,EventArgs e) 
		{
			// Setting The locations
			SetSizeAndLocation();
		}


		/// <summary>
		/// Controls, sub control initializer, private void that handles the control initialization.
		/// </summary>
		private void InitControls() 
		{
			//value box settings;
			txtValue = new TextBox();
			this.TextReadOnly = true;

			//select button settings
			btnSelect = new ButtonEx();
			//btnSelect.Font = new Font("System",7);
			//btnSelect.Text = "+";
			//btnSelect.TextAlign = ContentAlignment.MiddleCenter;
			//btnSelect.ClientSize = btnSelect.Size;
			btnSelect.Click += new EventHandler(ToggleTreeView);
			//btnSelect.Size = new Size(120,txtValue.Height);


			treeView = new TreeView();
			treeView.BorderStyle = BorderStyle.FixedSingle;
			treeView.Visible = false;
			treeView.AfterSelect += new TreeViewEventHandler(TreeViewNodeSelect);
			treeView.DoubleClick += new EventHandler(TreeViewNodeDoubleClickSelect);
			treeView.MouseMove += new MouseEventHandler(TreeViewMouseMoveEventHandler);
			treeView.Size = new Size(tvMinWidth,tvMinHeight);
			treeLabel = new LabelEx();
			treeLabel.Size = new Size(16,16);
			treeLabel.BackColor = Color.Transparent;
			treeView.Controls.Add(treeLabel);
			SetHotSpot();

			this.SetStyle(ControlStyles.DoubleBuffer,true);
			this.SetStyle(ControlStyles.ResizeRedraw,true);
		}


		/// <summary>
		/// private void for setting the HotSpot helper label.
		/// </summary>
		private void SetHotSpot() 
		{
			treeLabel.Top = treeView.Height - treeLabel.Height;
			treeLabel.Left = treeView.Width - treeLabel.Width;
		}

		/// <summary>
		/// TreeView node select handler, this is a protected event method 
		/// that is attached to the TreeView's AfterSelect event. It sets the 
		/// TextBox's Text property. By default It checks the selected treenode, 
		/// If the treenode dosn't have any child node then, this node's value 
		/// is assigned to the TextBox's Text Property. 
		/// You can implement your own AfterSelect handler by overriding this method.
		/// </summary>
		/// <param name="sender">sender object</param>
		/// <param name="e">default TreeViewEventArgs</param>
		protected void TreeViewNodeSelect(object sender,TreeViewEventArgs e) 
		{
			// chiching for none root node
			if(this.SelectedNode.Nodes.Count == 0) 
			{
				SetTextValueToSelectedNode();
			}
		}


		/// <summary>
		/// This event method is the control's TreeView's DoubleClick event handler.
		/// It is meant to close the TreeView when an item is DoubleClicked.
		/// This function calls the TreeViewNodeSelect event handler method, then if 
		/// the TextValueSet is set to true it toggles (closes) the TreeView
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void TreeViewNodeDoubleClickSelect(object sender,EventArgs e) 
		{
			this.TreeViewNodeSelect(sender,null);
			if(TextValueSet) 
			{
				this.ToggleTreeView(sender,null);
			}
		}
		/// <summary>
		/// private void setting the control's TextBox's Text property.
		/// This method also sets the TextValueSet to true if a value 
		/// is assigned to the TextBox's Text property
		/// </summary>
		private void SetTextValueToSelectedNode() 
		{
			try 
			{
				txtValue.Text = this.SelectedNode.Text;
				TextValueSet = true;
			} 
			catch 
			{
				TextValueSet = false;
			}
		}

		/// <summary>
		/// private event method, this method is attached to the control's Button's Clcick event.
		/// It handles the show/hide of the control's treeview
		/// </summary>
		/// <param name="sender">sender object</param>
		/// <param name="e">default EventArgs</param>
		private void ToggleTreeView(object sender,EventArgs e) 
		{
			if(!treeView.Visible) 
			{

				SetTreeViewSizeAndLocation();
				try 
				{
					this.btnSelect.Text = "-";
					this.Parent.Controls.Add(treeView);
					this.treeView.BringToFront();
					treeView.Visible = true;
					treeView.Select();
					Parent.MouseMove += new MouseEventHandler(ParentMouseMoveHandler);
					if(treeView.Width < this.Width || treeView.Height < this.Height) 
					{
						treeView.Width = tvMinWidth;
						treeView.Height = 150;
						SetHotSpot();
					}

				} 
				catch 
				{
				}
			} 
			else 
			{
				try 
				{
					btnSelect.Text = "+";
					treeView.Visible = false;
					this.Parent.Controls.Remove(treeView);
					Parent.MouseMove -= new MouseEventHandler(ParentMouseMoveHandler);
				} 
				catch 
				{
				}
			}
		}

		private void TreeViewMouseMoveEventHandler(object sender,MouseEventArgs e) 
		{
			this.parentMouse = e;
			SetCursor(Cursors.Default);
		}

		private void ParentMouseMoveHandler(object sender,MouseEventArgs e) 
		{
			int tx,ty;
			this.parentMouse = e;

			tx = treeView.Left + treeView.Width;
			ty = treeView.Top + treeView.Height;

			SetHotSpot();

			if(e.Button == MouseButtons.Left) 
			{
				Margin = 50;
				treeLabel.BringToFront();
			} 
			else 
			{
				Margin = 4;
			}

			if ((is_in_range(e.Y,ty-Margin,ty+Margin)) && is_in_range(e.X,tx-Margin,tx+Margin) ) 
			{
				SetCursor(Cursors.SizeNWSE);
				if(e.Button == MouseButtons.Left) 
				{
					treeView.Height = e.Y - treeView.Top;
					treeView.Width = e.X - treeView.Left;
				} 
			}
			else 
			{
				SetCursor(Cursors.Default);
			}
		}

		private void SetCursor(Cursor crs) 
		{
			treeView.Cursor = crs;
			Parent.Cursor = crs;
		}

		private bool is_in_range(int rvalue,int start,int end) 
		{
			if((rvalue >= start) && (rvalue <= end)) 
			{
				return true;
			} 
			else 
			{
				return false;
			}
		}

		/// <summary>
		/// 
		/// </summary>
		public void SetTreeViewMinimumSize() 
		{
			if((treeView.Width < this.Width) || (treeView.Height < 150)) 
			{
				treeView.Width = this.Width;
				treeView.Height = 150;
			}
		}

		/// <summary>
		/// private method sets the control's TreeView's size and location.
		/// It is called when the control is resized to moved from it's place
		/// </summary>
		private void SetTreeViewSizeAndLocation() 
		{
			if(treeView != null) 
			{			
				treeView.Location = new Point(this.Left,this.Top + this.Height+1);
			} 
		}

		/// <summary>
		/// private method, sets the controls size and location. 
		/// It sets the control's and sub control's sizes and locations
		/// </summary>
		private void SetSizeAndLocation() 
		{
			tvMinWidth = this.Width;
			if(txtValue != null && btnSelect != null) 
			{
				btnSelect.Size = new Size(txtValue.Height,18);
				txtValue.Width = this.Width - btnSelect.Width - 4;
				txtValue.Location = new Point(0,0);
				btnSelect.Left = txtValue.Width + 4;
				SetTreeViewSizeAndLocation();
				this.Height = txtValue.Height;
			}
		}
	}


	/// <summary>
	/// Extended Label control with user paint.
	/// </summary>
	public class LabelEx : Label 
	{
		/// <summary>
		/// 
		/// </summary>
		public LabelEx() 
		{
			this.SetStyle(ControlStyles.UserPaint,true);
			this.SetStyle(ControlStyles.DoubleBuffer,true);
			this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="e"></param>
		protected override void OnPaint(PaintEventArgs e) 
		{
			base.OnPaint(e);
			System.Windows.Forms.ControlPaint.DrawSizeGrip(e.Graphics,Color.Black, 0,0,16,16);
		}
	}


	/// <summary>
	/// Extended button control with userpaint
	/// </summary>
	public class ButtonEx : Button 
	{
		ButtonState state;

		/// <summary>
		/// 
		/// </summary>
		public ButtonEx() 
		{
			this.SetStyle(ControlStyles.UserPaint,true);
			this.SetStyle(ControlStyles.DoubleBuffer,true);
			this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="e"></param>
		protected override void OnMouseDown(MouseEventArgs e) 
		{
			state = ButtonState.Pushed;
			base.OnMouseDown(e);
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="e"></param>
		protected override void OnMouseUp(MouseEventArgs e) 
		{
			state = ButtonState.Normal;
			base.OnMouseUp(e);
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="e"></param>
		protected override void OnPaint(PaintEventArgs e) 
		{
			base.OnPaint(e);
			System.Windows.Forms.ControlPaint.DrawComboButton(e.Graphics,0,0,this.Width,this.Height,state);
		}
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -