Dalam pembuatan aplikasi windows (Desktop application) seringkali kita membuat security applicationnya yang di customizenya sendiri berdasarkan custom role based. Artinya pada aplikasi tsb dibuatkan sebuah tabel yang berisi user name dan hak akses dari user name tsb yang berupa nama-nama (teks) menu yang boleh diakses. Ya secara sederhananya seperti itu...
Di bawah ini saya berikan contoh bagaimana caranya menu-menu yang dibuat dengan ToolStripMenu (Visual Studio 2005) ditampilkan secara dinamis berdasarkan data di tabel tsb yang di filter berdasarkan user name yang login. Atau kita bisa membuatnya berdasarkan Custom Role, misalnya role untuk Manager, role untuk Operator, role untuk Supervisor. Masing-masing role tersebut memiliki hak akses menunya masing-masing. Untuk contoh dibawah ini saya menggunakannya berdasarkan Custom Role.
Langkah pertama sudah pasti kita buat terlebih dahulu tabelnya. Tabel yang dibuat bisa berupa tabel :
- UsersTable : UserName, Password, RoleID
_ RolesTable : RoleID, RoleName
- RolesDetail : RoleID, Menu
1: Private Sub PopulateRoleDetails()
2: '//asumsi variable RoleID dan SqlConnection nya sdh ada :
3: Dim daRoleDetails As New SqlDataAdapter(String.Format( _
4: "Select * From RolesDetail Where RoleID = '{0}'", RoleID), _
5: SqlConnection)
6:
7: Dim dtRoleDetails As New DataTable
8: daRoleDetails.Fill(dtRoleDetails)
9: If dtRoleDetails.DefaultView.Count = 0 Then
10: MessageBox.Show("Data tidak ada", "Konfirmasi", _
11: MessageBoxButtons.OK, MessageBoxIcon.Information)
12: Else
13: '//iterasi ToolStripMenuItemnya satu-satu
14: '//berdasarkan data dari tabel
15: PopulateMenuItem(dtRoleDetails.DefaultView)
16: End If
17: End Sub
2. Buat sebuah prosedur untuk iterasi ToolStripMenuItemnya satu-satu berdasarkan data dari tabel. Menu item ini difilter oleh DefaultView properti dari DataTablenya. Dengan menggunakan properti tsb kita dapat dengan mudah filtering recordnya. Untuk iterasi menu itemnya menggunakan looping.
Dengan memanfaatkan method GetEnumerator dari object MenuStrip maka kita dapat me looping satu persatu menu itemnya. Pada saat looping satu persatu, menu item tsb harus di casting ke object ToolStripMenuItem untuk mendapatkan properti menu item yang sedang di looping. DirectCast bisa digunakan untuk casting object tsb atau anda dapat menggantinya dengan CType...
Yang perlu diperhatikan disini yaitu saya menggunakan properti Tag untuk mengambil data dari MenuItem tsb...Kenapa harus Tag property?? Kenapa gak properti Text saja?? Ada yang tau jawabannya??...Properti Tag tsb diisi sama dengan text dari MenuItemnya (tanpa ShortCut Key )
1: Private Sub PopulateMenuItem(ByVal YourView As DataView)
2: Dim IEnum As IEnumerator = MenuStrip.Items.GetEnumerator
3: While IEnum.MoveNext
4: Dim aToolStripMenuItem As ToolStripMenuItem = _
5: DirectCast(IEnum.Current, ToolStripMenuItem)
6:
7: YourView.RowFilter = "Menu = '" & _
8: aToolStripMenuItem.Tag.ToString & "'"
9: If YourView.Count > 0 Then
10: aToolStripMenuItem.Visible = True
11: Else
12: aToolStripMenuItem.Visible = False
13: End If
14: '//looping lagi menuitemnya dengan menggunakan
15: '//metoda(recursive)
16: AddRecursiveMenuItem(YourView, aToolStripMenuItem)
17: End While
18: End Sub
3. Buat sebuah prosedur recursive yang akan me looping kembali ToolStripMenuItem yang sedang di loop, siapa tau masih ada another menuitem nya sampai kedalaman tertentu ...Perhatikan code dibawah ini...jangan sampai kita melakukan looping juga MenuItem yang berupa ToolStripSeparator (Garis pemisah)
1: Private Sub AddRecursiveMenuItem(ByVal YourView As DataView, _
2: ByVal ToolStripMenuItemRef As ToolStripMenuItem)
3: For i As Integer = 0 To _
4: ToolStripMenuItemRef.DropDownItems.Count - 1
5:
6: '//cek apakah menu tsb berupa
7: '//ToolStripSeparator atau bukan
8: If Not (TypeOf ToolStripMenuItemRef.DropDownItems(i) _
9: Is ToolStripMenuItem) Then Continue For
10:
11: YourView.RowFilter = "Menu = '" & _
12: ToolStripMenuItemRef.DropDownItems(i).Tag.ToString & "'"
13:
14: If YourView.Count > 0 Then
15: ToolStripMenuItemRef.DropDownItems(i).Visible = True
16: Else
17: ToolStripMenuItemRef.DropDownItems(i).Visible = False
18: End If
19:
20: AddRecursiveMenuItem(YourView, _
21: ToolStripMenuItemRef.DropDownItems(i))
22: Next
23: End Sub
Ok...Selamat mencoba :)