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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- Visual Basic(VBA) VBAが止まります。 1 2022/09/02 14:51
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
ルート要素ノードが2個ある場合?
-
XML::LibXMLのfindnodes()で、...
-
同じタグ名の項目取得
-
C++における並列処理に関する質...
-
C# TreeViewのノードの判定
-
ツリービューのノードをダブル...
-
C# TreeView 効率良いノード追...
-
あるノードリストに、特定の名...
-
XMLで要素が記述された順番に意...
-
UTF-8でエンコーディングとはど...
-
DTDファイルをクラスパスから読...
-
特殊記号が勝手にエスケープさ...
-
バッチファイルでテキストファ...
-
XMLを出力する時のエラー原因
-
変数の宣言について
-
IEが表示できないXML
-
VB6でXMLを処理するには
-
TOMCAT起動エラー
-
Access2000レポート
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
昔Winnyってありましたけど、あ...
-
SNMP リンクダウンとノードダ...
-
ルート要素ノードが2個ある場合?
-
あるノードリストに、特定の名...
-
同じタグ名の項目取得
-
コンテキストメニュークリック...
-
ノードとは
-
XML文書の指定した属性値を持つ...
-
ツリービューのノードをダブル...
-
2分探索木の高さを求めるプロ...
-
C# TreeView 効率良いノード追...
-
VB6.0でDOMを使用して...
-
スケールフリーネットワークをC...
-
複数のマックPCによる数値計算...
-
C#でtreeviewの指定ノードを選...
-
TreeViewに重複する値をセット
-
ツリービューの使い方が・・・
-
各ノードの行数取得
-
TreeViewの再表示のちらつきを...
おすすめ情報