PDA

View Full Version : Dùng đệ quy trên MenuStrip để phân quyền sử dụng cho user??



nth4
24-05-2009, 23:52
Mình đang dùng đệ quy để xét phân quyền cho các user.

1. Ban đầu mình cho chạy đệ quy các menu của MenuStrip để xét enable = false.

2. Sau đó ứng với user nào đc quyền truy cập form thì mình sẽ cho chạy đệ quy 1 lần nữa và xét enable = true

Như vậy có vấn đề gì ko các bạn, mình phảii chạy đệ quy đến 2 lần, nên khi người đăng nhập mình thấy nó xử lý hơi chậm.

Mình đang suy nghĩ cách đơn giản hơn!

CSDL phân quyền mình như sau:

1. Người dùng: (username, pass)
2. Form: (maForm, tenForm)
3. Phân quyền: (id (tự tăng), username, maForm, đc_sử_dụng (true/false))



// De Quy
private void DisableMenu(MenuStrip menu, bool f)
{
if (menu == null)
return;

foreach (ToolStripMenuItem _item in menu.Items)
{
DisableItem(_item, f);
}

}
private void DisableItem(ToolStripMenuItem parentItem, bool f)
{
if (parentItem != null && parentItem.DropDownItems.Count > 0)
{
foreach (ToolStripMenuItem _item in parentItem.DropDownItems)
{
DisableItem(_item, f);
}
}

try
{
if(parentItem.Tag != null)
parentItem.Enabled = f;
}
catch { }
}




private void EnableMenu(MenuStrip menu, string maForm)
{
if (menu == null)
return;

foreach (ToolStripMenuItem _item in menu.Items)
{
EnableItem(_item, maForm);
}

}
private void EnableItem(ToolStripMenuItem parentItem, string maForm)
{
if (parentItem != null && parentItem.DropDownItems.Count > 0)
{
foreach (ToolStripMenuItem _item in parentItem.DropDownItems)
{
EnableItem(_item, maForm);
}
}

try
{
if (parentItem.Tag.ToString() == maForm)
parentItem.Enabled = true;
}
catch { }
}

__

hoangkhien
18-05-2011, 11:11
Xin chao!
Xin cam on các anh em đã tham gia topic này. Sau khi nghiên cứu đoạn mã trên, tôi xin góp một đoạn mã do tôi nghiên cứu bằng Vusual Basic 2008, mong sẽ giúp ích được cho ai đó nếu người đó cần. Có gì sai xót mong anh em góp ý thêm.

Public Function InsMenu(ByVal menuT As MenuStrip) As Boolean
On Error GoTo Err
For i = 0 To menuT.Items.Count - 1
SpendMenu(menuT.Items(i))
Next
Err_Exit:
Exit Function
Err:
MsgBox(Err.Description)
Resume Err_Exit
End Function

Public Function SpendMenu(ByVal it As ToolStripMenuItem) As Boolean
On Error GoTo Err
MsgBox(it.Name & "___" & it.Text)
' Việc cần làm cho việc duyệt qua hệ thống menu
' Chẳng hạn như là ẩn hiện hay lấy tên của menu, hay thay đổi text của menu...
' Ở đây tôi dùng lệnh MsgBox(it.Name & "___" & it.Text) để làm ví dụ

For Each a As ToolStripItem In it.DropDownItems
If a.GetType.Name = "ToolStripMenuItem" Then
SpendMenu(a)
End If
Next
Err_Exit:
Exit Function
Err:
MsgBox(Err.Description)
Resume Err_Exit
End Function


Cách dùng :
Tại form có hệ thống menu cần duyệt qua, các bạn dùng cú pháp :
InsMenu(MenuStrip1)
MenuStrip1 là một đối tượng MenuStrip
Ghi Chú :
Khi xem đoạn mã trên, phần bẫy lỗi các anh em có thể xó bỏ đi.

Hy vọng đoạn mã trên tương đối dễ hiểu.
Chúc mọi người sẽ thành công nhiều hơn trong sự nghiệp nghiên cức của mình và có thể giúc được nhiều cho xã hội.
Xin cảm ơn!