マイナーでもいいよね??

殆どVB系、でも .NET じゃない VB は知らないよん

目次

Blog 利用状況

書庫

日記カテゴリ

サンプルアプリの画面側 ~ユーザ、コンピュータのリスト~

クラスライブラリ側に続いてアプリケーション側。どのリスト画面も基本的には次の設定・処理をしてます。

・BindingSource コンポーネントのデータソースに クラスライブラリ側のクラスを設定
・TextBox、Label、CheckBox のコントロールのプロパティに クラスのプロパティ(単一値)をバインド
・表示に必要なオブジェクトのリストを取得、フォームやコントロールを初期設定
・ListBox、ListView の Items プロパティに コードから項目を追加
・複数値をもつ クラスのプロパティはコードから設定
・一覧の ListBox.SelectedIndexChanged イベントハンドラの実装
・デザイナのファイルの Dispose メソッド内に オブジェクトのリストを解放するコードを追記

メイン画面はこんな感じ。(左がドメインにログオンした時ので右がローカルログオンした時の)

ADメイン画面 ローカルメイン画面

「ドメイン関連情報」ボタンはドメイン情報の表示を行うものです。

ユーザのリストはローカル用も考慮して実装します。

まずはデザイン画面。(クリックすると新しいウィンドウで拡大図が表示されます。)

デザイナローカルユーザ用のコントロールは後ろに隠れてます。

実行時の画面。左がドメインログオン時で右がローカルログオン時。(クリックすると新しいウィンドウで拡大図が表示されます。)

ユーザリスト ローカルユーザリスト

実装はこんな感じ。

プライベートフィールド

Private ReadOnly users As IEnumerable(Of IUser)     'ユーザのリスト
Private ReadOnly groups As IEnumerable(Of IGroup)   'グループのリスト
Private ReadOnly groupListBox As ListBox
Private ReadOnly userBindingSource As BindingSource


コンストラクタ

Public Sub New()
  ' この呼び出しはデザイナーで必要です。
  InitializeComponent()
  ' InitializeComponent() 呼び出しの後で初期化を追加します。

  users = DirectoryAccess.GetUsers()      'ユーザのリストを取得
  groups = DirectoryAccess.GetGroups()    'グループのリストを取得
  If DirectoryAccess.IsLogonDomain Then    'ドメインにログオンしている時
    Dim domainUsers As New List(Of DomainUser)()
    For Each user As DomainUser In users
      domainUsers.Add(user)
    Next

    userBindingSource = Me.DomainUserBindingSource
    userBindingSource.DataSource = domainUsers
    groupListBox = Me.lbox_groupdomain
    Me.pnl_local.Visible = False
  Else    'ドメインにログオンしていない時
    Dim localUsers As New List(Of LocalUser)()
    For Each user As LocalUser In users
      localUsers.Add(user)
    Next

    userBindingSource = Me.LocalUserBindingSource
    userBindingSource.DataSource = localUsers
    groupListBox = Me.lbox_grouplocal
    Me.pnl_domain.Visible = False
    Me.lbox_user.Height -= 32
    Me.Height -= 100
  End If
  Me
.lbox_user.Items.AddRange(users.ToArray())    'ユーザのリストボックスにユーザを追加

  Me.lbl_count.Text = String.Format("{0} 個のオブジェクト", userBindingSource.Count)
  Me.lbox_user.SelectedIndex = userBindingSource.Position
  Call ShowBelongGroups()   '所属するグループを表示
End Sub


イベントハンドラ

Private Sub lbox_user_SelectedIndexChanged(
  sender As Object, e As EventArgs) Handles lbox_user.SelectedIndexChanged

  '選択されている項目を選択してもイベントが発生する
  If userBindingSource.Position = Me.lbox_user.SelectedIndex Then
    Return
  End If

  userBindingSource.Position = Me.lbox_user.SelectedIndex
  Call ShowBelongGroups()   '所属するグループを表示
End Sub


プライベートメソッド

Private Sub ShowBelongGroups()    '所属するグループを表示
  Dim user = DirectCast(userBindingSource.Current, IUser)   '選択されたユーザ
  groupListBox.Items.Clear()
  For Each group In groups
    If group.Native.IsMember(user.Entry.Path) Then    'グループに所属している時
      groupListBox.Items.Add(group.Name)
    End If
  Next

  If DirectoryAccess.IsLogonDomain Then    'ドメインにログオンしている時
    Dim primaryGroupID = DirectCast(user, DomainUser).PrimaryGroupID
    groupListBox.Items.Add(DirectoryAccess.GroupTokens.Item(primaryGroupID))  ‘プライマリ グループを追加
  End If
End Sub


デザイナファイルの Dispose メソッド内の components.Dispose() の下に次のコードを追記

DirectoryAccess.DisposeItems(users)
DirectoryAccess.DisposeItems(groups)


続いてコンピュータのリスト。(グループリストは長いので別途書きます。)

まずは実行時の画面。(クリックすると新しいウィンドウで拡大図が表示されます。)

コンピュータリスト

実装はこんな感じ。

プライベートフィールド

Private ReadOnly computers As IEnumerable(Of Computer)    'コンピュータのリスト
Private ReadOnly groups As IEnumerable(Of IGroup)    'グループのリスト

