4

次の問題があります。TreeView を使用して、TreeView でチェックされている項目で XML ツリーを埋めています。XML ツリーへの入力が完了するたびに、TreeView 内に TreeView-rootnode のコピーが作成されることを除いて、基本的にすべて正常に動作します。

奇妙なことに、新しいノードは最初のノードのゴーストのように動作します。チェックボックスをオン/オフできませんが、元のノードの対応するボックスがオン/オフになっています。しかし、ゴーストのノードを展開または折りたたむことができます。

TreeView.Nodes のカウントも 1 のままなので、ゴーストが存在しないため、ゴーストを削除することはできません。TreeView も更新してみましたが、変化はありませんでした。TreeView をクリアしてもゴーストは取り除かれません (クリアも推奨オプションではありません;))。

関連するコードは次のとおりです。

Private Sub btnSaveReport_Click(sender As System.Object, e As System.EventArgs) Handles btnSaveReport.Click
    Dim newXML As XDocument = XDocument.Load("some.xml")
    Dim xmlTree As XElement = newXML.Root
    buildReportTree(trvMyTree.Nodes(0), xmlTree)
    Console.WriteLine(xmlTree)
End Sub

Private Sub buildReportTree(ByRef treeNode As TreeNode, ByRef currentElement As XElement)
    If treeNode.Checked Then
        Dim newNode As XElement
        newNode = buildReportNode(treeNode)
        currentElement.Add(newNode)
        For Each childNode As TreeNode In treeNode.Nodes
            buildReportTree(childNode, newNode)
        Next
    End If
End Sub

Private Function buildReportNode(treeNode As TreeNode) As XElement
    If treeNode.ToolTipText = "property" Then
        Dim newNode As XElement = New XElement(treeNode.ToolTipText, treeNode.Name)
        Return newNode
    End If
    If treeNode.ToolTipText = "collection" Or treeNode.ToolTipText = "reference" Then
        Dim newNode As XElement = New XElement(treeNode.ToolTipText, _
                                  New XAttribute("name", treeNode.Name))
        Return newNode
    End If
    Return Nothing ' ToDo: handle errors
End Function

buildReportTree の最初の呼び出しが完了すると、ゴーストが表示されます。問題の可能性はありますか?適切な検索用語がまだ見つかっていないだけかもしれませんが、これまでのところ、これに対する答えは見つかりませんでした。

どうもありがとう!

4

1 に答える 1

1

OPから

こんにちは、答えが見つかりました (正しい検索用語は「ファントム」でした): ルート ノードを変数に割り当てる必要があります。元の投稿者として、私にはその理由がわかりません。これが私が見つけた元のフォーラム投稿です: Phantom Nodes

于 2013-09-17T18:25:48.180 に答える