プログラム初心者の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
> 各ノードに対して個人の情報を保持しておく必要があり、実装方法に困っています。
というのは、最終決定されるまで、新たにこのノード(部署)に属することになった人を覚えておく必要がある、ということでしょうか。
TreeNode の派生クラスを作るのはどうでしょう。
好きなプロパティを持たせることができますよ。
> 各ノードに対して個人の情報を保持しておく必要があり、実装方法に困っています。
当方で、似たような所属マスタ(階層数制限無し)を作った事がありますが、
その際には、TreeNode の継承クラスに DataRow を保持させていました。
利用側のイメージ的にはこんな感じ。
Dim t As New ShozokuTreeNode(dataRow)
:
MsgBox(t.Shozoku.ShainCD)
>というのは、最終決定されるまで、新たにこのノード(部署)に属することになった人を覚えておく必要がある、ということでしょうか。
>TreeNode の派生クラスを作るのはどうでしょう。
>好きなプロパティを持たせることができますよ。
おそらく、お考えいただいてるとおりと思います。
ドラッグドロップで落ちてきた内容などもすべて覚えておき、そこからドラッグで他部署へ移動されるとリストから消えます。
最終的にその部署に所属する個人として更新したいのですが・・・
すごく初心者なので申し訳無いのですが、派生クラスとはどのように作るのでしょうか。。。
[@IT オブジェクト指向プログラミング超入門]
第4回 継承を使うために知っておくべきこと
http://www.atmarkit.co.jp/fdotnet/basics/oop04/oop04_01.html
教えていただいた内容でなんとかなりそうです。
皆様ありがとうございます。!!