
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を探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA セル間のリンク修正につい...
-
【マクロ】シートの変数へ入れ...
-
Vba Array関数について教えてく...
-
【マクロ】並び替えの範囲が、...
-
vba textboxへの入力について教...
-
複数のExcelファイルをマージす...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
VBAでCOPYを繰り返すと、処理が...
-
【マクロ】開いているブックの...
-
エクセルVBAコードで教えて下さ...
-
vb.net(vs2022)のtextboxのデザ...
-
VBAの「To」という語句について
-
[VB.net] ボタン(Flat)のEnable...
-
Excelのマクロについて教えてく...
-
以下のプログラムの実行結果は...
-
VBAでセルの書式を変えずに文字...
-
Vba セルの4辺について罫線が有...
-
vbsでのwebフォームへの入力制限?
-
エクセルのマクロについて教え...
-
エクセルの改行について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
ルート要素ノードが2個ある場合?
-
SNMP リンクダウンとノードダ...
-
昔Winnyってありましたけど、あ...
-
C#でTreeViewのCheckBoxのサイ...
-
ノードとは
-
ツリービューのノードをダブル...
-
同じタグ名の項目取得
-
あるノードリストに、特定の名...
-
TreeView の初期表示について
-
TreeVIewのノード名を編集する...
-
TreeViewで複数ノードの選択は...
-
複数のマックPCによる数値計算...
-
C# TreeView 効率良いノード追...
-
TreeViewに重複する値をセット
-
2分探索木の高さを求めるプロ...
-
Ciscoルータやスイッチを使用し...
-
各ノードの行数取得
-
VB2005 TreeViewの任意ノード選択
-
4色定理はなぜグラフ理論で証...
おすすめ情報