在此代码块中,(tvn.Tag)出现空指针异常:
For Each tvn In SelNode.Nodes
If tvn.Tag = "Ports" Then tvn.Remove()
Next
这怎么可能? 完整子:
Private Sub btnScan_Click(sender As Object, e As EventArgs) Handles btnScan.Click
MGlobals.OpenPorts.Clear()
Dim SelNode As TreeNode = TreeView1.SelectedNode
Dim tvn As TreeNode
For Each tvn In SelNode.Nodes
If tvn.Tag = "Ports" Then tvn.Remove()
Next
tvn = SelNode.Nodes.Add("Portas Abertas")
tvn.Tag = "Ports"
tvn.Nodes.Add(tvn.Parent.Text)
TreeView1.Select()
TreeView1.SelectedNode = SelNode
End Sub
答案 0 :(得分:3)
通常,如果您在枚举该集合时尝试从集合中删除某个项目,则将抛出集合修改后的异常。但是,TreeNodeCollection
类和它使用的枚举器没有实现这种逻辑。删除节点后,将通过复制较高索引的节点以填充已删除的节点来压缩后备阵列。如果数组最初过大,则意味着最高索引位置的位置现在为空。由于枚举器在创建时设置了节点总数,因此不幸地它充当了for-next循环,最终可能返回空值。
解决方案与从其他集合中删除项目时的解决方案相同,请使用递减的For-Next循环。
For i As Int32 = SelNodes.GetNodeCount(False) - 1 To 0 Step -1
Dim tvn As TreeNode = SelNodes.Nodes.Item(i)
If tvn.Tag IsNot Nothing AndAlso tvn.Tag.ToString = "Ports" Then
tvn.Remove()
End If
Next
答案 1 :(得分:0)
Tag属性是类型object,在投射或调用.ToString之前检查对象是否为Nothing。如果您知道它是字符串,则还必须照此将其抛弃。
If tvn.Tag IsNot Nothing Then
If CType(tvn.Tag, String) = "Ports" Then tvn.Remove()
End If