プロが教えるわが家の防犯対策術!

VB2005Expressで開発しています。

TreeViewにデータテーブルの値をセットして表示しています。
セットする値に重複する値がある場合、ツリーの構造が崩れてしまいます。左図のようにしたいのですが、右図のようになってしまいます。
あ あ
|-い |-い
| | | |
| -う | -う
お | -え
|-い お
| |
| -え
ツリーの値に非表示のキーを持たせる等、何か対応法をご存知の方が
いらっしゃいましたら教えて下さい。下記がPGMです。

'処理内容:TreeViewにデータテーブルの値をセット
Private Function fncTreeViewSet() As Boolean
Dim dTbl As DataTable
Dim Node As TreeNode
Dim intMenuNo As Integer
Dim strMenuName1 As String
Dim strMenuName2 As String
Dim strMenuName3 As String
Dim strMenuName4 As String
Dim strMenuName5 As String
Dim i As Integer

Node = TreeView1.SelectedNode
dTbl = dsDataSet.Tables("Mメニュー")

For i = 0 To dTbl.Rows.Count() - 1
intMenuNo = 0
strMenuName1 = ""
strMenuName2 = ""
strMenuName3 = ""
strMenuName4 = ""
strMenuName5 = ""

strMenuName1 = Trim$(dTbl.Rows(i)("階層1"))
intMenuNo = dTbl.Rows(i)("工程番号")
strMenuName2 = Trim$(dTbl.Rows(i)("階層2").ToString)
strMenuName3 = Trim$(dTbl.Rows(i)("階層3").ToString)
strMenuName4 = Trim$(dTbl.Rows(i)("階層4").ToString)
strMenuName5 = Trim$(dTbl.Rows(i)("階層5").ToString)

If strMenuName1 = "" Then
Else
If strMenuName2 = "" Then
TreeView1.Nodes.Add(strMenuName1) '階層1をセット
Else
If strMenuName3 = "" Then
fncSerchNode(strMenuName1)
TreeView1.SelectedNode.Nodes.Add(strMenuName2) '階層2をセット
Else
If strMenuName4 = "" Then
fncSerchNode(strMenuName2)
TreeView1.SelectedNode.Nodes.Add(strMenuName3) '階層3をセット
Else
If strMenuName5 = "" Then
fncSerchNode(strMenuName3)
TreeView1.SelectedNode.Nodes.Add(strMenuName4) '階層4をセット
Else
fncSerchNode(strMenuName4)
TreeView1.SelectedNode.Nodes.Add(strMenuName5)
End If
End If
End If
End If
End If
Next

TreeView1.SelectedNode = Nothing
End Function


'処理内容:指定ノード選択
Private Function fncSerchNode(ByVal strMenuName As String) As Boolean
Dim Node As TreeNode

For Each Node In fncGetAllNodes(TreeView1.Nodes)
If Node.Text = strMenuName Then
TreeView1.SelectedNode = Node
Exit For
End If
Next
End Function


'処理内容:子ノードも含んだすべてのノードを取得
Private Function fncGetAllNodes(ByVal Nodes As TreeNodeCollection) As ArrayList
Dim Ar As New ArrayList
Dim Node As TreeNode

For Each Node In Nodes
Ar.Add(Node)
If Node.GetNodeCount(False) > 0 Then
Ar.AddRange(fncGetAllNodes(Node.Nodes))
End If
Next

Return Ar
End Function

A 回答 (4件)

fncSerchNodeで探しているノードが Node.Textとの比較でしか探していないのが原因でしょう



探すノードまでフルパスを検索してやれば希望通りになると思います
呼び出し側で 『階層5』を追加するための『階層4』ノードの検索に
fncSerchNode(strMenuName1 & "\" & strMenuName2 & "\" & strMenuName3 & "\" & strMenuName4)
と 階層1から階層4までを "\"でつないだ物をキーに探します

階層3を探すなら
fncSerchNode(strMenuName1 & "\" & strMenuName2 & "\" & strMenuName3)

階層2を探すなら
fncSerchNode(strMenuName1 & "\" & strMenuName2 )

階層1を探すなら
fncSerchNode(strMenuName1 )

fncSerchNodeのIf Node.Text = strMenuName Then を
If Node.FullPath = strMenuName Then
としてみてください
    • good
    • 0
この回答へのお礼

教えていただいた「Node.Textとの比較でしか探していない」が原因
でした。上記を組み込んだところ解決しました!

本当にありがとうございました。

お礼日時:2008/09/26 14:28

前者のような構造なら


ノードを追加する際に
Add( row("階層1"), row("階層1") )
といった具合に Key、Textを指定して登録します

ノードの検索に
階層1の場合は
pNodes = TreeView1.Nodes.Find( row("階層1"), Flase )
として
pNodes.Length = 0 なら新規ノード、0以外なら既存ノードと判定できます

階層2以下は
pParent = pNodes(0)
pChilds = pParent.Nodes.Find( row("階層2"), False )
として
pChilds.Length=0なら新規のノードなどで追加
0以外なら既存のノードなので pParntにpChilds(0)を代入

pParent = pNodes(0)
m = dTbl.columns.IndexOf("階層2")
for n = m to dTbl.Columns.Count - m + 1
  pChilds = pParent.Nodes.Find( row(n), False )
  if pChilds.Length = 0 then
    pParent.Nodes.Add( row(n), row(n) )
  else
    ' 検索する親を付け替える
    pParent = pChild(0)
  end if
next
といった具合です
    • good
    • 0

階層1、階層2、階層3などの情報は 同一レコードにあるのでしょうか



データテーブルに

あ、い
あ、い、う

お、い
お、い、う
といった構造でしょうか

それとも
あ、い、う
お、い、え
の2レコードなのでしょうか

どうも前者のように思えますが ・・・

後者なら
dim row as dataRow
dim pNode as TreeNode
dim n,m as integer
m = dTbl.Columns.IndexOf("階層2")
for each row in dTbl.rows
  if row("階層1")<>"" then
    pNode = treeView1.Nodes.add( row("階層1") )
    for n = m to row.ItemArray.Length - m + 1
      pNode = pNode.Nodes.Add( row( n ) )
    next
  end if
Next
    • good
    • 0

お示しのツリーが崩れてしまっているようです


DataTableの内容を投稿なさった方がいいかもしれません

どのデータを表示したくて、どのデータは非表示にしたいとかいった情報も書き込みましょう

この回答への補足

回答いただきありがとうございます。
そもそも図が変ですね。すいません。(1)のようにしたいのですが、(2)
のようになってしまいます。

(1)

|-い
| |
|  -う

|-い
| |
| -え

(2)

|-い
| |
| -う
| -え


非表示とは上図の「い」という値にキーのようなものを持たせれば
どこの「い」か判別できるかなと思ったので、それを非表示で値を
持たせることができるのかと思って質問させていただきました。

文章がわかりずらくて申し訳ありません。

補足日時:2008/09/19 17:26
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!