組織単位リスト画面の Windows アプリの VB のコードです。
Private ReadOnly ouCol As List(Of OrganizationalUnit) 'OUのコレクション
Public Sub New()
InitializeComponent()
Dim ous = DirectoryAccess.GetOrganizationalUnits() 'OUを取得
ouCol = ous.OrderBy(Function(ou) ou.DisplayPath).ThenBy(Function(ou) ou.Name).ToList()
Me.OUBindingSource.DataSource = ouCol
Me.CountLabel.Text = String.Format("{0} 個のオブジェクト", Me.OUBindingSource.Count)
Me.AddChildNode(Nothing) '子ノードを追加
Me.OUTreeView.ExpandAll()
End Sub
Private Sub OUTreeView_AfterSelect(sender As Object, e As TreeViewEventArgs) Handles OUTreeView.AfterSelect
Dim selectedOU = ouCol.Single(Function(ou) ou.Entry.Path.Equals(e.Node.Tag.ToString()))
Me.OUBindingSource.Position = Me.OUBindingSource.IndexOf(selectedOU)
Me.ShowStoredData(selectedOU) '格納されているデータを表示
End Sub
'子ノードを追加
Private Sub AddChildNode(node As TreeNode)
Dim path = If(node Is Nothing, String.Empty, node.FullPath)
Dim childOUs = ouCol.Where(Function(ou) ou.DisplayPath.Equals(path)).ToList() '直下のOU
For Each ou In childOUs
Dim childNode = CreateNode(ou) 'ノードを作成
If node Is Nothing Then
Me.OUTreeView.Nodes.Add(childNode)
Else
node.Nodes.Add(childNode)
End If
Me.AddChildNode(childNode) '子ノードを追加
Next
End Sub
'指定した OU のノードを作成
Private Function CreateNode(ou As OrganizationalUnit) As TreeNode
Dim path = If(ou.DisplayPath.Length = 0, String.Empty, ou.DisplayPath & "/")
Return New TreeNode(ou.Name) With {.Name = path & ou.Name, .Tag = ou.Entry.Path}
End Function
'指定した OU に格納されているデータを表示
Private Sub ShowStoredData(ou As OrganizationalUnit)
Dim subItem(2) As String '名前と種類と説明の配列
Me.DataListView.Items.Clear()
For Each domainObject In ou.StoredDomainObjects '直下のオブジェクト数分
Dim objectType = DirectCast([Enum].Parse(GetType(CategoryType), domainObject.Entry.SchemaClassName, True), CategoryType)
subItem(0) = domainObject.Name '名前をセット
subItem(1) = DirectoryAccess.CategoryNames.Item(objectType) '種類をセット
subItem(2) = domainObject.Description '説明をセット
Me.DataListView.Items.Add(New ListViewItem(subItem, objectType))
Next
Me.DataCountLabel.Text = String.Format("{0} 個のオブジェクト", ou.StoredDomainObjects.Count)
End Sub
指定した OU のノードを作成する CreateNode メソッドでは、作成した TreeNode の Tag プロパティに OU の DirectoryEntry のパスをセットしてます。
これは TreeView.AfterSelect イベントで、選択された OU をリスト(ouCol)から抽出するための条件として使うからです。
選択された OU に格納されているデータを表示する ShowStoredDataメソッドでは、選択された OU の StoredDomainObjects プロパティから 直下のオブジェクトを列挙して、そのオブジェクトの名前、種類、説明を表示する ListViewItem を作って ListView に追加してます。objectType はオブジェクトの種類で、種類及び ImageList のインデックス位置になります。
種類をセットするために使ってる DirectoryAccess.CategoryNames プロパティはこのために DirectoryAccess クラス追加しました。単純にオブジェクトの日本語の名前をリストで返すだけです。
'ディレクトリ オブジェクトの種類の名前リストを取得
Public Shared ReadOnly Property CategoryNames As ReadOnlyCollection(Of String)
Get
If _categoryNames Is Nothing Then
_categoryNames = New ReadOnlyCollection(Of String)({"ユーザ", "グループ", "コンピュータ", "組織単位", "プリンタ", "共有フォルダ"})
End If
Return _categoryNames
End Get
End Property