treeviewで子ノードを追加したい。

解決


はなこ  2007-06-11 07:15:35  No: 143615

データを読んでtreeviewに移送するときに、親ノードを指定して子ノードを追加することってできますか?

データは「コード」「名称」「親コード」となっています。
階層は不定です。

検索の仕方が悪いのかヒットしなくて・・・
よろしくお願いします。


魔界の仮面弁士  2007-06-11 09:42:22  No: 143616

> 親ノードを指定して子ノードを追加することってできますか?
できますが、そもそも、どの部分で困っているのでしょうか?

・TreeView の使い方そのものが分からない。
・ノードの下に、子ノードを追加する方法がわからない。
・すでに追加されたノードを取得する方法が思いつかない。


はなこ  2007-06-11 19:00:36  No: 143617

説明不足で申しわけありません。

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
データが左記として、右記のように表示させたいんです。
階層は何階層になるかわかりません。

よろしくお願いします。


魔界の仮面弁士  2007-06-11 21:12:12  No: 143618

'とりあえず、元データが 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


魔界の仮面弁士  2007-06-11 21:43:49  No: 143619

>  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


はなこ  2007-06-12 06:24:44  No: 143620

魔界の仮面弁士さん、ありがとうございます。

Dim nodes As New Dictionary(Of String, NodeItem)()
Dim rootNodes As New List(Of NodeItem)()

でDictionaryとListが定義されていないのエラーになるのですが?

質問ばかりですいません。


魔界の仮面弁士  2007-06-12 08:18:04  No: 143621

先に
> VB2005 向けに書いています。
と書きましたように、List(Of T) や Dictionary(Of T) を使うには
VB2005 が必要です。あなたの環境はなんですか?


はなこ  2007-06-12 08:43:43  No: 143622

環境はVisual Studio 2005です。


魔界の仮面弁士  2007-06-12 08:54:46  No: 143623

ふむ。標準では使えるはずなのですがね。

では、.vb ファイルのコードの一番先頭(Public Class Form1より前)に、
  Imports System.Collections.Generic
と書くか、もしくは、それぞれの変数宣言を、
  Dim rootNodes As New System.Collections.Generic.List(Of NodeItem)()
のようにフルネームで指定してみてください。


はなこ  2007-06-12 17:48:51  No: 143624

できました!

お世話になりました。ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加