コンストラクタ

Public Sub New()
  ' この呼び出しはデザイナーで必要です。
  InitializeComponent()
  ' InitializeComponent() 呼び出しの後で初期化を追加します。

  computers = DirectoryAccess.GetComputers()    'コンピュータのリストを取得
  groups = DirectoryAccess.GetGroups()    'グループのリストを取得
  Me.ComputerBindingSource.DataSource = computers
  Me.lbox_pc.Items.AddRange(computers.ToArray())    'コンピュータのリストボックスにコンピュータを追加

  Me.lbl_count.Text = String.Format("{0} 個のオブジェクト", Me.ComputerBindingSource.Count)
  Me.lbox_pc.SelectedIndex = Me.ComputerBindingSource.Position
  Call ShowBelongGroups()   '所属するグループを表示
End Sub


イベントハンドラ

Private Sub lbox_pc_SelectedIndexChanged(
  sender As Object, e As EventArgs) Handles lbox_pc.SelectedIndexChanged

  '選択されている項目を選択してもイベントが発生する
  If Me.ComputerBindingSource.Position = Me.lbox_pc.SelectedIndex Then
    Return
  End If

  Me.ComputerBindingSource.Position = Me.lbox_pc.SelectedIndex
  Call ShowBelongGroups()   '所属するグループを表示
End Sub


プライベートメソッド

Private Sub ShowBelongGroups()    '所属するグループを表示
  Dim pc = DirectCast(Me.ComputerBindingSource.Current, Computer)   '選択されたコンピュータ
  Me.lbox_group.Items.Clear()

  For Each group In groups
    If group.Native.IsMember(pc.Entry.Path) Then    'グループに所属している時
      Me.lbox_group.Items.Add(group.Name)
    End If
  Next
  Me
.lbox_group.Items.Add(DirectoryAccess.GroupTokens.Item(pc.PrimaryGroupID))  ‘プライマリ グループを追加
End Sub


デザイナファイルの Dispose メソッド内の components.Dispose() の下に次のコードを追記

DirectoryAccess.DisposeItems(computers)
DirectoryAccess.DisposeItems(groups)

 

おまけ

Excel で 名前ボックス(数式バーの左にあるやつ)にセルのアドレスを入力するとそのセルを選択・表示できます。(「A1」と入力:「Application.Goto "R1C1", True」に相当)

投稿日時 : 2011年7月20日 18:45

コメントを追加

# サンプルアプリの画面側、一部変更 2011/07/26 0:36 マイナーでもいいよね??

サンプルアプリの画面側、一部変更

# qniByfxDnEk 2011/09/29 23:16 http://oemfinder.com

koxZVB Of course, I understand a little about this post but will try cope with it!!...

# YQKaNFLorjaON 2011/10/18 16:19 http://www.cpc-software.com/products/Download-Micr

Pleased to read intelligent thoughts in Russian. I`ve been living in England for already 5 years!...

# MjXldqckoHIBqmVJzOo 2011/10/18 17:26 http://www.best-software.net/vend-name/adobe

Sent the first post, but it wasn`t published. I am writing the second. It's me, the African tourist.

# pzRgvfrRvoaK 2011/10/18 17:30 http://www.software-stock.com/brand/adobe

Hello! Read the pages not for the first day. Yes, the connection speed is not good. How can I subscribe? I would like to read you in the future!...

# skAPvZotyPxRWkhq 2011/11/02 5:12 http://www.pharmaciecambier.com/

The author deserves for the monument:D

# TyefDOlIEvSSy 2011/11/07 19:05 http://www.metalland.net/loans/

I do`t regret that spent a few of minutes for reading. Write more often, surely'll come to read something new!...

# DCziPuwjbARJ 2011/11/07 19:49 http://www.farmaciaunica.com/

It's pleasant sitting at work to distract from it?to relax and read the information written here:D

# fzQIbdvSnSEjV 2011/11/08 6:26 http://papillomasfree.com

Informative, but not convincing. Something is missing but what I can not understand. But I will say frankly: bright and benevolent thoughts!...

# TmxodfXODOhXNEmocA 2011/11/12 22:10 http://optclinic.com/

Received the letter. I agree to exchange the articles.

# WhJGUgkmGMvQTfM 2011/11/13 18:31 http://sildenafil-citrate.net/

Very amusing thoughts, well told, everything is in its place:D

# XAVGeBIXnLIVADfl 2011/11/16 2:07 http://www.discountwatchstore.com/Fossil-Watches_c

Sometimes I also see something like this, but earlier I didn`t pay much attention to this!...

# BHSWpzjbZeyU 2011/11/16 3:19 http://www.hansensurf.com/Billabong-Backpacks.html

Yet, much is unclear. Could you describe in more details!...

# QzhmikvAcaFxQVaxRy 2011/11/16 3:45 http://www.laurenslinens.com/xl-twin-sheets.html

I serched through the internet and got here. What a wonderful invention of the mankind. With the help of the network you communicate, learn, read !... That helped us to get acquainted!...

# aJWYlACedSixOxvc 2011/11/16 20:35 http://www.solution-naturelle.com/

Author, keep doing in the same way..!

タイトル
名前
URL
コメント