自定义控件之带有树型控件的下拉列表框

时间:2020-12-25 12:01:28
效果图如下:
自定义控件之带有树型控件的下拉列表框


代码如下:
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框Public   Delegate   Sub NodeSelectEventHandler() Sub NodeSelectEventHandler()
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框
Public Class ComboBoxTreeClass ComboBoxTree
自定义控件之带有树型控件的下拉列表框    
Inherits UserControl
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框    
Private pnlBack As Panel
自定义控件之带有树型控件的下拉列表框    
Private pnlTree As Panel
自定义控件之带有树型控件的下拉列表框    
Private tbSelectedValue As TextBox
自定义控件之带有树型控件的下拉列表框    
Private btnSelect As ButtonEx
自定义控件之带有树型控件的下拉列表框    
Private tvTreeView As TreeView
自定义控件之带有树型控件的下拉列表框    
Private lblSizingGrip As LabelEx
自定义控件之带有树型控件的下拉列表框    
Private frmTreeView As Form
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框    
Private _branchSeparator As String
自定义控件之带有树型控件的下拉列表框    
Private _absoluteChildrenSelectableOnly As Boolean
自定义控件之带有树型控件的下拉列表框    
Private DragOffset As System.Drawing.Point
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框    
Public ReadOnly Property Nodes()Property Nodes() As TreeNodeCollection
自定义控件之带有树型控件的下拉列表框        
Get
自定义控件之带有树型控件的下拉列表框            
Return Me.tvTreeView.Nodes
自定义控件之带有树型控件的下拉列表框        
End Get
自定义控件之带有树型控件的下拉列表框    
End Property

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框    
Public WriteOnly Property SelectedNode()Property SelectedNode() As TreeNode
自定义控件之带有树型控件的下拉列表框        
Set(ByVal value As TreeNode)
自定义控件之带有树型控件的下拉列表框            
Me.tvTreeView.SelectedNode = value
自定义控件之带有树型控件的下拉列表框        
End Set
自定义控件之带有树型控件的下拉列表框    
End Property

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框    
Public Overrides Property text()Property text() As String
自定义控件之带有树型控件的下拉列表框        
Get
自定义控件之带有树型控件的下拉列表框            
Return Me.tbSelectedValue.Text
自定义控件之带有树型控件的下拉列表框        
End Get
自定义控件之带有树型控件的下拉列表框        
Set(ByVal value As String)
自定义控件之带有树型控件的下拉列表框            
Me.tbSelectedValue.Text = value
自定义控件之带有树型控件的下拉列表框        
End Set
自定义控件之带有树型控件的下拉列表框    
End Property

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框    
Public Property BranchSeparator()Property BranchSeparator() As String
自定义控件之带有树型控件的下拉列表框        
Get
自定义控件之带有树型控件的下拉列表框            
Return Me._branchSeparator
自定义控件之带有树型控件的下拉列表框        
End Get
自定义控件之带有树型控件的下拉列表框        
Set(ByVal value As String)
自定义控件之带有树型控件的下拉列表框            
If value.Length > 0 Then Me._branchSeparator = value
自定义控件之带有树型控件的下拉列表框        
End Set
自定义控件之带有树型控件的下拉列表框    
End Property

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框    
Public Property AbsoluteChildrenSelectableOnly()Property AbsoluteChildrenSelectableOnly() As Boolean
自定义控件之带有树型控件的下拉列表框        
Get
自定义控件之带有树型控件的下拉列表框            
Return Me._absoluteChildrenSelectableOnly
自定义控件之带有树型控件的下拉列表框        
End Get
自定义控件之带有树型控件的下拉列表框        
Set(ByVal value As Boolean)
自定义控件之带有树型控件的下拉列表框            
Me._absoluteChildrenSelectableOnly = value
自定义控件之带有树型控件的下拉列表框        
End Set
自定义控件之带有树型控件的下拉列表框    
End Property

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框    
Public Sub New()Sub New()
自定义控件之带有树型控件的下拉列表框        InitializeComponent()
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框        
Me.pnlBack = New Panel
自定义控件之带有树型控件的下拉列表框        
Me.pnlBack.BorderStyle = Windows.Forms.BorderStyle.Fixed3D
自定义控件之带有树型控件的下拉列表框        
Me.pnlBack.BackColor = Color.White
自定义控件之带有树型控件的下拉列表框        
Me.pnlBack.AutoScroll = False
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框        
Me.tbSelectedValue = New TextBox
自定义控件之带有树型控件的下拉列表框        
Me.tbSelectedValue.BorderStyle = Windows.Forms.BorderStyle.None
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框        
Me.btnSelect = New ButtonEx
自定义控件之带有树型控件的下拉列表框        
AddHandler Me.btnSelect.Click, AddressOf Me.ToggleTreeView
自定义控件之带有树型控件的下拉列表框        
Me.btnSelect.FlatStyle = FlatStyle.Flat
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框        
Me.lblSizingGrip = New LabelEx
自定义控件之带有树型控件的下拉列表框        
Me.lblSizingGrip.Size = New Size(99)
自定义控件之带有树型控件的下拉列表框        
Me.lblSizingGrip.BackColor = Color.Transparent
自定义控件之带有树型控件的下拉列表框        
Me.lblSizingGrip.Cursor = Cursors.SizeNWSE
自定义控件之带有树型控件的下拉列表框        
AddHandler Me.lblSizingGrip.MouseMove, AddressOf Me.SizingGripMouseMove
自定义控件之带有树型控件的下拉列表框        
AddHandler Me.lblSizingGrip.MouseDown, AddressOf Me.SizingGripMouseDown
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框        
Me.tvTreeView = New TreeView
自定义控件之带有树型控件的下拉列表框        
Me.tvTreeView.BorderStyle = Windows.Forms.BorderStyle.None
自定义控件之带有树型控件的下拉列表框        
AddHandler Me.tvTreeView.DoubleClick, AddressOf Me.TreeViewNodeSelect
自定义控件之带有树型控件的下拉列表框        
Me.tvTreeView.Location = New Point(00)
自定义控件之带有树型控件的下拉列表框        
AddHandler Me.tvTreeView.LostFocus, AddressOf Me.TreeViewLostFocus
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框        
Me.frmTreeView = New Form
自定义控件之带有树型控件的下拉列表框        
Me.frmTreeView.FormBorderStyle = FormBorderStyle.None
自定义控件之带有树型控件的下拉列表框        
Me.frmTreeView.StartPosition = FormStartPosition.Manual
自定义控件之带有树型控件的下拉列表框        
Me.frmTreeView.ShowInTaskbar = False
自定义控件之带有树型控件的下拉列表框        
Me.frmTreeView.BackColor = System.Drawing.SystemColors.Control
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框        
Me.pnlTree = New Panel
自定义控件之带有树型控件的下拉列表框        
Me.pnlTree.BorderStyle = Windows.Forms.BorderStyle.FixedSingle
自定义控件之带有树型控件的下拉列表框        
Me.pnlTree.BackColor = Color.White
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框        
Me.pnlTree.Controls.Add(Me.lblSizingGrip)
自定义控件之带有树型控件的下拉列表框        
Me.pnlTree.Controls.Add(Me.tvTreeView)
自定义控件之带有树型控件的下拉列表框        
Me.frmTreeView.Controls.Add(Me.pnlTree)
自定义控件之带有树型控件的下拉列表框        
Me.pnlBack.Controls.AddRange(New Control() {btnSelect, tbSelectedValue})
自定义控件之带有树型控件的下拉列表框        
Me.Controls.Add(Me.pnlBack)
自定义控件之带有树型控件的下拉列表框    
End Sub

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框    
Private Sub RelocateGrip()Sub RelocateGrip()
自定义控件之带有树型控件的下拉列表框        
Me.lblSizingGrip.Top = Me.frmTreeView.Height - Me.lblSizingGrip.Height - 1
自定义控件之带有树型控件的下拉列表框        
Me.lblSizingGrip.Left = Me.frmTreeView.Width - Me.lblSizingGrip.Width - 1
自定义控件之带有树型控件的下拉列表框    
End Sub

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框    
Private Sub ToggleTreeView()Sub ToggleTreeView(ByVal sender As ObjectByVal e As EventArgs)
自定义控件之带有树型控件的下拉列表框        
If Not Me.frmTreeView.Visible Then
自定义控件之带有树型控件的下拉列表框            
Dim CBRect As Rectangle = Me.RectangleToScreen(Me.ClientRectangle)
自定义控件之带有树型控件的下拉列表框            
Me.frmTreeView.Location = New Point(CBRect.X, CBRect.Y + Me.pnlBack.Height)
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框            
Me.frmTreeView.Show()
自定义控件之带有树型控件的下拉列表框            
Me.frmTreeView.BringToFront()
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框            
Me.RelocateGrip()
自定义控件之带有树型控件的下拉列表框        
Else
自定义控件之带有树型控件的下拉列表框            
Me.frmTreeView.Hide()
自定义控件之带有树型控件的下拉列表框        
End If
自定义控件之带有树型控件的下拉列表框    
End Sub

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框    
Public Function ValidateTest()Function ValidateTest() As Boolean
自定义控件之带有树型控件的下拉列表框        
Dim ValidatorText As String = Me.text
自定义控件之带有树型控件的下拉列表框        
Dim TNC As TreeNodeCollection = Me.tvTreeView.Nodes
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框        
For i As Integer = 0 To ValidatorText.Split(Me._branchSeparator.ToCharArray).Length
自定义控件之带有树型控件的下拉列表框            
Dim NodeFound As Boolean = False
自定义控件之带有树型控件的下拉列表框            
Dim NodeToFind As String = ValidatorText.Split(Me._branchSeparator.ToCharArray())(i)
自定义控件之带有树型控件的下拉列表框            
For j As Integer = 0 To TNC.Count
自定义控件之带有树型控件的下拉列表框                
If TNC(j).Text = NodeToFind Then
自定义控件之带有树型控件的下拉列表框                    NodeFound 
= True
自定义控件之带有树型控件的下拉列表框                    TNC 
= TNC(j).Nodes
自定义控件之带有树型控件的下拉列表框                    
Exit For
自定义控件之带有树型控件的下拉列表框                
End If
自定义控件之带有树型控件的下拉列表框            
Next
自定义控件之带有树型控件的下拉列表框            
If Not NodeFound Then Return False
自定义控件之带有树型控件的下拉列表框        
Next
自定义控件之带有树型控件的下拉列表框        
Return True
自定义控件之带有树型控件的下拉列表框    
End Function

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框    
Private Sub SizingGripMouseMove()Sub SizingGripMouseMove(ByVal sender As ObjectByVal e As MouseEventArgs)
自定义控件之带有树型控件的下拉列表框        
If e.Button = Windows.Forms.MouseButtons.Left Then
自定义控件之带有树型控件的下拉列表框            
Dim TvWidth, TvHeight As Integer
自定义控件之带有树型控件的下拉列表框            TvWidth 
= Windows.Forms.Cursor.Position.X - Me.frmTreeView.Location.X : TvWidth = TvWidth + Me.DragOffset.X
自定义控件之带有树型控件的下拉列表框            TvHeight 
= Windows.Forms.Cursor.Position.Y - Me.frmTreeView.Location.Y : TvHeight = TvHeight + Me.DragOffset.Y
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框            
If TvWidth < 50 Then TvWidth = 50
自定义控件之带有树型控件的下拉列表框            
If TvHeight < 50 Then TvHeight = 50
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框            
Me.frmTreeView.Size = New Size(TvWidth, TvHeight)
自定义控件之带有树型控件的下拉列表框            
Me.pnlBack.Size = Me.frmTreeView.Size
自定义控件之带有树型控件的下拉列表框            
Me.tvTreeView.Size = New Size(Me.frmTreeView.Size.Width - Me.lblSizingGrip.Width, Me.frmTreeView.Size.Height - Me.lblSizingGrip.Width)
自定义控件之带有树型控件的下拉列表框            RelocateGrip()
自定义控件之带有树型控件的下拉列表框        
End If
自定义控件之带有树型控件的下拉列表框    
End Sub

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框    
Private Sub SizingGripMouseDown()Sub SizingGripMouseDown(ByVal sender As ObjectByVal e As MouseEventArgs)
自定义控件之带有树型控件的下拉列表框        
If e.Button = Windows.Forms.MouseButtons.Left Then
自定义控件之带有树型控件的下拉列表框            
Dim OffsetX As Integer = System.Math.Abs(Windows.Forms.Cursor.Position.X - Me.frmTreeView.RectangleToScreen(Me.frmTreeView.ClientRectangle).Right)
自定义控件之带有树型控件的下拉列表框            
Dim OffsetY As Integer = System.Math.Abs(Windows.Forms.Cursor.Position.Y - Me.frmTreeView.RectangleToScreen(Me.frmTreeView.ClientRectangle).Bottom)
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框            
Me.DragOffset = New Point(OffsetX, OffsetY)
自定义控件之带有树型控件的下拉列表框        
End If
自定义控件之带有树型控件的下拉列表框    
End Sub

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框    
Private Sub TreeViewLostFocus()Sub TreeViewLostFocus(ByVal sender As ObjectByVal e As EventArgs)
自定义控件之带有树型控件的下拉列表框        
If Not Me.btnSelect.RectangleToScreen(Me.btnSelect.ClientRectangle).Contains(Windows.Forms.Cursor.Position) Then Me.frmTreeView.Hide()
自定义控件之带有树型控件的下拉列表框    
End Sub

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框    
Private Sub TreeViewNodeSelect()Sub TreeViewNodeSelect(ByVal sender As ObjectByVal e As EventArgs)
自定义控件之带有树型控件的下拉列表框        
If Me._absoluteChildrenSelectableOnly Then
自定义控件之带有树型控件的下拉列表框            
Me.tbSelectedValue.Text = Me.tvTreeView.SelectedNode.FullPath.Replace(""Me._branchSeparator)
自定义控件之带有树型控件的下拉列表框            
Me.ToggleTreeView(sender, Nothing)
自定义控件之带有树型控件的下拉列表框        
Else
自定义控件之带有树型控件的下拉列表框            
Me.tbSelectedValue.Text = Me.tvTreeView.SelectedNode.FullPath.Replace(""Me._branchSeparator)
自定义控件之带有树型控件的下拉列表框            
Me.ToggleTreeView(sender, Nothing)
自定义控件之带有树型控件的下拉列表框        
End If
自定义控件之带有树型控件的下拉列表框    
End Sub

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框    
Private Sub InitializeComponent()Sub InitializeComponent()
自定义控件之带有树型控件的下拉列表框        
Me.Name = "ComboBoxTree"
自定义控件之带有树型控件的下拉列表框        
Me._absoluteChildrenSelectableOnly = True
自定义控件之带有树型控件的下拉列表框        
AddHandler Me.Layout, AddressOf Me.ComboBoxTree_Layout
自定义控件之带有树型控件的下拉列表框    
End Sub

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框    
Private Sub ComboBoxTree_Layout()Sub ComboBoxTree_Layout(ByVal sender As ObjectByVal e As System.Windows.Forms.LayoutEventArgs)
自定义控件之带有树型控件的下拉列表框        
Me.Height = Me.tbSelectedValue.Height + 8 : Me.Width = 400
自定义控件之带有树型控件的下拉列表框        
Me.pnlBack.Size = New Size(Me.Width, Me.Height - 2)
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框        
Me.btnSelect.Size = New Size(16Me.Height - 6)
自定义控件之带有树型控件的下拉列表框        
Me.btnSelect.Location = New Point(Me.Width - Me.btnSelect.Width - 40)
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框        
Me.tbSelectedValue.Location = New Point(22)
自定义控件之带有树型控件的下拉列表框        
Me.tbSelectedValue.Width = Me.Width - Me.btnSelect.Width - 4
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框        
Me.frmTreeView.Size = New Size(Me.Width, Me.tvTreeView.Height)
自定义控件之带有树型控件的下拉列表框        
Me.pnlTree.Size = Me.frmTreeView.Size
自定义控件之带有树型控件的下拉列表框        
Me.tvTreeView.Width = Me.frmTreeView.Width - Me.lblSizingGrip.Width
自定义控件之带有树型控件的下拉列表框        
Me.tvTreeView.Height = Me.frmTreeView.Height - Me.lblSizingGrip.Width
自定义控件之带有树型控件的下拉列表框        
Me.RelocateGrip()
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框    
End Sub

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框    
Private Class LabelExClass LabelEx
自定义控件之带有树型控件的下拉列表框        
Inherits Label
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框        
Public Sub New()Sub New()
自定义控件之带有树型控件的下拉列表框            
Me.SetStyle(ControlStyles.UserPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.AllPaintingInWmPaint, True)
自定义控件之带有树型控件的下拉列表框        
End Sub

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框        
Protected Overrides Sub OnPaint()Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
自定义控件之带有树型控件的下拉列表框            
MyBase.OnPaint(e)
自定义控件之带有树型控件的下拉列表框            System.Windows.Forms.ControlPaint.DrawSizeGrip(e.Graphics, Color.Black, 
10Me.Size.Width, Me.Size.Height)
自定义控件之带有树型控件的下拉列表框        
End Sub

