信息发布软件,b2b软件,广告发布软件

标题: VB.NET绑定TreeView很方便的实现了多层次绑定的问题了吧 [打印本页]

作者: 群发软件    时间: 2017-5-25 00:25
标题: VB.NET绑定TreeView很方便的实现了多层次绑定的问题了吧

1、首先建立一个数据库,名字为shiyan 完整的数据库名字为shiyan.mdb 在里面建一个表,名字为genjiediantable01并设计表,添加两个字段分为:1、字段名称:id 数据属性:自动编号,2、数据属性:gjdmz 文本 如下图:

VB.NET绑定TreeView很方便的实现了多层次绑定的问题了吧 b2b软件

2、把这个数据库放在E盘下,视个人情况而定,关键是这个数据库所在的路径

3、打开VS.2005 在设计区添加treeview控件,默认名字为treeview1 如下图

VB.NET绑定TreeView很方便的实现了多层次绑定的问题了吧 b2b软件

4、点击项目——引用——COM 添加 如下图:

VB.NET绑定TreeView很方便的实现了多层次绑定的问题了吧 b2b软件


5、在控件上点击右键选择查看代码:并输入代码如下图:
VB.NET绑定TreeView很方便的实现了多层次绑定的问题了吧 b2b软件

Public Class Form1
    Dim myconnection As New OleDb.OleDbConnection()
    Dim MyAdapater As New OleDb.OleDbDataAdapter()
    Dim mycommand As New OleDb.OleDbCommand()
    Dim ds As New DataSet()

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        myconnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\shiyan.mdb"
        mycommand.CommandText = "select id,gjdmz from genjiediantable01"
        mycommand.Connection = myconnection
        Try
            myconnection.Close()
            myconnection.Open()
            Dim mysqlreader As OleDb.OleDbDataReader = mycommand.ExecuteReader
            TreeView1.Nodes.Clear()
            While mysqlreader.Read()
                Dim tree_root As New TreeNode()
                tree_root.Tag = mysqlreader.GetValue(0)
                tree_root.Text = mysqlreader.GetString(1)
                TreeView1.Nodes.Add(tree_root)
            End While
        Finally
            myconnection.Close()
        End Try
        TreeView1.ExpandAll()
        TreeView1.Select()

    End Sub
End Class

F5 运行调试出现下图

VB.NET绑定TreeView很方便的实现了多层次绑定的问题了吧 b2b软件

代码分析:全文的精华

1、定义公用变量

Dim myconnection As New OleDb.OleDbConnection() ‘连接Access数据库,则可以使用OleDB来实现。定义一个数据库连接,表示到数据源的连接是打开的。

Dim ds As New DataSet() 定义一个数据集,与数据库的表相对应
    Dim MyAdapater As New OleDb.OleDbDataAdapter() 定义一个数据库接口 相关内容在
    Dim mycommand As New OleDb.OleDbCommand() ’定义数据库连接命令
   明天再分析,有点累了!

接着昨天的分析

myconnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\shiyan.mdb" '数据库连接字串
        mycommand.CommandText = "select id,gjdmz from genjiediantable01" ’数据库连接命令 意思是在表中genjiediantable01中查询所有根结点的编号和名称,对应的是id,gjdmz 两个字段
        mycommand.Connection = myconnection 连接数据库并执行相关的命令
        Try
            myconnection.Close() ‘关闭到数据源的连接
            myconnection.Open()’连接池中提取一个打开的连接(如果有可用的连接)。否则,它就建立一个到数据源的新连接

Dim mysqlreader As OleDb.OleDbDataReader = mycommand.ExecuteReader ‘将 CommandText 发送到 Connection 并生成一个 OleDbDataReader
           

TreeView1.Nodes.Clear()  

            While mysqlreader.Read()‘OleDbDataReader 的默认位置在第一条记录前面。因此,必须调用 Read 来开始访问任何数据
                Dim tree_root As New TreeNode()’ 定义一个表示 TreeView 控件中的节点。
                tree_root.Tag = mysqlreader.GetValue(0)‘把编号放入tag中
                tree_root.Text = mysqlreader.GetString(1)’树上显示的是根节点名称gjdmz
                TreeView1.Nodes.Add(tree_root)
            End While
        Finally
            myconnection.Close()
        End Try ‘Try...Catch...Finally 语句 (Visual Basic)
        TreeView1.ExpandAll() '打开树中的每个节点
        TreeView1.Select() '选择 TreeView

 提要:在VB6中,常将TreeView用来表示层次数据,但相关的与数据库进行交互的代码,需要大量的采用手工编码;在VB.net中,由于数据绑定功能的加强及语言特性的增强,可以很容易的实现TreeView与层次数据的绑定,本文将首先建立一个继承自TreeView的 dbTreeView,然后用一个单位(部门)的层次数据与dbTreeView进行数据绑定,并提供了与数据库进行交互的代码。

  1、从层次数据的表达方式开始

  在本例中,部门表(department)中有五个字段,如下表:

