'主要的功能有:
' 根据数据表中的记录来添加节点;
' 每个节点都可以添加ToolTip提示;
' 可以得到当前选定节点的父节点或根节点,及其一些相关属性;
' 可以拖动节点,并可自由设置拖动后的数据处理办法;
' 可以通过编号直接定位到某个节点,也可以通过查找文本的办法找到节点
'还需要改进的是:
' 1、图片。根据记录TJ值的不同,各个节点,可以使用不同的图片;
' 2、复选框。如何控制各个节点的复选框:有些节点可以选中,有些则不选中;
' 如果父节点的复选框选中,则所有子节点都选中,取消父节点的复选框后,则所有的子节点都取消(还包括类似情况);
' 3、文本查找。在树中查找文本,如果找到后,应该将该节点展开,而目前,有时好象只能展开一部分;
' 4、加载速度。由于是根据数据表中记录来添加节点,所以加载的速度比较慢,需要优化;
Imports
System.Windows.Forms
Imports System.Drawing
全新打造的最新的 TreeView 作者:钱波 #Region " 全新打造的最新的 TreeView 作者:钱波 "
'主要的功能有:
' 根据数据表中的记录来添加节点;
' 每个节点都可以添加ToolTip提示;
' 可以得到当前选定节点的父节点或根节点,及其一些相关属性;
' 可以拖动节点,并可自由设置拖动后的数据处理办法;
' 可以通过编号直接定位到某个节点,也可以通过查找文本的办法找到节点
'主要的属性有:
' BqMini1gRow '初始化时,获取表的记录行
' BqPdragType '初始化时,是否需要进行拖动
' BqpTooltip '指定提示信息
' BqPdragNode '返回拖动的节点对象
' BqPdragNo '返回拖动过的节点的数量
' BqPoSelectNode '返回当前选中的节点对象
' BqPoTableOut '返回当前数据表
' BqPallCounts '返回所有的节点数
' BqPfinCount '返回找到的节点数
' BqPtagBH '设置或返回当前选定项的Tag值,即编号
' BqPFindCount '根据文本查找定位节点,并返回找到的节点数
'获取的节点 是我自己定义的一个的TreeNode对象,
'主要的属性有:
' BqBh '节点的 编号
' BqBhFull '节点的 编号全称
' BqImage '节点的 对应的ImageIndex的位置
' BqOneBh '节点的 根+末级编号
' BqOneText '节点的 根+末级名称
' BqOneTextJc '节点的 根+末级简称
' BqNodeBoot '节点的 根节点
' BqNodeParent '节点的 父节点
' BqBhBoot '当前节点的根节点编号
' BqBhParent '当前节点的父节点编号
'
'主要的方法有:
' BqMini1del '删除表中的记录
' BqMini2add '添加记录
' BqMini3node '开始添加节点
'主要的事件有:
' BqeSeNodeBar '外部设置,选择节点后显示节点信息
' BqeSeNodeBd '外部设置,选择节点后绑定数据
' BqeNodeDrop '拖动完成后应该执行的操作
' BqeNodeFind '完成查找后应该执行的操作
'
'例如:
' Dim r1, r0 As DataRow
' With Me.BqUTre1.BqUTreeView1
' r0 = .BqMini1gRow
' .BqMini1del() '先清除BqUTre中的表中记录
' For Each r1 In sMainTable.Rows
' r0("BP") = "" & r1.Item("BHparent").ToString '父编号
' r0("BH") = "" & r1.Item("BHmode").ToString'编号
' r0("MC") = "" & r1.Item("MCmode").ToString'名称
' r0("Jc") = "" & r1.Item("JCmode").ToString'简称
' r0("Ti") = "" & r1.Item("HelpTip").ToString'帮助提示
' r0("Im") = "" & r1.Item("Image").ToString'对应的ImageIndex的位置
' r0("TJ") = "" & r1.Item("K_dele").ToString'条件
' .BqMini2add(r0)
' Next
' .BqPdragType = 1 '不能拖动
' .BqpTooltip = "功能模块"
' .BqMini3node()
' End With
'还需要改进的是:
' 1、图片。根据记录TJ值的不同,各个节点,可以使用不同的图片;
' 2、复选框。如何控制各个节点的复选框:有些节点可以选中,有些则不选中;
' 如果父节点的复选框选中,则所有子节点都选中,取消父节点的复选框后,则所有的子节点都取消(还包括类似情况);
' 3、文本查找。在树中查找文本,如果找到后,应该将该节点展开,而目前,有时好象只能展开一部分;
' 4、加载速度。由于是根据数据表中记录来添加节点,所以加载的速度比较慢,需要优化;
Public Class BqUTreeViewClass BqUTreeView
Inherits System.Windows.Forms.TreeView
Dim oBoot, oPare As BqTreNodeEx
'Dim oBoot, oPare As BqTreNodeEx
'Dim oSelect As BqTreNodeEx
Dim oDragNode As BqTreNodeEx '被拖动的节点
Dim lBM As BindingManagerBase
Dim ltb As DataTable = New DataTable("kTreTab") '只用于初始化时,建立新的表,并从外部传入记录
Dim mTb As DataTable '主要用于节点的设置,临时表
Dim ltv As DataView
Dim lFGF As String '分隔符
''Dim lsFin As String '待查找的字符
Dim lsFins As Integer '查找结果的数量
''Dim lbFin As Boolean '是查找还是定位,lbFin = True '查找
''Dim lbSet As Boolean = True ',选择后,是否需要重新取
Dim lbynDrag As Integer '是否可以拖动,1 内部拖动,2外部拖动,其它,不可以拖动
Dim lRecnoCounts As Integer
Dim oTooltip As New ToolTip
Dim lTooltip As String
Dim lslDrag As Integer = 0
Dim oHashTable As Hashtable '为提高查找速度,而建立的
Public Sub New()Sub New()
MyBase.New()
Call TableCreat() '钱波加的,新建本类则就建立数据表
End Sub
Public Event BqeSeNodeBar() '外部设置,选择节点后显示节点信息
Public Event BqeSeNodeBd() '外部设置,选择节点后绑定数据
Public Event BqeNodeDrop() '拖动完成后应该执行的操作
Public Event BqeNodeFind() '完成查找后应该执行的操作
Dim kkk, n As Integer
Public Sub BqMini1del()Sub BqMini1del()
ltb.Rows.Clear()
End Sub '删除表中的记录
Public Sub BqMini3node()Sub BqMini3node()
kkk = System.Environment.TickCount
Debug.WriteLine(Me.Name + " 在tree中,TreNodesAdd 开始:" + kkk.ToString)
lRecnoCounts = ltb.Rows.Count
If lRecnoCounts > 0 Then
Call TreNodesAdd()
End If
'lbSet = True
If lbynDrag = 1 Or lbynDrag = 2 Then
Me.AllowDrop = True
Else
Me.AllowDrop = False
End If
Me.AllowDrop = IIf(lbynDrag = 1, True, False)
Me.SelectedNode = Me.TopNode ' Me.Nodes.Item(0)
Me.HideSelection = False
n = System.Math.Abs(System.Environment.TickCount - kkk)
Debug.WriteLine(Me.Name + "在tree中,TreNodesAdd 结束:" + n.ToString)
End Sub '第一次用 ,开始添加节点
Public Sub BqMini2add()Sub BqMini2add(ByVal oDataRow As DataRow)
Try
Dim r As Array
r = oDataRow.ItemArray
ltb.Rows.Add(r)
Catch ex As Exception
End Try
End Sub '添加记录
Public ReadOnly Property BqMini1gRow()Property BqMini1gRow() As DataRow
Get
Dim r As DataRow
r = ltb.Clone.NewRow
Return r
End Get
End Property '初始化时,获取表的记录行
Public ReadOnly Property BqPdragNode()Property BqPdragNode() As BqTreNodeEx
Get
Return oDragNode
End Get
End Property '返回拖动的节点对象
Public ReadOnly Property BqPdragNo()Property BqPdragNo() As Integer
Get
Return lslDrag
End Get
End Property '返回拖动过的节点的数量
Public ReadOnly Property BqPoSelectNode()Property BqPoSelectNode() As BqTreNodeEx
Get
Return Me.SelectedNode 'oSelect
End Get
End Property '返回当前选中的节点对象
Public ReadOnly Property BqPoTableOut()Property BqPoTableOut() As DataTable
Get
Return mTb
End Get
End Property '返回当前数据表
Public ReadOnly Property BqPallCounts()Property BqPallCounts() As Integer
Get
Return lRecnoCounts
End Get
End Property '返回所有的节点数
Public ReadOnly Property BqPfinCount()Property BqPfinCount() As Integer
Get
Return lsFins
End Get
End Property '返回找到的节点数
Public ReadOnly Property BqPFindCount()Property BqPFindCount(ByVal sText As String) As Integer
Get
Try
If Len(Trim(sText)) <= 0 Then
Exit Property '如果传入的值为空,则退出
End If
Me.CollapseAll()
Me.ForeColor = Color.Black '颜色设为默认:黑
Dim o, e As BqTreNodeEx
Dim lEnumerator As IDictionaryEnumerator = oHashTable.GetEnumerator()
lsFins = 0
lEnumerator.Reset()
While lEnumerator.MoveNext()
o = lEnumerator.Value
o.ForeColor = Color.Black '颜色设为默认:黑
If InStr(o.Text, Trim(sText)) > 0 Then
lsFins = lsFins + 1
Debug.WriteLine(o.Text)
If lsFins = 1 Then
e = o
End If
o.ForeColor = Color.Red
If IsNothing(o.BqNodeParent) Then
o.Expand()
Else
o.BqNodeParent.Expand()
End If
End If
End While
If lsFins > 0 Then
Me.SelectedNode = e '只选中第一个
RaiseEvent BqeNodeFind()
End If
Return lsFins
Catch ex As Exception
End Try
End Get
End Property
Public WriteOnly Property BqPdragType()Property BqPdragType() As Integer '设置是否可以拖动
Set(ByVal Value As Integer)
lbynDrag = IIf(Value = 1 Or 2, Value, 0) '0表示不能拖动,1自己内部拖动,2拖到外部
End Set
End Property '初始化时,是否需要进行拖动
Public Property BqpTooltip()Property BqpTooltip() As String
Get
Return lTooltip
End Get
Set(ByVal Value As String)
lTooltip = Value
Me.oTooltip.SetToolTip(Me, Value)
End Set
End Property '指定提示信息
Public WriteOnly Property BqPtagBH()Property BqPtagBH() As String
'Get
' If Not IsNothing(oSelect) Then
' Return oSelect.BqBh
' Else
' Return ""
' End If
'End Get
Set(ByVal Value As String)
'lsFin = Value
'lsFins = 0
'lbFin = False '定位
'lbSet = False
'Call SetT()
'lbSet = True
Try
If Len(Trim(Value)) <= 0 Then
Exit Property<sp
Imports System.Drawing
全新打造的最新的 TreeView 作者:钱波 #Region " 全新打造的最新的 TreeView 作者:钱波 "
'主要的功能有:
' 根据数据表中的记录来添加节点;
' 每个节点都可以添加ToolTip提示;
' 可以得到当前选定节点的父节点或根节点,及其一些相关属性;
' 可以拖动节点,并可自由设置拖动后的数据处理办法;
' 可以通过编号直接定位到某个节点,也可以通过查找文本的办法找到节点
'主要的属性有:
' BqMini1gRow '初始化时,获取表的记录行
' BqPdragType '初始化时,是否需要进行拖动
' BqpTooltip '指定提示信息
' BqPdragNode '返回拖动的节点对象
' BqPdragNo '返回拖动过的节点的数量
' BqPoSelectNode '返回当前选中的节点对象
' BqPoTableOut '返回当前数据表
' BqPallCounts '返回所有的节点数
' BqPfinCount '返回找到的节点数
' BqPtagBH '设置或返回当前选定项的Tag值,即编号
' BqPFindCount '根据文本查找定位节点,并返回找到的节点数
'获取的节点 是我自己定义的一个的TreeNode对象,
'主要的属性有:
' BqBh '节点的 编号
' BqBhFull '节点的 编号全称
' BqImage '节点的 对应的ImageIndex的位置
' BqOneBh '节点的 根+末级编号
' BqOneText '节点的 根+末级名称
' BqOneTextJc '节点的 根+末级简称
' BqNodeBoot '节点的 根节点
' BqNodeParent '节点的 父节点
' BqBhBoot '当前节点的根节点编号
' BqBhParent '当前节点的父节点编号
'
'主要的方法有:
' BqMini1del '删除表中的记录
' BqMini2add '添加记录
' BqMini3node '开始添加节点
'主要的事件有:
' BqeSeNodeBar '外部设置,选择节点后显示节点信息
' BqeSeNodeBd '外部设置,选择节点后绑定数据
' BqeNodeDrop '拖动完成后应该执行的操作
' BqeNodeFind '完成查找后应该执行的操作
'
'例如:
' Dim r1, r0 As DataRow
' With Me.BqUTre1.BqUTreeView1
' r0 = .BqMini1gRow
' .BqMini1del() '先清除BqUTre中的表中记录
' For Each r1 In sMainTable.Rows
' r0("BP") = "" & r1.Item("BHparent").ToString '父编号
' r0("BH") = "" & r1.Item("BHmode").ToString'编号
' r0("MC") = "" & r1.Item("MCmode").ToString'名称
' r0("Jc") = "" & r1.Item("JCmode").ToString'简称
' r0("Ti") = "" & r1.Item("HelpTip").ToString'帮助提示
' r0("Im") = "" & r1.Item("Image").ToString'对应的ImageIndex的位置
' r0("TJ") = "" & r1.Item("K_dele").ToString'条件
' .BqMini2add(r0)
' Next
' .BqPdragType = 1 '不能拖动
' .BqpTooltip = "功能模块"
' .BqMini3node()
' End With
'还需要改进的是:
' 1、图片。根据记录TJ值的不同,各个节点,可以使用不同的图片;
' 2、复选框。如何控制各个节点的复选框:有些节点可以选中,有些则不选中;
' 如果父节点的复选框选中,则所有子节点都选中,取消父节点的复选框后,则所有的子节点都取消(还包括类似情况);
' 3、文本查找。在树中查找文本,如果找到后,应该将该节点展开,而目前,有时好象只能展开一部分;
' 4、加载速度。由于是根据数据表中记录来添加节点,所以加载的速度比较慢,需要优化;
Public Class BqUTreeViewClass BqUTreeView
Inherits System.Windows.Forms.TreeView
Dim oBoot, oPare As BqTreNodeEx
'Dim oBoot, oPare As BqTreNodeEx
'Dim oSelect As BqTreNodeEx
Dim oDragNode As BqTreNodeEx '被拖动的节点
Dim lBM As BindingManagerBase
Dim ltb As DataTable = New DataTable("kTreTab") '只用于初始化时,建立新的表,并从外部传入记录
Dim mTb As DataTable '主要用于节点的设置,临时表
Dim ltv As DataView
Dim lFGF As String '分隔符
''Dim lsFin As String '待查找的字符
Dim lsFins As Integer '查找结果的数量
''Dim lbFin As Boolean '是查找还是定位,lbFin = True '查找
''Dim lbSet As Boolean = True ',选择后,是否需要重新取
Dim lbynDrag As Integer '是否可以拖动,1 内部拖动,2外部拖动,其它,不可以拖动
Dim lRecnoCounts As Integer
Dim oTooltip As New ToolTip
Dim lTooltip As String
Dim lslDrag As Integer = 0
Dim oHashTable As Hashtable '为提高查找速度,而建立的
Public Sub New()Sub New()
MyBase.New()
Call TableCreat() '钱波加的,新建本类则就建立数据表
End Sub
Public Event BqeSeNodeBar() '外部设置,选择节点后显示节点信息
Public Event BqeSeNodeBd() '外部设置,选择节点后绑定数据
Public Event BqeNodeDrop() '拖动完成后应该执行的操作
Public Event BqeNodeFind() '完成查找后应该执行的操作
Dim kkk, n As Integer
Public Sub BqMini1del()Sub BqMini1del()
ltb.Rows.Clear()
End Sub '删除表中的记录
Public Sub BqMini3node()Sub BqMini3node()
kkk = System.Environment.TickCount
Debug.WriteLine(Me.Name + " 在tree中,TreNodesAdd 开始:" + kkk.ToString)
lRecnoCounts = ltb.Rows.Count
If lRecnoCounts > 0 Then
Call TreNodesAdd()
End If
'lbSet = True
If lbynDrag = 1 Or lbynDrag = 2 Then
Me.AllowDrop = True
Else
Me.AllowDrop = False
End If
Me.AllowDrop = IIf(lbynDrag = 1, True, False)
Me.SelectedNode = Me.TopNode ' Me.Nodes.Item(0)
Me.HideSelection = False
n = System.Math.Abs(System.Environment.TickCount - kkk)
Debug.WriteLine(Me.Name + "在tree中,TreNodesAdd 结束:" + n.ToString)
End Sub '第一次用 ,开始添加节点
Public Sub BqMini2add()Sub BqMini2add(ByVal oDataRow As DataRow)
Try
Dim r As Array
r = oDataRow.ItemArray
ltb.Rows.Add(r)
Catch ex As Exception
End Try
End Sub '添加记录
Public ReadOnly Property BqMini1gRow()Property BqMini1gRow() As DataRow
Get
Dim r As DataRow
r = ltb.Clone.NewRow
Return r
End Get
End Property '初始化时,获取表的记录行
Public ReadOnly Property BqPdragNode()Property BqPdragNode() As BqTreNodeEx
Get
Return oDragNode
End Get
End Property '返回拖动的节点对象
Public ReadOnly Property BqPdragNo()Property BqPdragNo() As Integer
Get
Return lslDrag
End Get
End Property '返回拖动过的节点的数量
Public ReadOnly Property BqPoSelectNode()Property BqPoSelectNode() As BqTreNodeEx
Get
Return Me.SelectedNode 'oSelect
End Get
End Property '返回当前选中的节点对象
Public ReadOnly Property BqPoTableOut()Property BqPoTableOut() As DataTable
Get
Return mTb
End Get
End Property '返回当前数据表
Public ReadOnly Property BqPallCounts()Property BqPallCounts() As Integer
Get
Return lRecnoCounts
End Get
End Property '返回所有的节点数
Public ReadOnly Property BqPfinCount()Property BqPfinCount() As Integer
Get
Return lsFins
End Get
End Property '返回找到的节点数
Public ReadOnly Property BqPFindCount()Property BqPFindCount(ByVal sText As String) As Integer
Get
Try
If Len(Trim(sText)) <= 0 Then
Exit Property '如果传入的值为空,则退出
End If
Me.CollapseAll()
Me.ForeColor = Color.Black '颜色设为默认:黑
Dim o, e As BqTreNodeEx
Dim lEnumerator As IDictionaryEnumerator = oHashTable.GetEnumerator()
lsFins = 0
lEnumerator.Reset()
While lEnumerator.MoveNext()
o = lEnumerator.Value
o.ForeColor = Color.Black '颜色设为默认:黑
If InStr(o.Text, Trim(sText)) > 0 Then
lsFins = lsFins + 1
Debug.WriteLine(o.Text)
If lsFins = 1 Then
e = o
End If
o.ForeColor = Color.Red
If IsNothing(o.BqNodeParent) Then
o.Expand()
Else
o.BqNodeParent.Expand()
End If
End If
End While
If lsFins > 0 Then
Me.SelectedNode = e '只选中第一个
RaiseEvent BqeNodeFind()
End If
Return lsFins
Catch ex As Exception
End Try
End Get
End Property
Public WriteOnly Property BqPdragType()Property BqPdragType() As Integer '设置是否可以拖动
Set(ByVal Value As Integer)
lbynDrag = IIf(Value = 1 Or 2, Value, 0) '0表示不能拖动,1自己内部拖动,2拖到外部
End Set
End Property '初始化时,是否需要进行拖动
Public Property BqpTooltip()Property BqpTooltip() As String
Get
Return lTooltip
End Get
Set(ByVal Value As String)
lTooltip = Value
Me.oTooltip.SetToolTip(Me, Value)
End Set
End Property '指定提示信息
Public WriteOnly Property BqPtagBH()Property BqPtagBH() As String
'Get
' If Not IsNothing(oSelect) Then
' Return oSelect.BqBh
' Else
' Return ""
' End If
'End Get
Set(ByVal Value As String)
'lsFin = Value
'lsFins = 0
'lbFin = False '定位
'lbSet = False
'Call SetT()
'lbSet = True
Try
If Len(Trim(Value)) <= 0 Then
Exit Property<sp