TreeViewで部品表を作成しようと考えています。
その際、部品の並びに意味があるので、順番を移動したいのですがどうすれば良いでしょうか。
A部品---A1部品
C1部品
B1部品
を
A部品---A1部品
B1部品
C1部品
親への移動はNode.Parentを書き換えれば出来たのですが...
よろしくお願いします。
他にもっと良い方法がある様に思いますが、私はノードの削除&追加(下記)で
実現しました。
ノードAとノードBの置換
1)ノードAを保存(ディクショナリ等)
2)ツリービューからノードAを削除
3)ツリービューのノードBの後にノードAを追加
アドバイスありがとうございます。
毘沙門さんの方法を参考に、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部品」は削除されました。
とりあえず、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
失礼しました。
「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
じゃあ、.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