Есть ли способ, которым я могу разработать форму 5 раз без добавления 5 различных форм - PullRequest
0 голосов
/ 25 февраля 2019

У меня новый Очень большой проект. Моя проблема. У меня в программе 5 разных пользователей (admin - user -account - admin_account-receive), и если я использую visible = false для инструментов, которые его скрывают, дизайн программы становитсяочень некрасиво.Есть ли способ сохранить более одного дизайна для одной формы без изменения кода?Между прочим, нет кода, я просто ищу идею, поэтому я никогда не смогу повторить одну и ту же форму 5 раз, она уже большого размера, и я не хочу ее увеличивать

1 Ответ

0 голосов
/ 25 февраля 2019

Я предлагаю сохранить информацию о пользователях и элементах управления, чтобы скрыть их в модуле.Это будет проще в настройке и обработке.

Вам также понадобятся средства перебора не только элементов управления верхнего уровня, но и элементов управления, вложенных в элемент управления контейнера, например панель или элемент управления табуляции.Для этого вы можете создать метод рекурсивного расширения многократного использования:

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

Вместо того, чтобы хранить информацию о доступе в коде, вы также можете сохранить ее в базе данных.У меня часто есть приложения, где суперпользователи могут изменять эти настройки из приложения.Это более гибко, чем жесткое кодирование информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...