TreeViewのNodeを上下/親子へ移動するには?


Datacom  2003-12-10 13:36:34  No: 110574  IP: [192.*.*.*]

TreeViewで部品表を作成しようと考えています。
その際、部品の並びに意味があるので、順番を移動したいのですがどうすれば良いでしょうか。

A部品---A1部品
        C1部品
        B1部品

A部品---A1部品
        B1部品
        C1部品

親への移動はNode.Parentを書き換えれば出来たのですが...

よろしくお願いします。

編集 削除
毘沙門  2003-12-12 09:41:38  No: 110575  IP: [192.*.*.*]

他にもっと良い方法がある様に思いますが、私はノードの削除&追加(下記)で
実現しました。

ノードAとノードBの置換
1)ノードAを保存(ディクショナリ等)
2)ツリービューからノードAを削除
3)ツリービューのノードBの後にノードAを追加

編集 削除
Datacom  2003-12-12 11:45:26  No: 110576  IP: [192.*.*.*]

アドバイスありがとうございます。

毘沙門さんの方法を参考に、NodeのRemoveとAddで試してみました。

以下の問題が新たに発生しました。

A部品---A1部品
        C1部品
        B1部品

A部品---A1部品
        B1部品
        C1部品

この場合はOKだったんですが、

A部品---A1部品
        C1部品
            C11部品
            C12部品
        B1部品

A部品---A1部品
        B1部品
        C1部品
子ノード「C1部品」をRemoveし新たにB1部品の次にAddすると、孫ノード「C11,C12部品」は削除されました。

編集 削除
魔界の仮面弁士  2003-12-12 11:57:01  No: 110577  IP: [192.*.*.*]

とりあえず、VB6という前提で回答します。

'===========
Option Explicit

Private Sub Form_Load()
    With Me.TreeView1.Nodes
        .Add , , "A", "A部品"
        .Add "A", tvwChild, "A1", "A1部品"
        .Add "A", tvwChild, "C1", "C1部品"
        .Add "C1", tvwChild, "C11", "C11部品"
        .Add("C1", tvwChild, "C12", "C12部品").EnsureVisible
        .Add "A", tvwChild, "B1", "B1部品"
    End With
End Sub

Private Sub Command1_Click()
    Dim N As Node
    With Me.TreeView1.Nodes
        Set N = .Item("B1")
        .Remove N.Index
        .Add "C1", tvwPrevious, N.Key, N.Text
        Set N = Nothing
    End With
End Sub

編集 削除
魔界の仮面弁士  2003-12-12 12:12:16  No: 110578  IP: [192.*.*.*]

失礼しました。
「B1をC1の前に移動させる」のではなく、
「C1をB1の後に移動させる」のですね。

Private Sub Command1_Click()
    Dim R As Node
    With Me.TreeView1
        Set R = .Nodes(1).Root
        Set .Nodes("C1").Parent = R
        Set .Nodes("B1").Parent = R
        Set .Nodes("A1").Parent = R
        Set R = Nothing
    End With
End Sub

編集 削除
特攻隊長まるるう  2003-12-12 12:41:49  No: 110579  IP: [192.*.*.*]

じゃあ、.NET のサンプルも…
[VB.NET]
並び替えには色々な方法が…とりあえず Nodes(Index[As Integer]) プロパティで子ノードは
分かります。

Option Explicit On 

PrevNode([VB6.0]では Previous)プロパティで兄弟ノードも探せるけど…。

[VB.NET]
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim wRootNode As TreeNode
        Dim wNode As TreeNode

        wRootNode = Me.TreeView1.Nodes.Add("A部品")
        With wRootNode
            .Nodes.Add("A1部品")
            wNode = .Nodes.Add("C1部品")
            With wNode
                .Nodes.Add("A2部品")
                .Nodes.Add("B2部品")
                .Nodes.Add("C2部品")
            End With
            .Nodes.Add("B1部品")
            .Expand()
        End With

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim wRootNode As TreeNode
        Dim wText As String

        With Me.TreeView1
            .BeginUpdate()
            wRootNode = .Nodes(0)
            With wRootNode
                If .GetNodeCount(False) < 3 Then Exit Sub
                wText = .Nodes(1).Text
                .Nodes(1).Text = .Nodes(2).Text
                .Nodes(2).Text = wText
            End With
            .EndUpdate()
        End With

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim wRootNode As TreeNode
        Dim wNode As TreeNode

        With Me.TreeView1
            .BeginUpdate()
            wRootNode = .Nodes(0)
            With wRootNode
                If .GetNodeCount(False) < 2 Then Exit Sub
                wNode = .Nodes(1).Clone
                .Nodes.Insert(0, wNode)
                .Nodes(2).Remove()
            End With
            .EndUpdate()
        End With

    End Sub

編集 削除