
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
No.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
としてみてください
教えていただいた「Node.Textとの比較でしか探していない」が原因
でした。上記を組み込んだところ解決しました!
本当にありがとうございました。
No.3
- 回答日時:
前者のような構造なら
ノードを追加する際に
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
といった具合です
No.2
- 回答日時:
階層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
No.1
- 回答日時:
お示しのツリーが崩れてしまっているようです
DataTableの内容を投稿なさった方がいいかもしれません
どのデータを表示したくて、どのデータは非表示にしたいとかいった情報も書き込みましょう
この回答への補足
回答いただきありがとうございます。
そもそも図が変ですね。すいません。(1)のようにしたいのですが、(2)
のようになってしまいます。
(1)
あ
|-い
| |
| -う
お
|-い
| |
| -え
(2)
あ
|-い
| |
| -う
| -え
お
非表示とは上図の「い」という値にキーのようなものを持たせれば
どこの「い」か判別できるかなと思ったので、それを非表示で値を
持たせることができるのかと思って質問させていただきました。
文章がわかりずらくて申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
昔Winnyってありましたけど、あ...
-
TreeViewで複数ノードの選択は...
-
C#でTreeViewのCheckBoxのサイ...
-
ルート要素ノードが2個ある場合?
-
TreeView の初期表示について
-
ツリービューの使い方が・・・
-
【vb6】イメージリストに対する...
-
4色定理はなぜグラフ理論で証...
-
SNMP リンクダウンとノードダ...
-
CPUの考え方を教えてください ...
-
コンテキストメニュークリック...
-
TreeVIewのノード名を編集する...
-
XMLで要素が記述された順番に意...
-
xmlのテキストにリンクを張りた...
-
ブレークポイントで止らない
-
XSLでXMLデータをタブ区切りデ...
-
使用できる文字の規約
-
DTDファイルをクラスパスから読...
-
MSXMLを使ってノードを削除した...
-
Delphiのxmlデータバインディン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
ルート要素ノードが2個ある場合?
-
SNMP リンクダウンとノードダ...
-
複数のマックPCによる数値計算...
-
同じタグ名の項目取得
-
C# TreeView 効率良いノード追...
-
C#でTreeViewのCheckBoxのサイ...
-
昔Winnyってありましたけど、あ...
-
2分探索木の高さを求めるプロ...
-
ツリーでのアイコンの設定
-
各ノードの行数取得
-
ツリービューのノードをダブル...
-
ノードとは
-
TreeVIewのノード名を編集する...
-
あるノードリストに、特定の名...
-
最短路問題について
-
TreeViewコントロールについて
-
XML::LibXMLのfindnodes()で、...
-
XML文書の指定した属性値を持つ...
-
ツリービューの使い方が・・・
おすすめ情報