Я предлагаю сохранить информацию о пользователях и элементах управления, чтобы скрыть их в модуле.Это будет проще в настройке и обработке.
Вам также понадобятся средства перебора не только элементов управления верхнего уровня, но и элементов управления, вложенных в элемент управления контейнера, например панель или элемент управления табуляции.Для этого вы можете создать метод рекурсивного расширения многократного использования:
Imports System.Runtime.CompilerServices
Module FormExtensions
<Extension()>
Public Iterator Function AllControls(ByVal parent As Control) As IEnumerable
For Each c As Control In parent.Controls
Yield c
For Each nested As Control In c.AllControls()
Yield nested
Next
Next
End Function
End Module
В другом модуле вы можете реализовать логику
Module UserAccessControl
' Dictionary with users as key containing nested dictionaries with form names as key
' containing names of controls to be hidden in a HashSet.
Private m_controlsToHide As New Dictionary(Of String, Dictionary(Of String, HashSet(Of String))) From
{
{"user", New Dictionary(Of String, HashSet(Of String)) From {
{"Form1", New HashSet(Of String) From {"TextBox1", "ComboBox2", "TextBox17"}},
{"Form2", New HashSet(Of String) From {"TextBox3", "Button1"}}
}
},
{"account", New Dictionary(Of String, HashSet(Of String)) From {
{"Form1", New HashSet(Of String) From {"TextBox17"}},
{"Form2", New HashSet(Of String) From {"TextBox3", "Button1", "Button2"}}
}
}
}
Public Sub HideControls(ByVal user As String, ByVal form As Form)
Dim userDict As Dictionary(Of String, HashSet(Of String))
Dim controls As HashSet(Of String)
If m_controlsToHide.TryGetValue(user, userDict) AndAlso
userDict.TryGetValue(form.Name, controls) Then
For Each control As Control In form.AllControls() _
.Where(Function(c) controls.Contains(c.Name))
control.Visible = False
Next
End If
End Sub
End Module
Если вы предпочитаете, вы также можете переключить «пользователь» и"form" и сделать формы первым уровнем структуры данных.
Внутри формы вы можете позвонить
Public Sub New()
InitizialeComponent()
UserAccessControl.HideControls(userName, Me)
End Sub
Используя составную клавишу Tuple мы можем сгладить структуру данных и избавиться от одного уровня словаря:
Private m_controlsToHide As New Dictionary(Of (String, String), HashSet(Of String)) From {
{("user", "Form1"), New HashSet(Of String) From {"TextBox1", "ComboBox2", "TextBox17"}},
{("user", "Form2"), New HashSet(Of String) From {"TextBox3", "Button1"}},
{("account", "Form1"), New HashSet(Of String) From {"TextBox17"}},
{("account", "Form2"), New HashSet(Of String) From {"TextBox3", "Button1", "Button2"}},
}
Public Sub HideControls(ByVal user As String, ByVal form As Form)
Dim controls As HashSet(Of String)
If m_controlsToHide.TryGetValue((user, form.Name), controls) Then
For Each control As Control In form.AllControls() _
.Where(Function(c) controls.Contains(c.Name))
control.Visible = False
Next
End If
End Sub
Вместо того, чтобы хранить информацию о доступе в коде, вы также можете сохранить ее в базе данных.У меня часто есть приложения, где суперпользователи могут изменять эти настройки из приложения.Это более гибко, чем жесткое кодирование информации.