- PR -

VB.net TreeView 再帰

1
投稿者投稿内容
未記入
会議室デビュー日: 2007/08/24
投稿数: 2
投稿日時: 2007-08-24 11:20
はじめまして、
VB.NETでツリー表示し、ノードを複数階層を表示することをやってますが、
なかなか、解決ができません。皆様に助けを求めに来ました。よろしくお願いします。

■環境
OS : WINDOWS XP SP2
言語: VB.NET
DB : MSDE

テーブルT_ALL、階層を大 → 小に表示すると、
TAG1 → TAG2 → TAG3 → TAG4
になります。

■テーブル5.T_ALL
ID Tag1 Tag2 Tag3 Tag4
1 1 1 1 1
2 1 1 5 1
3 2 1 1 1
4 2 3 4 2
5 3 2 5 4

表示内容は「--」内のように
---------------------------------------
1
├−1
| └−1
|  └−1
| └−5
|  └−1
2
├−1
| └−1
|  └−1
├−3
| └−4
|  └−2
3
└−2
  └−5
  └−4

---------------------------------------
データベースにはIDの情報として保存してあるが、ツリー表示は対応するNameの値を表示する

  '#--------------------------------------#
'# Form1初期ロード
'#--------------------------------------#
  Private myConn As SqlConnection
Private myCmd As SqlCommand
Private myReader As SqlDataReader
Private connectionString As String = "Initial Catalog=DB_NAME;" & "Data Source=LOCAL;Integrated Security=SSPI;"

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'TreeView内容をクリア
Me.TreeView1.Nodes.Clear()

'CONNECT SQL SERVER
myConn = New SqlConnection(connectionString)
myCmd = myConn.CreateCommand

myConn.Open()

sSQL = "SELECT DISTINCT * FROM T_ALL "
    myCmd.CommandText = sSQL
myReader = myCmd.ExecuteReader()
i = 0
Do While myReader.Read()
TreeView1.Nodes.Add(myReader.Getalue(1))
Loop
myReader.Close()
End Sub


-----------------------------------------
以上のソースは1階層目を表示するだけで、全階層を表示するには、再帰関数使うのが楽と思いますが、
どんな方法があるかをご指導ください。


◆◇◆◇◆
内容が長くすぎて、申し訳ございません。ご回答よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-08-24 11:34
TreeView のフルパス取得について

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-08-24 11:47
この場合、再帰なしでも可能でしょう。

擬似コードで示すと
コード:
Do While myReader.Read()
    parentNode as TreeNode = ルートノードをセット
    For Each tag as integer In (Tag1の値, Tag2の値, Tag3の値, Tag4の値)
        If parentNodeにtagの値がある場合 then
            node = 見つかったノードをセット
        Else
            ' 新規ノードを作成する
            node = New TeeNode()
            ' 追加しとく
            parentNodeにnodeを追加する
        End If
        
        ' 親ノードを次階層に切り替える
        parentNode = node
    Next
Loop


確認してないけど、たぶんこんな感じ。
未記入
会議室デビュー日: 2007/08/24
投稿数: 2
投稿日時: 2007-08-27 09:12
かずさん、ご解答ありがとうございます。

Tagは表示順番があるので、実際は13階層があって、例として出してあるのが4階層ですが、再帰使うほうが楽だとは思いますが、
実際出した例のまま、かずさんのコードを使ってやって見たんですが、
まだできませんでした、

もう少し詳しく説明してもらいませんか?
初心者のいいわけとはいえないですが、言葉のところのソースが。。。
どせい
大ベテラン
会議室デビュー日: 2006/10/25
投稿数: 145
投稿日時: 2007-08-27 11:01
引用:

未記入さんの書き込み (2007-08-27 09:12) より:
かずさん、ご解答ありがとうございます。

Tagは表示順番があるので、実際は13階層があって、例として出してあるのが4階層ですが、再帰使うほうが楽だとは思いますが、
実際出した例のまま、かずさんのコードを使ってやって見たんですが、
まだできませんでした、

もう少し詳しく説明してもらいませんか?
初心者のいいわけとはいえないですが、言葉のところのソースが。。。


はっきり言いなよ。
「コピペで使えるソースが欲しい」
って。

解決する気があるのなら、
じゃんぬさんの指して下さってるポイントと、かずくんさんの示して下さってる説明。
これらの、「どこがどうわからないか」を書いた方がいいと思う。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-08-27 23:00
引用:

コード:
■テーブル5.T_ALL
ID Tag1 Tag2 Tag3 Tag4
 1    1    1    1    1
 2    1    1    5    1
 3    2    1    1    1
 4    2    3    4    2
 5    3    2    5    4

1
├−1
| └−1
|    └−1
| └−5
|    └−1
2
├−1
| └−1
|    └−1
├−3
| └−4
|    └−2
3
└−2
   └−5
      └−4




データは5つしかないのに、オブジェクトは17個あるの?
1

スキルアップ/キャリアアップ(JOB@IT)