字段名 字段 类型说明
  ID 自动编号 Key
  Code String 编码
  Name String 名称
  PID Int 父结点的ID
  CPtr boolean 是否有子结点
  2、继承自TreeNode的myTreeNode

  在myTreeNode中,新增了三个属性,如下表:

属性名 类型 说明
  Value Object Key
  PID Object 父结点的ID
  CPtr Boolean 是否有子结点
  在Init事件中,根据传入的四个参数,设置这三个属性和Text属性。

  3、将dbTreeView绑定到数据源

属性名 类型 说明
  Datasource dataview dbTreeVIew的数据源使用dataview,而不是object
  Value Member string值成员(数据源[dataview]的列名)
  Display Member string显示(在Text中)成员
  Pid Member string父ID成员
  CPtr Member string是否有子结点
  后四个属性对应myTreeNode的value,text,pid,cptr。

  相关代码如下:

Protected Property DataSource() As Object
  Get
  Return mDataView
  End Get

 Set(ByVal Value As Object)
  If Value Is Nothing Then
  Else
  mDataView = Value
  cm = CType(Me.BindingContext(mDataView), CurrencyManager)
  UpdateTreeView()
  End If
  End Set
  End Property

Protected Property PidMember() As String
  Get
  Return mPidMember
  End Get
  Set(ByVal Value As String)
  mPidMember = Value
  End Set
  End Property

Protected Property DisplayMember() As String
  Get
  Return Join(mDisplayMember, SplitChar)
  End Get
  Set(ByVal Value As String)
  mDisplayMember = Split(Value, SplitChar)
  End Set
  End Property

'注意,这几个属性都是保护成员,必须在Init事件中设置:

Public Sub Init(ByVal dispmember As String, ByVal valuemember As String, ByVal pidmember As String, ByVal cptrmember As String, ByVal datasource As DataView)
  Me.ValueMember = valuemember
  Me.DisplayMember = dispmember
  Me.PidMember = pidmember
  Me.CPtrMember = cptrmember
  Me.DataSource = datasource
  '取value最大值,新增时将value+1,保证关健值唯一。
  Me.mDataView.Sort = Me.ValueMember
  Me.m_MaxID = Me.GetValue(Me.mDataView.Count - 1)
  End Sub


  设置DisplayMember属性的格式如:字段1;字段2;字段3…,

在设置属性时,将传来的参数转换为字符串数组mDisplayMember,在检索值时返回数据如:值1 值2 值3.…


Protected Overridable Function GetDisplay(ByVal Index As Integer) As Object
  Dim i As Integer
  Dim temp As String = ""
  For i = 0 To mDisplayMember.Length - 1
  temp = temp & IIf(i > 0, LinkChar, "") & mDataView(Index)(mDisplayMember(i))
  Next
  Return temp
  End Function

  其它检索值的函数请参见源程序。
  生成树

  UpdateTreeView调用私有方法FillTree来生成树,需要注意的,FillTree只是生成指定结点的子结点并将其添加到指定结点,而不是一次就将所有结点添加到树中,如果未指定结点(第一次填充时),只是添加顶层结点。

Private Sub FillTree(ByRef pnode As myTreeNode, Optional ByVal filter As String = "")
  mDataView.RowFilter = filter
  Dim i As Integer, icol As Integer
  Dim newnode As myTreeNode
  RemoveHandler cm.PositionChanged, AddressOf cm_PositionChanged
  Me.BeginUpdate()
  For i = 0 To mDataView.Count() - 1
  newnode = New myTreeNode(GetDisplay(i), GetValue(i), GetPid(i), GetCPtr(i))
  '当有子结点时,为这个结点添加一个空子结点
  If newnode.CPtr Then
  Dim nullnode As New myTreeNode()
  nullnode.Value = NoExpandNodeValue
  newnode.Nodes.Add(nullnode)
  End If
  If pnode Is Nothing Then
  Me.Nodes.Clear()
  Me.Nodes.Add(newnode)
  Else
  pnode.Nodes.Add(newnode)
  End If
  Next
  Me.EndUpdate()
  mDataView.RowFilter = ""
  AddHandler cm.PositionChanged, AddressOf cm_PositionChanged
  End Sub

  在展开有子结点的结点前,删除所有子结点,再用FillTree为待展开结点新增子结点。

