データを読んでtreeviewに移送するときに、親ノードを指定して子ノードを追加することってできますか?
データは「コード」「名称」「親コード」となっています。
階層は不定です。
検索の仕方が悪いのかヒットしなくて・・・
よろしくお願いします。
> 親ノードを指定して子ノードを追加することってできますか?
できますが、そもそも、どの部分で困っているのでしょうか?
・TreeView の使い方そのものが分からない。
・ノードの下に、子ノードを追加する方法がわからない。
・すでに追加されたノードを取得する方法が思いつかない。
説明不足で申しわけありません。
TreeViewを使うのも初めてなので、マニュアル見つつコーディングしています。
コード 名称 親コード
001 親1 000 親1--子1
002 子1 001 |
003 子2 001 --子2
004 親2 000
005 子1 004 親2--子1
006 孫1 005 |
--孫2
データが左記として、右記のように表示させたいんです。
階層は何階層になるかわかりません。
よろしくお願いします。
'とりあえず、元データが DataTable にあると仮定して……
Private dataTable1 As New DataTable
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
dataTable1.Columns.Add("コード")
dataTable1.Columns.Add("名称")
dataTable1.Columns.Add("親コード")
dataTable1.Rows.Add("001", "親1", "000")
dataTable1.Rows.Add("002", "子1", "001")
dataTable1.Rows.Add("003", "子2", "001")
dataTable1.Rows.Add("004", "親2", "000")
dataTable1.Rows.Add("005", "子1", "004")
dataTable1.Rows.Add("006", "孫1", "005")
dataTable1.AcceptChanges()
End Sub
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
Dim view As New DataView(dataTable1)
view.Sort = "親コード,コード"
With TreeView1.Nodes
For Each row As DataRowView In view
Dim code As String = row("コード").ToString()
Dim itemName As String = row("名称").ToString()
Dim parentCode As String = row("親コード").ToString()
Dim parentNodes() As TreeNode = .Find(parentCode, True)
If parentNodes.Length > 0 Then
parentNodes(0).Nodes.Add(code, itemName)
Else
.Add(code, itemName)
End If
Next
End With
End Sub
> view.Sort = "親コード,コード"
失礼。コード順に処理する方法だと、
dataTable1.Rows.Add("050", "親1", "000")
dataTable1.Rows.Add("030", "子1", "050")
dataTable1.Rows.Add("020", "孫1", "030")
のようなデータの時にうまくいきませんね。
以下、訂正コード。VB2005 向けに書いています。
=================
Public Class NodeItem
Inherits TreeNode
Public ReadOnly Code As String
Public ReadOnly ParentCode As String
Public Sub New(ByVal row As DataRow)
MyClass.Text = row("名称").ToString()
Code = row("コード").ToString()
ParentCode = row("親コード").ToString()
End Sub
End Class
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
'親子関係無しでノードを作成
Dim nodes As New Dictionary(Of String, NodeItem)()
For Each row As DataRow In dataTable1.Rows
Dim item As New NodeItem(row)
nodes.Add(item.Code, item)
Next
'親子関係を構築
Dim rootNodes As New List(Of NodeItem)()
For Each item As NodeItem In nodes.Values
If nodes.ContainsKey(item.ParentCode) Then
nodes(item.ParentCode).Nodes.Add(item)
Else
rootNodes.Add(item)
End If
Next
'画面に反映
TreeView1.Nodes.AddRange(rootNodes.ToArray())
End Sub
魔界の仮面弁士さん、ありがとうございます。
Dim nodes As New Dictionary(Of String, NodeItem)()
Dim rootNodes As New List(Of NodeItem)()
でDictionaryとListが定義されていないのエラーになるのですが?
質問ばかりですいません。
先に
> VB2005 向けに書いています。
と書きましたように、List(Of T) や Dictionary(Of T) を使うには
VB2005 が必要です。あなたの環境はなんですか?
環境はVisual Studio 2005です。
ふむ。標準では使えるはずなのですがね。
では、.vb ファイルのコードの一番先頭(Public Class Form1より前)に、
Imports System.Collections.Generic
と書くか、もしくは、それぞれの変数宣言を、
Dim rootNodes As New System.Collections.Generic.List(Of NodeItem)()
のようにフルネームで指定してみてください。
できました!
お世話になりました。ありがとうございました。
ツイート | ![]() |