×

treeview绑定(vb.net中treeview的数据绑定) -白菜网论坛

jngyjg jngyjg 发表于2023-06-01 01:42:25 浏览1 评论0

抢沙发发表评论

本文目录vb.net中treeview的数据绑定vb.net中层次数据绑定treeview的实现winform的treeview怎么进行数据库绑定vb.net中treeview的数据绑定第一步:定义两个datatable对象,第二步:先绑定dt1,以循环方式向treeview添加node,vb.net中层次数据绑定treeview的实现      提要:在vb 中 常将treeview用来表示层次数据 但相关的与数据库进行交互的代码 需要大量的采用手工编码;在中 由于数据绑定功能的加强及语言特性的增强 可以很容易的实现treeview与层次数据的绑定 本文将首先建立一个继承自treeview的 dbtreeview 然后用一个单位(部门)的层次数据与dbtreeview进行数据绑定 并提供了与数据库进行交互的代码    从层次数据的表达方式开始  在本例中 部门表(department)中有五个字段 如下表: 字段名 字段 类型说明 id 自动编号 key code string 编码 name string 名称 pid int 父结点的id cptr boolean 是否有子结点     继承自treenode的mytreenode  在mytreenode中 新增了三个属性 如下表: 属性名 类型 说明 value object key pid object 父结点的id cptr boolean 是否有子结点    在init事件中 根据传入的四个参数 设置这三个属性和text属性    将dbtreeview绑定到数据源 属性名 类型 说明 datasource dataview dbtreeview的数据源使用dataview 而不是object value member string值成员(数据源的列名) 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 setend propertyprotected property pidmember() as string get  return mpidmember end get set(byval value as string)  mpidmember = value end setend propertyprotected property displaymember() as string get  return join(mdisplaymember splitchar) end get set(byval value as string)  mdisplaymember = split(value splitchar) end setend 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 保证关健值唯一  me mdataview sort = me valuemember me m_maxid = me getvalue(me mdataview count )end sub   设置displaymember属性的格式如:字段 ;字段 ;字段 …   在设置属性时 将传来的参数转换为字符串数组mdisplaymember 在检索值时返回数据如:值 值 值 … protected overridable function getdisplay(byval index as integer) as object dim i as integer dim temp as string =  for i = to mdisplaymember length   temp = temp & iif(i 》 linkchar ) & mdataview(index)(mdisplaymember(i)) next return tempend 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 = to mdataview count()   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_positionchangedend 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 withend sub   实现数据与绑定控件的同步  要实现两个方面的同步:   其它绑定控件(如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 ifend sub   在其它绑定控件改变了数据源后 更新树结点 这个工作在触发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 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 ifend sub   使用dbtreeview  程序运行后界面如下:    相关代码请参见源程序 这里不做详述 lishixinzhi/article/program/net/201311/13916 winform的treeview怎么进行数据库绑定treeview没有datasource属性,获得当前节点的索引值的语句是:dim s as integer = treeview1.nodes(i).nodes.indexof(node)为当前节点添加子节点的语句是:treeview1.nodes(i).nodes(s).nodes.add(node)最后的效果是:treeview中有北京、上海、山东等节点,需先判断下已经存在于treeview中的节点,node.index就是dt1中id字段的值,则向这个节点下添加id为3xx的子节点,node.text就是dt1中name字段的值。

本文目录

第一步:定义两个datatable对象,并把数据库中的两个表分别读入这两个datatable对象中;如dt1用于存储省名表,dt2用于存储省辖市名表。
第二步:先绑定dt1,以循环方式向treeview添加node。其中,node.index就是dt1中id字段的值,node.text就是dt1中name字段的值。
第三步:绑定dt2,同样以循环方式向treeview添加node。这里稍微有点复杂,需先判断下已经存在于treeview中的节点,如果节点的索引是3,则向这个节点下添加id为3xx的子节点。
获得当前节点的索引值的语句是:dim s as integer = treeview1.nodes(i).nodes.indexof(node)
为当前节点添加子节点的语句是:treeview1.nodes(i).nodes(s).nodes.add(node)
最后的效果是:treeview中有北京、上海、山东等节点,点击“山东“则会展开其下面的“济南“、“青岛“、“烟台“等子节点。

      提要:在vb 中 常将treeview用来表示层次数据 但相关的与数据库进行交互的代码 需要大量的采用手工编码;在中 由于数据绑定功能的加强及语言特性的增强 可以很容易的实现treeview与层次数据的绑定 本文将首先建立一个继承自treeview的 dbtreeview 然后用一个单位(部门)的层次数据与dbtreeview进行数据绑定 并提供了与数据库进行交互的代码    从层次数据的表达方式开始  在本例中 部门表(department)中有五个字段 如下表: 字段名 字段 类型说明 id 自动编号 key code string 编码 name string 名称 pid int 父结点的id cptr boolean 是否有子结点     继承自treenode的mytreenode  在mytreenode中 新增了三个属性 如下表: 属性名 类型 说明 value object key pid object 父结点的id cptr boolean 是否有子结点    在init事件中 根据传入的四个参数 设置这三个属性和text属性    将dbtreeview绑定到数据源 属性名 类型 说明 datasource dataview dbtreeview的数据源使用dataview 而不是object value member string值成员(数据源的列名) 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 setend propertyprotected property pidmember() as string get  return mpidmember end get set(byval value as string)  mpidmember = value end setend propertyprotected property displaymember() as string get  return join(mdisplaymember splitchar) end get set(byval value as string)  mdisplaymember = split(value splitchar) end setend 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 保证关健值唯一  me mdataview sort = me valuemember me m_maxid = me getvalue(me mdataview count )end sub

  设置displaymember属性的格式如:字段 ;字段 ;字段 …

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

protected overridable function getdisplay(byval index as integer) as object dim i as integer dim temp as string =  for i = to mdisplaymember length   temp = temp & iif(i 》 linkchar ) & mdataview(index)(mdisplaymember(i)) next return tempend 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 = to mdataview count()   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_positionchangedend 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 withend sub   实现数据与绑定控件的同步  要实现两个方面的同步:   其它绑定控件(如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 ifend sub   在其它绑定控件改变了数据源后 更新树结点 这个工作在触发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 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 ifend sub

  使用dbtreeview  程序运行后界面如下:    相关代码请参见源程序 这里不做详述

lishixinzhi/article/program/net/201311/13916

treeview没有datasource属性,需要通过添加节点,如用:treeview1.nodes.add(nodes)添加,nodes参数,便可从数据库中读取某个字段信息来填充了。
比如:
//数据库连接,用了helper类
string commandtext=“select name from student_tb“
dt = oraclehelper.getdatatable(commandtext)
//treeview添加节点数据
string nodes=string.empty;
for(int i=0;i《dt.rows.count;i )
{
nodes=dt.rows.tostring();
treenode root = new treenode(nodes);
root.tag = 0;
treeview1.nodes.add(root);
}