自定义控件之带有树型控件的下拉列表框
2007-06-14 15:57
197 查看
效果图如下:
代码如下:
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(9, 9)
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(0, 0)
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 Object, ByVal 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 Object, ByVal 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 Object, ByVal 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 Object, ByVal 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 Object, ByVal 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 Object, 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
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, 1, 0, Me.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, 0, 0, Me.Width, Me.Height, state)
End Sub
End Class
End Class
代码如下:
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(9, 9)
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(0, 0)
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 Object, ByVal 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 Object, ByVal 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 Object, ByVal 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 Object, ByVal 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 Object, ByVal 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 Object, 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
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, 1, 0, Me.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, 0, 0, Me.Width, Me.Height, state)
End Sub
End Class
End Class
相关文章推荐
- 自定义控件之节点为下拉列表框的树型控件
- Select控件实现联动下拉列表框效果
- 树型结构~无限级联下拉列表框
- .net WinForm用户控件开发--(3)可多选的下拉列表框
- 带有下拉选择控件的自定义对话框
- 简单使用COMBO(下拉列表框)控件
- 可输入的Web下拉列表框控件
- Android自定义控件:上拉刷新下拉加载的滑动控件
- 无限级下拉列表框控件
- Qt学习五:控件二:下拉列表框、字体下拉列表框、QSpinBox控件、QScrollBar控件
- VC中实现带有背景位图的树型控件
- 自定义控件 之 树型控件
- 创建一个带分组功能的下拉列表框控件
- 可输入的Web下拉列表框控件
- android控件之下拉列表框
- [自定义服务器控件] 第二步:下拉列表框。
- CComboBox控件的下拉列表框,用鼠标在该ListBox上滑动的时候显示出当前具有focus的item项的索引
- 类库-----一些经常用到的对控件的处理1. 获取文本框中输入内容2.清除文本框内容3. 获取下拉列表框中选择内容,类型0为Text值,类型1为Value值4.DropDownList绑定日期
- Android Android自定义的下拉列表框控件
- 无限级下拉列表框控件