2014年2月1日土曜日

VB ユーザー毎に Form のコントロールを制御する

アプリを作成していて、ユーザー毎に権限を与え、利用形態を制限したい事があります。
例えば、UserA には変更ボタンを押させるが、UserB には閲覧しか認めないとか。
色々な実装方法があるかとは思いますが、ここでは一例を示します。
クラスをひとつ設けて、コントロールの表示や入力の可否をユーザー名毎に設定するやり方です。


先ず、Form に以下のコントロールを貼り付けて下さい。
 Label 1
 Label 2
 ComboBox1
 Button1
 Button2
 TextBox1
制御するのは、Button1 と TextBox1 です。
これ以外は、挙動の確認用 もしくは クラスの機能説明用です。

さて、コードです。

Button1 と TextBox1 の制御用のクラス
Public Class ControlUsers

    Public appUser As String = System.Environment.GetEnvironmentVariable("UserName")
    Public IsUseForm1Button1 As Boolean
    Public IsUseForm1Textbox1 As Boolean

    'Set IsUseXxx Controls
    Public Sub New()
        Initialize()
    End Sub

    Public Sub Reset(ByVal anotherUser As String)
        appUser = anotherUser
        Initialize()
    End Sub

    Private Sub Initialize()
        Select Case appUser
            Case "Taro"
                IsUseForm1Button1 = True
                IsUseForm1Textbox1 = True
            Case "Jiro"
                IsUseForm1Button1 = False
                IsUseForm1Textbox1 = False
            Case "Saburo"
                IsUseForm1Button1 = True
                IsUseForm1Textbox1 = False
            Case Else
                IsUseForm1Button1 = False
                IsUseForm1Textbox1 = False
        End Select
    End Sub

End Class

実際に制御されるクラス ( Form1 )
Public Class Form1

    Dim userLevel As New ControlUsers

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'for sumple
        Me.ComboBox1.Items.Add("Taro")
        Me.ComboBox1.Items.Add("Jiro")
        Me.ComboBox1.Items.Add("Saburo")
        Me.ComboBox1.SelectedIndex = 0
        Me.Button2.Text = "AnotherUse"
        'status
        Me.Label1.Text = userLevel.appUser
        Me.Label2.Text = userLevel.appUser
        'set form controls
        Me.Button1.Enabled = userLevel.IsUseForm1Button1
        Me.TextBox1.Visible = userLevel.IsUseForm1Textbox1
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        userLevel.Reset(Me.ComboBox1.Text)
        Me.Label2.Text = userLevel.appUser
        Me.Button1.Enabled = userLevel.IsUseForm1Button1
        Me.TextBox1.Visible = userLevel.IsUseForm1Textbox1
    End Sub

End Class

Form1 の実行画面です。  あっ、ユーザー名の部分は画像訂正してます、ハイ。



Form1 を実行すると、私のユーザー名が  ControlUsers クラスで指定した設定用ユーザー名 Taro/Jiro/Saburo ではないので、
最後の Else 扱いで画面が表示されます。
ComboBox1 で別の名前を選択し、Button2 を押すと、その資格で画面が再表示されます。
   う~~~、Form1 の画面構成、失敗 !  TextBox1 と Button1 & Label2 を離れたままに ...  分りずらぁ ... 。
   これじゃぁ、真ん中を操作して、その上下が変わるので、 やはり、分りずらぁ ... 。  直す元気なく消沈。  ご勘弁を。

この例では、設定用ユーザー名と実際のユーザー名は 1:1 対応ですが、
設定用ユーザー名の代わりに、所属するグループ名の定義を加え、1: 多 対応の定義に変える事も可能でしょう。
また、この例では、コード内に直接、設定用ユーザー名と画面制御の可否を定義していますが、
この様なハードコードから 別の方法に切り替える事 も出来ますね。  説明用に、分り易く、ハードコードで書いてます。
また、Form の各種コントロールのプロパティも、.Enabled や .Visible 以外に、.ReadOnly 等にも使えますね。 例: DataGridView 。
おっと、それから、この例は、説明用なので Form1.vb の中に、ふたつのクラスを入れていますが、
別ファイルとして分離する方が望ましいでしょう。
この例の考え方を基に、色々と、変えて見て下さい。


0 件のコメント:

コメントを投稿