【VBA树控件学习四】编辑与删除TreeView节点
遇见春天
HI,我是默默等你来点赞的edon,大家最近忙吗?
今天,我们接着来讲一下TreeView树控件。之前,我们已经把新增节点的功能讲完了,接下来我们来讲一下编辑功能与删除功能。
这里我们只修改节点的名称,不变动树的节点,同时,我们需要利用之前学习的新增窗体,所以我们需要来将之前的窗体与代码做一些调整。
1、调整现有窗体
a.我们先将frmAdd窗体名称修改成frmTreeView_Edit
b.在frmTreeView_Edit窗体里添加一个产品编号的文本框,名称为ProductID,同时可用修改成否。
c.在frmTreeView添加两个按钮控件,一个用于打开编辑窗体,名称为:btnEdit,一个用于删除节点:btnDelete,最后在树控件的旁边再添加一个标签控件,用于显示选中树节点的路径。
2、添加/调整代码
接下来,我们就需要来调整代码了。
a.我们先来修改一下frmTreeView的打开新增按钮的代码
Dim objNode As Node
Set objNode = Me.TreeView0.SelectedItem '选中某个节点
strNodeParentKey = objNode.Key '选中的节点为父节点
strNodeKey = Null '当前节点为空
strNodeText = Null '当前节点名称为空
DoCmd.OpenForm "frmTreeView_Edit", acNormal, , , acFormAdd '打新增窗体
b.在frmTreeView窗体添加一些树控件代码
Private Sub Form_Open(Cancel As Integer)
Me.lblPath.Caption = ""
End Sub
Private Sub TreeView0_NodeClick(ByVal Node As Object) '树节点路径
Me.lblPath.Caption = "树控件路径:" & Node.FullPath
Me.TreeView0.SetFocus
End Sub
Private Sub TreeView0_GotFocus() '树控件得到焦点
Set Me.TreeView0.DropHighlight = Nothing
End Sub
Private Sub TreeView0_LostFocus() '树控件失去焦点
Set Me.TreeView0.DropHighlight = Me.TreeView0.SelectedItem
End Sub
c.在frmTreeView添加打开编辑的代码
Private Sub btnEdit_Click()
Dim objNode As Node
Set objNode = Me.TreeView0.SelectedItem
If objNode.Key = "K" Then
Exit Sub
End If
strNodeParentKey = objNode.Parent.Key
strNodeKey = objNode.Key
strNodeText = objNode.Text
DoCmd.OpenForm "frmTreeView_Edit", , , , acFormEdit, acDialog
objNode.Text = strNodeText
Call TreeView0_NodeClick(objNode)
End Sub
d.调整一下frmTreeView_Edit的保存与加载事件
'保存按钮
Private Sub btnSave_Click()
'判断不能为空
If IsNull(Me.ProductName) Then
MsgBox "产品名称不能为空。", vbExclamation
Me.ProductName.SetFocus
Exit Sub
End If
Dim rst As Object ' DAO.Recordset
Dim strProductID As String
Dim strWhere As String
Dim strSQL As String
'判断上级键值是否为空
If Not IsNull(Me.ProductParentID) Then
strWhere = "ProductParentID='" & Me.ProductParentID & "'"
Else
strWhere = "ProductParentID is null"
End If
'取到上级键值的最大值
strProductID = Nz(DMax("ProductID", "tblProduct", strWhere), "")
'生成编号
strProductID = Me!ProductParentID & Format(Val(Right(strProductID, 4)) + 1, "0000")
' Debug.Print strProductID
strSQL = "select * from tblProduct where ProductID='" & Me.ProductID & "'"
Set rst = CurrentDb.OpenRecordset(strSQL, 2) '打开记录集
If rst.EOF Then
rst.AddNew
rst!ProductParentID = Me!ProductParentID
rst!ProductID = strProductID
Else
rst.Edit
End If
rst!ProductName = Me!ProductName
rst.Update
strNodeText = Me!ProductName
MsgBox "保存成功。", vbInformation
If Me.DataEntry = False Then
DoCmd.Close acForm, Me.Name
Else
Form_frmTreeView.Form_Load '树重新加载一下
Me.ProductName = Null
Me.ProductParentID = Replace(strNodeParentKey, "K", "")
Me.ProductParentID.RowSource = Me.ProductParentID.RowSource '刷新
End If
rst.Close
Set rst = Nothing
End Sub
Private Sub Form_Load()
Me.ProductParentID = Replace(strNodeParentKey, "K", "")
If Me.DataEntry Then Exit Sub
Me.ProductID = Replace(strNodeKey, "K", "")
Me.ProductName = strNodeText
Me.ProductParentID.Enabled = IsNull(Me.ProductID)
End Sub
e.在frmTreeView中添加删除代码
Private Sub btnDelete_Click()
Dim strMsg As String
Dim objNode As Node
Dim strSQL As String
Dim lngRecordsAffected As Long
Set objNode = Me.TreeView0.SelectedItem
If objNode.Key = "K" Then
Exit Sub
End If
If objNode.Children > 0 Then
MsgBox "该节点下存在子节点,必须先删除所有子节点。", vbExclamation
Exit Sub
End If
strMsg = "确定要删除该节点【" & objNode.Text & "】吗?"
If MsgBox(strMsg, vbExclamation + vbOKCancel, "删除提示") = vbOK Then
strSQL = "DELETE FROM tblProduct WHERE ProductID='" & Mid(objNode.Key, 2) & "'"
CurrentDb.Execute strSQL
Me.TreeView0.Nodes.Remove objNode.Key
Set objNode = Me.TreeView0.SelectedItem
Call TreeView0_NodeClick(objNode)
End If
End Sub
f.在通用模块中添加通用变量名
Public strNodeParentKey As Variant
Public strNodeKey As Variant
Public strNodeText As Variant
3、运行测试
最后,就是运行测试了。
END
从事access开发多年,喜欢access做一些小东西,分享一些小经验
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义