ノードごとに他データを保持するには?

解決


mama  2008-07-23 12:34:09  No: 144998  IP: 192.*.*.*

プログラム初心者のmamaと申します。
今、VB.NET2005で開発を行っており、既存プログラムの修正を行っております。
実装に困っている箇所があり皆様にアドバイスいただけないかと書き込みをした次第です。

現状の動作:
SQLを発行し、会社情報を取得→取得した会社情報をtreeViewにツリー表示(組織階層で表示されています。[会社名-支社名-営業所名-部署名])
ツリーをドラッグアンドドロップすることにより、階層(所属)を変更できるようになっています。
下記のような、ツリー表示を行うコードがあり、ノードはそれぞれ[得意先ID(一意キー)]をもっています。
それぞれの得意先は[会社コード][支社コード][営業所コード]・・・を持っておりそれぞれ、ぶら下り関係を持っています。
例:会社コード1:支社コード以下0  ⇒会社
  :会社コード1:支社コード2      ⇒会社1に所属する支社
という感じになっております。

今回新たに、階層に所属する個人をリストビューに表示し、さらにドラッグアンドドロップで所属変更可能とし、最終確定ボタンで更新するという動きを追加することになりました。
※個人の取得は各得意先IDから会社コードなどを取得し、会社コード、支店コード、営業所コード・・・と一致するデータを取得。

各ノードに対して個人の情報を保持しておく必要があり、実装方法に困っています。

どうか、小さなヒントになるようなことでも結構ですのでアドバイスいただけませんでしょうか。

よろしくお願いいたします。

