Populate ToolStripMenuItem berdasarkan data di tabel

Posted at : Feb/20/2007
5183 Views | 10 Comments

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


[Comments]

Bram (Nov/15/2007 12:41:35)
Mas, Codingnya kok agak mumet ya (maklum aq baru pake vb '05). tp pasti trims yg banyk. Kl buat frm login dgn bbrp hak user untuk menu2x tertentu dgn "table adapter" (fitur yg baru donk...) gmn ya----ttp pake database. artikel ini kan msh pake "data adapater"nya vb.net 2002/2003. skl lg trims banyk. Keep moving to create and sharing something not only for money and popularity but also for humanity ---- sok puitis nich.
Rully (Nov/15/2007 02:23:09)
Halo mas Bram :) codingnya ga terlalu mumet kok :) klo pake tableadapter justru lebih mudah...sebenarnya disini yang diambil yaitu value datatable nya saja...untuk populate datatable sebenarnya bisa pake datareader...klo pake tableadapter tinggal pake function yang return valuenya datatable itu, hasil dari query adapternya (kebayang khan)
of course i like to share my knowledge to others...klo masalah money sama popularity sih itu hanya efek samping aja, he he...
handoyo (Jan/19/2010 11:54:55)
Alow mas,thx buat tutorialna.Saya bingung cara pakai codenya euy mas..Saya pakai tableadapter dengan sql server compact.. Kalo andaikata saya udah buat menu dengan nama menu kaya mnuUser..Gimana cara aksesnya mas?Thanks.. ^_^
Arief (Feb/27/2010 11:58:35)
Mas tutorial ini bisa di hidupkan lagi engak ? kalo bisa kasih code yang bisa di donwload. Saya bingung nih mau pakainya gimana... tolong ya mas perlu nih. Thanks arief
Arief (Feb/27/2010 11:58:43)
Mas tutorial ini bisa di hidupkan lagi engak ? kalo bisa kasih code yang bisa di donwload. Saya bingung nih mau pakainya gimana... tolong ya mas perlu nih. Thanks arief
Rudiana (Apr/09/2010 11:14:42)
Iya betul kata brother Arief Mas Rully, bisa tolong kasih code yg bisa di donwload... hatur nuhuns
Rudiana (Apr/09/2010 11:15:01)
Iya betul kata brother Arief Mas Rully, bisa tolong kasih code yg bisa di donwload... hatur nuhuns
Rully (Apr/09/2010 01:25:52)
Arief & Rudiana > Ok...nanti kalau sempat saya buatkan contohnya, soalnya itu potongan code dari aplikasi yang pernah saya buat :)
martin (Feb/09/2012 01:29:43)

Mas

Kalo prosedure recursive bisa dijelaskan? ..Terima kasih

Rully (Feb/12/2012 09:06:19)

Martin > Prosedur recursive itu merupakan prosedur yang memanggil prosedur dirinya sendiri, biasanya digunakan untuk menampilkan data yang sifatnya nested (hierarchical) dimana kedalaman dari struktur hirarki data tersebut dapat dibaca secara dinamis...semoga membantu :)


[Write your comment]

Name (required)

Email (required-will not published)

Comment
TGYI
Input code above below (Case Sensitive) :

ABOUT ME

Rully Yulian MF
Rully Yulian Muhammad Firmansyah | Founder & IT Trainer Native Enterprise | MCT (2008-2019) | MVP (2009-2016) | Xamarin Certified Professional | MTA | MCAD | MCPD | MOS | Bandung, West Java, Indonesia.

[Read More...]

TOP DOWNLOAD

Mapping Hak Akses User Pada MenuStrip Sampai Control Button
downloaded 6982 times

Bagaimana caranya menginstal database ketika deploying sebuah aplikasi?
downloaded 4893 times

Simple Voice Engine Application With Sound Player Class...
downloaded 4045 times

Change Group,Sort Order, Filtering By Date in Crystal Reports
downloaded 3460 times

WinForms DataGrid Paging With SqlDataAdapter
downloaded 2881 times


LINKS

CERTIFICATIONS

Xamarin Certified
MOS 2007
MCT
MCPD
MCTS
MCAD.NET
ASP.NET Brainbench

NATIVE ENTERPRISE

Native Enterprise - IT Training

FOLLOW ME

Youtube  Facebook  Instagram  LinkedIn   Twitter

RSS


NATIVE ENTERPRISE NEWS

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