Populate ToolStripMenuItem berdasarkan data di tabel

Posted at : Feb/20/2007
5253 Views

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

Diagram tabelnya bisa seperti ini :

Sekarang kita buat code nya :

1. Buat sebuah prosedur untuk populate menu berdasarkan RoleID dari user name yang login. Tabel yang digunakan yaitu tabel RolesDetail.

   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 :)


ABOUT ME

Rully Yulian MF
Rully Yulian Muhammad Firmansyah | Co-Founder & IT Trainer at Native Enterprise | Microsoft Azure Data Scientist | IBM RAG & Agentic AI | IBM Data Science & Data Analyst | Python Certified (PCEP, PCAP) | MOS, MTA, Xamarin Certified, ex MCT | ex MVP

CERTIFICATIONS

Microsoft Certified Associate
IBM RAG and Agentic AI Professional
IBM Data Science Professional IBM Data Analyst Professional
PCAP Associate Python Programmer Certified PCEP Entry Level Python Programmer Certified
Xamarin Certified
MOS 2007
MCPD MCTS
MCAD.NET

NATIVE ENTERPRISE

Native Enterprise - IT Training

FOLLOW ME

Youtube  X Twitter Facebook  Instagram  LinkedIn

RSS


NATIVE ENTERPRISE NEWS

© Copyright 2006 - 2026   Rully Yulian MF   All rights reserved.