以下ツリー表示部のコードです。

      Dim TargetNodes() As TreeNode
            Dim key As String
            Dim keyShiten As String = String.Empty
            Dim keyEigyosho As String = String.Empty
            Dim keyShozoku1 As String = String.Empty
            Dim Blevel As Integer = -1
            Dim BNode As TreeNode = Nothing


            For j As Integer = 0 To List.Count - 1
                With List.Item(j)
                    If addFlg = False Then 'TopNode
                        
                        Me.treDetail.Nodes.Add(.TokuisakiId, Me.GetDispNameKj(List.Item(j)))

                        addFlg = True
                 
                    Else
                        '自分の上位の階層を検索
                        key = Me.GetKeyNo(List.Item(j), List.Item(j).SoshikiKb)
                        If key <> "" Then
                            TargetNodes = Me.treDetail.Nodes.Find(key, True)
                            If TargetNodes.Length > 0 Then
                                TargetNodes(0).Nodes.Add(.TokuisakiId, Me.GetDispNameKj(List.Item(j)))
                               
                            Else
                                Me.treDetail.SelectedNode.Nodes.Add(.TokuisakiId, Me.GetDispNameKj(List.Item(j)))
                            End If

                            Blevel = -1
                            BNode = Nothing
                        Else
                            If .SoshikiKb.Trim = Blevel.ToString Then
                                BNode.Nodes.Add(.TokuisakiId, Me.GetDispNameKj(List.Item(j)))
                               
                            Else
                                Select Case .SoshikiKb.Trim
                                    Case "3" '営業所
                                        '会社にダミー支店を追加
                                        keyShiten = BLANK_NODE.KEY_SHITEN + Me._SeqShiten.ToString()
                                        Me.treDetail.Nodes(0).Nodes.Add(keyShiten, BLANK_NODE.VALUE_SHITEN)
                                        Me._SeqShiten += 1
                                        '不具合修正 2008/05/23 k-asano END
                                        'ダミー支店の下に営業所を設定
                                        TargetNodes = Me.treDetail.Nodes.Find(keyShiten, True)
                                        If TargetNodes.Length > 0 Then
                                            TargetNodes(0).Nodes.Add(.TokuisakiId, Me.GetDispNameKj(List.Item(j)))
                                            BNode = TargetNodes(0)
                                        End If
                                    Case "4" '所属1
                                        '支店があるか検索
                                        key = Me.GetKeyNo(List.Item(j), _
                                                          Convert.ToString(Convert.ToInt16(List.Item(j).SoshikiKb) - 1))
                                        If key <> "" Then
                                            TargetNodes = Me.treDetail.Nodes.Find(key, True)
                                            If TargetNodes.Length > 0 Then
                                                'ダミー営業所を追加
                                                keyEigyosho = BLANK_NODE.KEY_EIGYOSHO + Me._SeqEighosho.ToString()
                                                TargetNodes(0).Nodes.Add(keyEigyosho, BLANK_NODE.VALUE_EIGYOSHO)
                                                Me._SeqEighosho += 1
                                            End If
                                        Else
                                            '会社にダミー支店を追加
                                            key = BLANK_NODE.KEY_SHITEN + Me._SeqShiten.ToString()
                                            Me.treDetail.Nodes(0).Nodes.Add(keyShiten, BLANK_NODE.VALUE_SHITEN)
                                            Me._SeqShiten += 1
                                            'ダミー支店の下にダミー営業所を設定
                                            TargetNodes = Me.treDetail.Nodes.Find(keyShiten, True)
                                            If TargetNodes.Length > 0 Then
                                                keyEigyosho = BLANK_NODE.KEY_EIGYOSHO + Me._SeqEighosho.ToString()
                                                TargetNodes(0).Nodes.Add(keyEigyosho, BLANK_NODE.VALUE_EIGYOSHO)
                                                Me._SeqEighosho += 1
                                                
                                            End If
                                        End If
                                        'ダミー営業所の下に所属1を追加
                                        TargetNodes = Me.treDetail.Nodes.Find(keyEigyosho, True)
                                        If TargetNodes.Length > 0 Then
                                            TargetNodes(0).Nodes.Add(.TokuisakiId, Me.GetDispNameKj(List.Item(j)))
                                            
                                            BNode = TargetNodes(0)
                                        End If
                                    Case "5" '所属2
                                        '営業所があるか検索
                                        key = Me.GetKeyNo(List.Item(j), _
                                                          Convert.ToString(Convert.ToInt16(List.Item(j).SoshikiKb) - 1))
                                        If key <> "" Then '.TokuisakiId Then
                                            TargetNodes = Me.treDetail.Nodes.Find(key, True)
                                            If TargetNodes.Length > 0 Then
                                                'ダミー所属1を追加
                                                keyShozoku1 = BLANK_NODE.KEY_SHOZOKU_1 + Me._SeqEighosho.ToString()
                                                TargetNodes(0).Nodes.Add(keyShozoku1, BLANK_NODE.VALUE_SHOZOKU_1)
                                                Me._SeqShozoku1 += 1
                                                
                                            End If
                                        Else
                                            '支店があるか検索
                                            key = Me.GetKeyNo(List.Item(j), _
                                                              Convert.ToString(Convert.ToInt16(List.Item(j).SoshikiKb) - 2))
                                            If key <> "" Then '.TokuisakiId Then
                                                TargetNodes = Me.treDetail.Nodes.Find(key, True)
                                                If TargetNodes.Length > 0 Then
                                                    '支店にダミー営業所を追加
                                                    
                                                    keyEigyosho = BLANK_NODE.KEY_EIGYOSHO + Me._SeqEighosho.ToString()
                                                    TargetNodes(0).Nodes.Add(keyEigyosho, BLANK_NODE.VALUE_EIGYOSHO)
                                                    Me._SeqEighosho += 1
                                                   
                                                End If
                                            Else
                                                '会社にダミー支店を追加
                                                key = BLANK_NODE.KEY_SHITEN + Me._SeqShiten.ToString()
                                                Me.treDetail.Nodes(0).Nodes.Add(keyShiten, BLANK_NODE.VALUE_SHITEN)
                                                Me._SeqShiten += 1
                                               
                                                'ダミー支店の下にダミー営業所を設定
                                                TargetNodes = Me.treDetail.Nodes.Find(keyShiten, True)
                                                If TargetNodes.Length > 0 Then
                                                    keyEigyosho = BLANK_NODE.KEY_EIGYOSHO + Me._SeqEighosho.ToString()
                                                    TargetNodes(0).Nodes.Add(keyEigyosho, BLANK_NODE.VALUE_EIGYOSHO)
                                                    Me._SeqEighosho += 1
                                                  
                                                End If
                                            End If
                                            'ダミー営業所の下にダミー所属1を追加
                                            TargetNodes = Me.treDetail.Nodes.Find(keyEigyosho, True)
                                            If TargetNodes.Length > 0 Then
                                                keyShozoku1 = BLANK_NODE.KEY_SHOZOKU_1 + Me._SeqEighosho.ToString()
                                                TargetNodes(0).Nodes.Add(keyShozoku1, BLANK_NODE.VALUE_SHOZOKU_1)
                                                Me._SeqShozoku1 += 1
                                                
                                            End If
                                        End If
                                        'ダミー所属1の下に所属2を追加
                                        TargetNodes = Me.treDetail.Nodes.Find(keyShozoku1, True)
                                        If TargetNodes.Length > 0 Then
                                            TargetNodes(0).Nodes.Add(.TokuisakiId, Me.GetDispNameKj(List.Item(j)))
                                            BNode = TargetNodes(0)
                                        End If

                                    Case Else
                                        '不具合修正 2008/05/23 k-asano START
                                        '親ノード検索
                                        key = Me.GetKeyNo(List.Item(j), Convert.ToString(Convert.ToInt16(List.Item(j).SoshikiKb) - 1))
                                        Dim parentNode As TreeNode = Nothing
                                        parentNode = Me.SearchParentNode(List.Item(j), key, Convert.ToInt16(List.Item(j).SoshikiKb) - 1)

                                        'ノードを追加
                                        parentNode.Nodes.Add(.TokuisakiId, Me.GetDispNameKj(List.Item(j)))
                                        BNode = parentNode
                                        
                                End Select
                            End If

                            Blevel = CType(.SoshikiKb.Trim, Integer)
                        End If
                    End If
                End With
            Next

           

            'Nodesの展開
            Me.treDetail.TopNode.ExpandAll()

        End Sub

