VB.NET TreeView 遞歸查找節點文本匹配 TextBox 輸入值,原代碼使用 Like 但缺少通配符,導致只能精確匹配。添加通配符即可實現模糊查找高亮展開。
If tn.Text Like text.Trim() Then ' 錯誤:無通配符,等同精確匹配
If tn.Text Like "*" & text.Trim() & "*" Then ' 正確:前後通配符,包含匹配
tn.BackColor = Drawing.Color.YellowGreen
ShowNodes(tn) ' 展開路徑
End If
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
' 清除上次高亮
ClearHighlights(TreeView1.Nodes)
Dim searchText = TextBox7.Text.Trim()
If String.IsNullOrEmpty(searchText) Then Return
For Each tnc As TreeNode In TreeView1.Nodes
FindNodes(tnc, searchText)
Next
End Sub
Private Sub FindNodes(node As TreeNode, text As String)
For Each tn As TreeNode In node.Nodes
If tn.Text Like "*" & text & "*" Then
tn.BackColor = Color.YellowGreen
ExpandPath(tn) ' 展開父節點鏈
End If
FindNodes(tn, text) ' 遞歸子節點
Next
End Sub
Private Sub ExpandPath(node As TreeNode)
If node.Parent IsNot Nothing Then
node.Parent.Expand()
ExpandPath(node.Parent)
End If
End Sub
Private Sub ClearHighlights(nodes As TreeNodeCollection)
For Each tn As TreeNode In nodes
tn.BackColor = Color.White
ClearHighlights(tn.Nodes)
Next
End Sub
| 通配符 | 含義 | 示例 |
|---|---|---|
* | 任意長度任意字符(含 0 個) | "abc" Like "*b*" → True |
? | 單個任意字符 | "abc" Like "a?c" → True |
# | 單個數字 (0-9) | "a1c" Like "a#c" → True |
[charlist] | 字符列表中任一字符 | "a" Like "[abc]" → True |
[!charlist] | 不在字符列表中 | "d" Like "[!abc]" → True |
Dictionary(Of String, List(Of TreeNode)) 映射關鍵字到節點Task.Run(Sub() FindNodes(...)) 回調 UI 更新高亮Node.ForeColor 或 Node.NodeFont 區分,BackColor 可能被主題覆蓋