Private Sub dbTreeView_BeforeExpand(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewCancelEventArgs) Handles MyBase.BeforeExpand
  '当是新增结点引起BeforeExpand事件时,直接退出。
  If ExpandWhenAddNode Then Exit Sub
  '在展开结点前更新子结点
  Dim currentnode As myTreeNode = CType(e.Node, myTreeNode)
  With currentnode
  .Nodes.Clear()
  FillTree(currentnode, mPidMember & "= " & CInt(.Value))
  End With
  End Sub

  4、实现数据与绑定控件的同步

  要实现两个方面的同步:

  1、 其它绑定控件(如textbox等)应与TreeView当前结点所指向的记录位置一致。

Private Sub dbTreeView_AfterSelect(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles MyBase.AfterSelect

 If e.Node Is Nothing Then Exit Sub
  '定位到position
  cm.Position = GetPosition(CType(e.Node, myTreeNode).Value)
  If AllowEdit Then
  oldNode = e.Node
  oldPos = cm.Position
  End If
  End Sub

  2、在其它绑定控件改变了数据源后,更新树结点,这个工作在触发CurrencyManager的PositionChanged事件时进行。

Public Sub cm_PositionChanged(ByVal sender As Object, ByVal e As System.EventArgs)
  If CType(Me.SelectedNode, myTreeNode).Value <> GetValue(cm.Position) Then
  Debug.WriteLine("Current node isn't correct point to currencymanager.position!")
  Me.SelectedNode = FindNodeByValue(GetValue(cm.Position), Me.Nodes)
  End If
  If AllowEdit Then
  If Me.SelectedNode Is Nothing AndAlso cm.Position = cm.Count - 1 Then
  '当新增记录时,新增树结点
  If CType(cm.Current, DataRowView).IsNew Then
  Me.SelectedNode = AddNode(cm.Position)
  Exit Sub
  End If
  End If
  If Not oldNode Is Nothing Then
  If CType(oldNode, myTreeNode).Value = GetValue(oldPos) Then
  '更新老结点
  oldNode.Text = GetDisplay(oldPos)
  Else
  End If
  End If
  End If
  End Sub


  使用dbTreeView

  程序运行后界面如下:


VB.NET绑定TreeView很方便的实现了多层次绑定的问题了吧 b2b软件

  相关代码请参见源程序,这里不做详述,

需要注意的是删除操作并没有删除子结点,只是删除当前结点而已,删除子结点的工作应该在存储过程中递归实现,而不应放在前端。



作者: niyaoz1    时间: 2017-5-30 09:09
值得好评,赞一个!!!
作者: 小痞子    时间: 2017-6-1 09:31
的很满意,都是高清图片效果非常好,虽然开始我着急闹的有点不愉快,后面他们的经理芬芬同志很好帮我解决了,还有
作者: ggt567    时间: 2017-6-6 14:44
!设计人员专业!来回改动无数次,都全力配合更改!
作者: 紫逸风    时间: 2017-6-15 08:17
,设计非常符合我的初衷。售后服务非常不错,这个我很放心,而且首页设计的比我原先的店铺好很多很多,真的是很满意的。全5分,极力推荐。
作者: yiyi2014    时间: 2017-6-15 21:27
,以客户要求为核心的店很少,废话不说了,总之很满意感谢!
作者: 123    时间: 2017-6-19 10:20
的很不错,提出表扬。还有三号。
作者: mmgg    时间: 2017-6-20 07:08
了,服务很周到,及时,相信你们会越来越好,加油!!
作者: ziyang701    时间: 2017-6-21 21:37
错的购物,客服很细心、热情,对我提的所有问题都耐心回答,一步一步教我操作,让我们能够很顺利地完成这次购物。售后培训也很耐心,以后还会来的。
作者: 小痞子    时间: 2017-6-22 05:54
,清晰度也很合适。太划算啦
作者: zzjiuzi008    时间: 2017-6-22 23:05
有水平,客服小妹很有耐心,虽然反复修改了很多次,但是依然十分热情。价钱也不贵。
作者: lnzhanghao    时间: 2017-6-22 23:13
老师,顶




欢迎光临 信息发布软件,b2b软件,广告发布软件 (http://postbbs.com/) Powered by Discuz! X3.2