編集 削除
シャノン  2008-07-23 12:51:33  No: 144999  IP: 192.*.*.*

> 各ノードに対して個人の情報を保持しておく必要があり、実装方法に困っています。

というのは、最終決定されるまで、新たにこのノード(部署)に属することになった人を覚えておく必要がある、ということでしょうか。

TreeNode の派生クラスを作るのはどうでしょう。
好きなプロパティを持たせることができますよ。

編集 削除
魔界の仮面弁士  2008-07-23 12:52:12  No: 145000  IP: 192.*.*.*

> 各ノードに対して個人の情報を保持しておく必要があり、実装方法に困っています。

当方で、似たような所属マスタ(階層数制限無し)を作った事がありますが、
その際には、TreeNode の継承クラスに DataRow を保持させていました。

利用側のイメージ的にはこんな感じ。
  Dim t As New ShozokuTreeNode(dataRow)
    :
  MsgBox(t.Shozoku.ShainCD)

編集 削除
mama  2008-07-23 13:19:38  No: 145001  IP: 192.*.*.*

>というのは、最終決定されるまで、新たにこのノード(部署)に属することになった人を覚えておく必要がある、ということでしょうか。

>TreeNode の派生クラスを作るのはどうでしょう。
>好きなプロパティを持たせることができますよ。

おそらく、お考えいただいてるとおりと思います。
ドラッグドロップで落ちてきた内容などもすべて覚えておき、そこからドラッグで他部署へ移動されるとリストから消えます。

最終的にその部署に所属する個人として更新したいのですが・・・

すごく初心者なので申し訳無いのですが、派生クラスとはどのように作るのでしょうか。。。

編集 削除
特攻隊長まるるう  2008-07-23 14:52:14  No: 145002  IP: 192.*.*.*

[@IT オブジェクト指向プログラミング超入門]
第4回 継承を使うために知っておくべきこと
http://www.atmarkit.co.jp/fdotnet/basics/oop04/oop04_01.html

編集 削除
mama  2008-07-23 16:33:10  No: 145003  IP: 192.*.*.*

教えていただいた内容でなんとかなりそうです。

皆様ありがとうございます。!!

編集 削除