PublicDelegateSub NodeSelectEventHandler()Sub NodeSelectEventHandler() PublicClass 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 AsString Private _absoluteChildrenSelectableOnly AsBoolean Private DragOffset As System.Drawing.Point PublicReadOnlyProperty Nodes()Property Nodes() As TreeNodeCollection Get ReturnMe.tvTreeView.Nodes EndGet End Property PublicWriteOnlyProperty SelectedNode()Property SelectedNode() As TreeNode Set(ByVal value As TreeNode) Me.tvTreeView.SelectedNode = value EndSet End Property PublicOverridesProperty text()Property text() AsString Get ReturnMe.tbSelectedValue.Text EndGet Set(ByVal value AsString) Me.tbSelectedValue.Text = value EndSet End Property PublicProperty BranchSeparator()Property BranchSeparator() AsString Get ReturnMe._branchSeparator EndGet Set(ByVal value AsString) If value.Length >0ThenMe._branchSeparator = value EndSet End Property PublicProperty AbsoluteChildrenSelectableOnly()Property AbsoluteChildrenSelectableOnly() AsBoolean Get ReturnMe._absoluteChildrenSelectableOnly EndGet Set(ByVal value AsBoolean) Me._absoluteChildrenSelectableOnly = value EndSet End Property PublicSub New()SubNew() 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 AddHandlerMe.btnSelect.Click, AddressOfMe.ToggleTreeView Me.btnSelect.FlatStyle = FlatStyle.Flat Me.lblSizingGrip =New LabelEx Me.lblSizingGrip.Size =New Size(9, 9) Me.lblSizingGrip.BackColor = Color.Transparent Me.lblSizingGrip.Cursor = Cursors.SizeNWSE AddHandlerMe.lblSizingGrip.MouseMove, AddressOfMe.SizingGripMouseMove AddHandlerMe.lblSizingGrip.MouseDown, AddressOfMe.SizingGripMouseDown Me.tvTreeView =New TreeView Me.tvTreeView.BorderStyle = Windows.Forms.BorderStyle.None AddHandlerMe.tvTreeView.DoubleClick, AddressOfMe.TreeViewNodeSelect Me.tvTreeView.Location =New Point(0, 0) AddHandlerMe.tvTreeView.LostFocus, AddressOfMe.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 PrivateSub 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 PrivateSub ToggleTreeView()Sub ToggleTreeView(ByVal sender AsObject, ByVal e As EventArgs) IfNotMe.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() EndIf End Sub PublicFunction ValidateTest()Function ValidateTest() AsBoolean Dim ValidatorText AsString=Me.text Dim TNC As TreeNodeCollection =Me.tvTreeView.Nodes For i AsInteger=0To ValidatorText.Split(Me._branchSeparator.ToCharArray).Length Dim NodeFound AsBoolean=False Dim NodeToFind AsString= ValidatorText.Split(Me._branchSeparator.ToCharArray())(i) For j AsInteger=0To TNC.Count If TNC(j).Text = NodeToFind Then NodeFound =True TNC = TNC(j).Nodes ExitFor EndIf Next IfNot NodeFound ThenReturnFalse Next ReturnTrue End Function PrivateSub SizingGripMouseMove()Sub SizingGripMouseMove(ByVal sender AsObject, ByVal e As MouseEventArgs) If e.Button = Windows.Forms.MouseButtons.Left Then Dim TvWidth, TvHeight AsInteger 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 <50Then TvWidth =50 If TvHeight <50Then 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() EndIf End Sub PrivateSub SizingGripMouseDown()Sub SizingGripMouseDown(ByVal sender AsObject, ByVal e As MouseEventArgs) If e.Button = Windows.Forms.MouseButtons.Left Then Dim OffsetX AsInteger= System.Math.Abs(Windows.Forms.Cursor.Position.X -Me.frmTreeView.RectangleToScreen(Me.frmTreeView.ClientRectangle).Right) Dim OffsetY AsInteger= System.Math.Abs(Windows.Forms.Cursor.Position.Y -Me.frmTreeView.RectangleToScreen(Me.frmTreeView.ClientRectangle).Bottom) Me.DragOffset =New Point(OffsetX, OffsetY) EndIf End Sub PrivateSub TreeViewLostFocus()Sub TreeViewLostFocus(ByVal sender AsObject, ByVal e As EventArgs) IfNotMe.btnSelect.RectangleToScreen(Me.btnSelect.ClientRectangle).Contains(Windows.Forms.Cursor.Position) ThenMe.frmTreeView.Hide() End Sub PrivateSub TreeViewNodeSelect()Sub TreeViewNodeSelect(ByVal sender AsObject, ByVal e As EventArgs) IfMe._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) EndIf End Sub PrivateSub InitializeComponent()Sub InitializeComponent() Me.Name ="ComboBoxTree" Me._absoluteChildrenSelectableOnly =True AddHandlerMe.Layout, AddressOfMe.ComboBoxTree_Layout End Sub PrivateSub ComboBoxTree_Layout()Sub ComboBoxTree_Layout(ByVal sender AsObject, ByVal 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(16, Me.Height -6) Me.btnSelect.Location =New Point(Me.Width -Me.btnSelect.Width -4, 0) Me.tbSelectedValue.Location =New Point(2, 2) 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 PrivateClass LabelExClass LabelEx Inherits Label PublicSub New()SubNew() Me.SetStyle(ControlStyles.UserPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.AllPaintingInWmPaint, True) End Sub ProtectedOverridesSub OnPaint()Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) MyBase.OnPaint(e) System.Windows.Forms.ControlPaint.DrawSizeGrip(e.Graphics, Color.Black, 1, 0, Me.Size.Width, Me.Size.Height) End Sub End Class PrivateClass ButtonExClass ButtonEx Inherits Button Dim state As ButtonState PublicSub New()SubNew() Me.SetStyle(ControlStyles.UserMouse Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.AllPaintingInWmPaint, True) End Sub ProtectedOverridesSub OnMouseDown()Sub OnMouseDown(ByVal mevent As System.Windows.Forms.MouseEventArgs) Me.state = ButtonState.Pushed MyBase.OnMouseDown(mevent) End Sub ProtectedOverridesSub OnMouseUp()Sub OnMouseUp(ByVal mevent As System.Windows.Forms.MouseEventArgs) Me.state = ButtonState.Normal MyBase.OnMouseUp(mevent) End Sub ProtectedOverridesSub OnPaint()Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) MyBase.OnPaint(e) System.Windows.Forms.ControlPaint.DrawComboButton(e.graphics, 0, 0, Me.Width, Me.Height, state) End Sub End Class End Class