vb.net динамически созданное имя формы с переменной - PullRequest
0 голосов
/ 11 мая 2018

У меня есть этот код, но я ищу способ упростить его с помощью динамически создаваемых имен.Я изучил методы отражения и activator.createinstance, но не могу найти хороший пример.

Private Sub ChangeToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ChangeToolStripMenuItem.Click
    Dim DbNr As Integer = Strings.Right(DataGridName.Name, 1)
    If DataGridName.Name = Dgv_1.Name Then
        Dim Obj As New RightClickMenuDgv_1("Change", ValueMaster, ValueIdDgv(DbNr))
        If Obj.ShowDialog() = DialogResult.OK Then
            RefreshDataGrids("Change")
        End If
    ElseIf DataGridName.Name = Dgv_2.Name Then
        Dim Obj As New RightClickMenuDgv_2("Change", ValueMaster, ValueIdDgv(DbNr))
        If Obj.ShowDialog() = DialogResult.OK Then
            RefreshDataGrids("Change")
        End If
    ElseIf DataGridName.Name = Dgv_3.Name Then
        Dim Obj As New RightClickMenuDgv_3("Change", ValueMaster, ValueIdDgv(DbNr))
        If Obj.ShowDialog() = DialogResult.OK Then
            RefreshDataGrids("Change")
        End If
    ElseIf DataGridName.Name = Dgv_4.Name Then
        Dim Obj As New RightClickMenuDgv_4("Change", ValueMaster, ValueIdDgv(DbNr))
        If Obj.ShowDialog() = DialogResult.OK Then
            RefreshDataGrids("Change")
        End If
    End If
End Sub

Поэтому я ищу что-то вроде этого:

Private Sub ChangeToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ChangeToolStripMenuItem.Click
    Dim DbNr As Integer = Strings.Right(DataGridName.Name, 1)
    Dim Obj As New RightClickMenuDgv_(DbNr)("Change", ValueMaster, ValueIdDgv(DbNr))
    If Obj.ShowDialog() = DialogResult.OK Then
        RefreshDataGrids("Change")
    End If
End Sub

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

В конце концов мне пришла в голову следующая идея:

Private Sub ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles NewToolStripMenuItem.Click, ChangeToolStripMenuItem.Click, DeleteToolStripMenuItem.Click
    Dim Action As String = sender.name.ToString.Split("ToolStripMenuItem")(0)
    Dim DbNr As Integer = Strings.Right(DataGridName.Name, 1)
    CallByName(Me, $"ShowForm{DbNr}", CallType.Method, Action, ValueMaster, ValueIdDgv(DbNr))
End Sub


Public Sub ShowForm1(ByVal action As String, ByVal primary As String, ByVal secondary As String)
    Dim Obj As New RightClickMenuForm1(action, primary, secondary)
    If Obj.ShowDialog() = DialogResult.OK Then
        RefreshDataGrids(action)
    End If
End Sub

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

0 голосов
/ 11 мая 2018

Во-первых, нет смысла сравнивать свойства объектов, когда вы можете сравнивать объекты, т.е. не делайте этого:

If DataGridName.Name = Dgv_1.Name Then

, а скорее делайте это:

If DataGridName Is Dgv_1 Then

Что касаетсятвой вопрос, то, что ты просишь, на самом деле не возможно.Если вы хотите вызвать такой конструктор, вы ДОЛЖНЫ указать тип данных.Есть способы несколько упростить ваш код.Например,

Dim grids = {Dgv_1, Dgv_2, Dgv_3, Dgv_4}
Dim gridNumber = Array.IndexOf(grids, DataGridName) + 1
Dim dialogue As Form

Select Case gridNumber
    Case 1:
        dialogue = New RightClickMenuDgv_1("Change", ValueMaster, ValueIdDgv(gridNumber))
    Case 2:
        dialogue = New RightClickMenuDgv_2("Change", ValueMaster, ValueIdDgv(gridNumber))
    Case 3:
        dialogue = New RightClickMenuDgv_3("Change", ValueMaster, ValueIdDgv(gridNumber))
    Case 4:
        dialogue = New RightClickMenuDgv_4("Change", ValueMaster, ValueIdDgv(gridNumber))
End Select

If dialogue.ShowDialog() = DialogResult.OK Then
    RefreshDataGrids("Change")
End If

Невозможно обойтись без четырех отдельных строк для создания четырех отдельных типов диалогов, если только вы не захотите прибегнуть к использованию Reflection, которая кажется глупой для сохранения полдюжины строк кода.

...