自定义控件之带有树型控件的下拉列表框    
End Class

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框    
Private Class ButtonExClass ButtonEx
自定义控件之带有树型控件的下拉列表框        
Inherits Button
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框        
Dim state As ButtonState
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框        
Public Sub New()Sub New()
自定义控件之带有树型控件的下拉列表框            
Me.SetStyle(ControlStyles.UserMouse Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.AllPaintingInWmPaint, True)
自定义控件之带有树型控件的下拉列表框        
End Sub

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框        
Protected Overrides Sub OnMouseDown()Sub OnMouseDown(ByVal mevent As System.Windows.Forms.MouseEventArgs)
自定义控件之带有树型控件的下拉列表框            
Me.state = ButtonState.Pushed
自定义控件之带有树型控件的下拉列表框            
MyBase.OnMouseDown(mevent)
自定义控件之带有树型控件的下拉列表框        
End Sub

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框        
Protected Overrides Sub OnMouseUp()Sub OnMouseUp(ByVal mevent As System.Windows.Forms.MouseEventArgs)
自定义控件之带有树型控件的下拉列表框            
Me.state = ButtonState.Normal
自定义控件之带有树型控件的下拉列表框            
MyBase.OnMouseUp(mevent)
自定义控件之带有树型控件的下拉列表框        
End Sub

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框自定义控件之带有树型控件的下拉列表框        
Protected Overrides Sub OnPaint()Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
自定义控件之带有树型控件的下拉列表框            
MyBase.OnPaint(e)
自定义控件之带有树型控件的下拉列表框            System.Windows.Forms.ControlPaint.DrawComboButton(e.graphics, 
00Me.Width, Me.Height, state)
自定义控件之带有树型控件的下拉列表框        
End Sub

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框    
End Class

自定义控件之带有树型控件的下拉列表框
End Class

自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框
自定义控件之带有树型控件的下拉列表框