VB.NET中如何匹配文本文件最后一行与TreeView节点并在文本框中显示内容
问题:TreeView选中最后子节点与文本文件最后行同步失败
我在使用已排序的TreeView时遇到了问题:需要选中文本文件的最后一行,然后从该文本文件中提取TreeView中添加的最后一个子节点,但始终无法实现!我尝试通过文件的行数来对应节点索引,但没有效果。实际上我试过各种方法(当然不是全部),希望能让TreeView中选中的节点与文本框显示的内容保持一致。
我的原始代码如下:
Dim NbLine As Integer = 0 Dim SR As System.IO.StreamReader = New System.IO.StreamReader(OuvrirFichier) While Not SR.EndOfStream SR.ReadLine() NbLine += 1 End While SR.Close() Dim lastLine As String = File.ReadLines(OuvrirFichier, Encoding.UTF8) _ .Where(Function(f As String) (Not String.IsNullOrEmpty(f))).Last.ToString Dim mytext As String = lastLine.Substring(17, 90) If NbLine > 0 Then Dim lignesDuFichier As String() = File.ReadAllLines(OuvrirFichier, Encoding.UTF8) Dim derniereLigne As String = lignesDuFichier(lignesDuFichier.Length - 1) TreeView1.Focus() TreeView1.SelectedNode = TreeView1.Nodes(0).Nodes(lignesDuFichier.Length - 1) End If
问题分析
你遇到的核心问题是TreeView排序后,节点的索引顺序和文本文件的行顺序不匹配:
- 当TreeView开启排序功能时,子节点会自动按规则重新排列,此时节点的索引不再等于你添加时的顺序(也就是文本文件的行顺序),所以用
lignesDuFichier.Length -1去索引节点自然会出错。 - 另外你的代码多次重复读取文件,既浪费资源又没必要。
解决方案
要解决这个问题,关键是建立文本行内容和TreeView节点的关联,而不是依赖索引。推荐在添加节点时把对应行的信息存在节点的Tag属性里,后续通过内容匹配找到目标节点:
修正后的代码示例
' 只读取一次文件,获取最后一行有效内容 Dim lastValidLine As String = File.ReadLines(OuvrirFichier, Encoding.UTF8) _ .Where(Function(line) Not String.IsNullOrWhiteSpace(line)) _ .LastOrDefault() If Not String.IsNullOrEmpty(lastValidLine) Then ' 提取你需要匹配的文本片段(和TreeView节点显示的内容一致) Dim targetNodeText = lastValidLine.Substring(17, 90) ' 遍历根节点下的所有子节点,找到文本匹配的节点 Dim targetNode = TreeView1.Nodes(0).Nodes.Cast(Of TreeNode)() _ .FirstOrDefault(Function(node) node.Text.Equals(targetNodeText, StringComparison.Ordinal)) If targetNode IsNot Nothing Then TreeView1.Focus() TreeView1.SelectedNode = targetNode ' 可选:确保节点在视图中可见 targetNode.EnsureVisible() End If End If
额外优化建议
- 添加节点时关联行信息:如果可以修改添加节点的代码,建议把对应完整行内容存在节点的
Tag属性中,这样匹配会更准确(避免文本片段重复的情况):
后续查找时就可以用完整行匹配:' 示例:添加节点时的代码 Dim line As String = ' 从文件读取的行 Dim newNode As New TreeNode(line.Substring(17,90)) newNode.Tag = line ' 把完整行存在Tag里 TreeView1.Nodes(0).Nodes.Add(newNode)Dim targetNode = TreeView1.Nodes(0).Nodes.Cast(Of TreeNode)() _ .FirstOrDefault(Function(node) node.Tag IsNot Nothing AndAlso node.Tag.ToString() = lastValidLine) - 避免重复读取文件:原始代码里多次读取文件的逻辑可以完全去掉,用
File.ReadLines一次获取最后一行即可。
内容的提问来源于stack exchange,提问作者claudebl
相关产品推荐
相关产品推荐

