Установите переменную с помощью цикла, используя имя переменной в качестве строки - PullRequest
0 голосов
/ 04 декабря 2018

Мое приложение требует, чтобы переменные устанавливались и извлекались несколько раз в разных формах и подпрограммах.Вместо того, чтобы писать код несколько раз, я надеялся использовать цикл для циклического перебора переменных и их установки соответствующим образом.Код ниже показывает мое меню настроек и как оно построено.Я застрял с настройкой переменных, основанных на имени, которое хранится в виде строки (см. Последний фрагмент кода ниже).

Ниже приведен раздел о классах меню.Этот бит работает, как и ожидалось

Public Class MenuItem

    Public Name As String
    Public Type As TypeEnum

    Enum TypeEnum
        CheckBox
        ComboBox
        TextBox
    End Enum     

    Public Sub New()
    End Sub

End Class

Public Class Menu

    Public MenuItems() As MenuItem
    Public Name As String
    Public LinkedVariable as Object

    Public Sub New()
    End Sub

    Public Sub AddMenuItem(ByVal ItemName As String, _
                           ByVal ItemType As MenuItem.TypeEnum, _
                           ByVal ItemLinkedVariable as Object)   

        If MenuItems Is Nothing Then
            ReDim MenuItems(0)
        Else
            ReDim Preserve MenuItems(MenuItems.Length)
        End If
        MenuItems(MenuItems.Length - 1) = New MenuItem
        MenuItems(MenuItems.Length - 1).Name = ItemName
        MenuItems(MenuItems.Length - 1).Type = ItemType
        MenuItems(MenuItems.Length - 1).LinkedVariable = ItemLinkedVariable 
    End Sub

End Class

Создайте меню в основном классе формы.Этот бит работает, как и ожидалось

Public Class Form1
    Public Settings As New SettingsForm
    Public Sub CreateMenu()

        Settings.AddMenu("Menu1")

        Settings.Menus(0).AddMenuItem("CheckBoxA", MenuItem.TypeEnum.CheckBox, VariableA)
        Settings.Menus(0).AddMenuItem("TextBoxB", MenuItem.TypeEnum.TextBox, VariableB)
        Settings.Menus(0).AddMenuItem("TextBoxC", MenuItem.TypeEnum.TextBox, VariableC) 

        Settings.AddMenu("Menu2")

        Settings.Menus(1).AddMenuItem("CheckBoxD", MenuItem.TypeEnum.CheckBox, VariableD)
        Settings.Menus(1).AddMenuItem("TextBoxE", MenuItem.TypeEnum.TextBox, VariableE)

        'etc......      

        Settings.Build()

        Settings.Show()

    End Sub
End Class


Public Class SettingsForm
    Public Menus() As Menu

    Public VariableA As Boolean
    Public VariableB As String
    Public VariableC As String
    Public VariableD As Boolean
    Public VariableE As String

    Public Sub New()

        InitializeComponent()

    End Sub

    Public Sub Build()

        SettingsTabControl.TabPages.Clear()

        If Menus IsNot Nothing Then
            For i As Integer = 0 To Menus.Length - 1

                SettingsTabControl.TabPages.Add(Menus(i).Name)
                SettingsTabControl.TabPages(i).Name = Menus(i).Name & "TabPage"
                SettingsTabControl.TabPages(i).Text = Menus(i).Name

                AddSettingsItems(Menus(i), i)

            Next
        End If

    End Sub

    Public Sub AddSettingsItems(ByVal SelectedMenu As Menu, ByVal TabPageIndex As Integer)
        Dim y As Integer = 50
        Dim yinc As Integer = 25

        If SelectedMenu IsNot Nothing Then
            If SelectedMenu.MenuItems IsNot Nothing Then

                For i As Integer = 0 To SelectedMenu.MenuItems.Length - 1

                    Dim formObj As Object

                    'Specific Settings
                    Select Case SelectedMenu.MenuItems(i).Type
                        Case MenuItem.TypeEnum.CheckBox
                            formObj = New CheckBox
                        Case MenuItem.TypeEnum.ComboBox
                            formObj = New ComboBox                            
                        Case MenuItem.TypeEnum.TextBox
                            formObj = New TextBox
                            formObj.TextAlign = HorizontalAlignment.Right
                            formObj.BorderStyle = BorderStyle.FixedSingle
                    End Select

                    formObj.Name = SelectedMenu.MenuItems(i).Name
                    formObj.Location = New Point(25, y)
                    SettingsTabControl.TabPages(TabPageIndex).Controls.Add(formObj)

                    y = y + yinc
                Next
            End If
        End If
    End Sub
End Class

Это бит, на котором я застрял, я хочу иметь возможность устанавливать переменные A, B, C, D, E из элементов управления, которые были добавлены в SettingsTabControl.Однако я не могу понять, как связать переменные с объектами LinkedVariable в каждом элементе MenuItem.Это то, что у меня есть, но оно не работает

Private Sub SettingsFromOkButton_Click(sender As Object, e As EventArgs) Handles OkButton.Click

    For m As Integer = 0 To Menus.Length - 1
        For i As Integer = 0 To Menus(m).MenuItems.Length

            Dim currentcontrol As Object = SettingsTabControl.TabPages(m).Controls(Menus(m).MenuItems(i).Name)

            Select Case Menus(m).MenuItems(i).Type
                Case MenuItem.TypeEnum.CheckBox
                    If currentcontrol.CheckedState = True Then
                        Menus(m).MenuItems(i).LinkedVariable = True
                    Else
                        Menus(m).MenuItems(i).LinkedVariable = False
                    End If
                Case MenuItem.TypeEnum.ComboBox


                Case MenuItem.TypeEnum.TextBox
                    Menus(m).MenuItems(i).LinkedVariable = currentcontrol.Text
            End Select

        Next
    Next

    MsgBox(VariableA & vbCrLf _
           VariableB & vbCrLf _
           VariableC & vbCrLf _
           VariableD & vbCrLf _
           VariableE & vbCrLf)

End Sub

1 Ответ

0 голосов
/ 09 декабря 2018

Я использовал отражение

Dim Flags As BindingFlags = BindingFlags.GetField Or BindingFlags.Instance Or BindingFlags.Public
Dim fVar As System.Reflection.FieldInfo = Me.GetType.GetField(ObjectName, Flags)

If TypeOf SettingsTabControl.TabPages(TabPageIndex).Controls(CtrlName) Is TextBox Then
    ctrlValue = SettingsTabControl.TabPages(TabPageIndex).Controls(CtrlName).Text
ElseIf TypeOf SettingsTabControl.TabPages(TabPageIndex).Controls(CtrlName) Is CheckBox Then
    ctrlValue = CType(SettingsTabControl.TabPages(TabPageIndex).Controls(CtrlName), CheckBox).Checked
ElseIf TypeOf SettingsTabControl.TabPages(TabPageIndex).Controls(CtrlName) Is RadioButton Then
    ctrlValue = CType(SettingsTabControl.TabPages(TabPageIndex).Controls(CtrlName), RadioButton).Checked
End If

fVar.SetValue(Me, ctrlValue)
...