Динамически создавайте элементы управления в форме, полученной по строковому значению - PullRequest
1 голос
/ 11 марта 2020

В моем текущем проекте я собираюсь сделать что-то вроде файлового менеджера. Когда я щелкаю правой кнопкой мыши над формой, она открывает другую форму, которая имитирует MsgBox с 2 кнопками: одну для создания папки и другую для создания текстового файла. Программа хранит название формы, которая была открыта при щелчке мышью, и должна создать необходимую опцию. Проблема в том, что он не создает и не выдает ошибок.

prevForm - строка, которая содержит предыдущее имя формы.

Извините за плохой английский sh

Private Sub pasta_Click(sender As Object, e As EventArgs) Handles pasta.Click
    Dim nomePasta = InputBox("Nome da Pasta: ", "Nova Pasta", "Nova pasta")

    Dim novoForm As New Form With {
        .Name = nomePasta,
        .Text = nomePasta,
        .Size = New Point(816, 489),
        .BackColor = Color.FromName("ActiveCaption")
    }

    Dim novaPicBox As PictureBox

    novaPicBox = New PictureBox With {
        .Size = New Point(60, 60),
        .Location = New Point(720, 21)
    }

    System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(ProductName & "." & prevForm).Controls.Add(novaPicBox)

    Dim novaLbl As Label

    novaLbl = New Label With {
        .Text = nomePasta,
        .Location = New Point(720, 85)
    }

    System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(ProductName & "." & prevForm).Controls.Add(novaLbl)

    Me.Close()
End Sub

Private Sub fichtexto_Click(sender As Object, e As EventArgs) Handles fichtexto.Click
    Dim nomeFichTexto = InputBox("Nome do Ficheiro de Texto: ", "Novo Ficheiro de Texto", "Novo Ficheiro de Texto")

    Dim novaPicBox As PictureBox

    novaPicBox = New PictureBox With {
        .Size = New Point(60, 60),
        .Location = New Point(720, 111),
        .Image = Image.FromFile(".\txt.png"),
        .SizeMode = PictureBoxSizeMode.StretchImage
    }

    System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(ProductName & "." & prevForm).Controls.Add(novaPicBox)

    Dim novaLbl As Label

    novaLbl = New Label With {
        .Text = nomeFichTexto,
        .Location = New Point(720, 174)
    }

    System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(ProductName & "." & prevForm).Controls.Add(novaLbl)

    Me.Close()
End Sub

1 Ответ

1 голос
/ 11 марта 2020

Вы продолжаете вызывать

System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(ProductName & "." & prevForm)

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

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

Public Class MsgForm

    Public Property PreviousForm As Form

    Private Sub pasta_Click(sender As Object, e As EventArgs) Handles pasta.Click
        Dim nomePasta = InputBox("Nome da Pasta: ", "Nova Pasta", "Nova pasta")

        Dim novoForm As New Form With {
            .Name = nomePasta,
            .Text = nomePasta,
            .Size = New Point(816, 489),
            .BackColor = Color.FromName("ActiveCaption")
        }

        Dim novaPicBox = New PictureBox With {
            .Size = New Point(60, 60),
            .Location = New Point(720, 21)
        }
        PreviousForm.Controls.Add(novaPicBox)

        Dim novaLbl = New Label With {
            .Text = nomePasta,
            .Location = New Point(720, 85)
        }
        PreviousForm.Controls.Add(novaLbl)

        Me.Close()
    End Sub

    Private Sub fichtexto_Click(sender As Object, e As EventArgs) Handles fichtexto.Click
        Dim nomeFichTexto = InputBox("Nome do Ficheiro de Texto: ", "Novo Ficheiro de Texto", "Novo Ficheiro de Texto")

        Dim novaPicBox = New PictureBox With {
            .Size = New Point(60, 60),
            .Location = New Point(720, 111),
            .Image = Image.FromFile(".\txt.png"),
            .SizeMode = PictureBoxSizeMode.StretchImage
        }
        PreviousForm.Controls.Add(novaPicBox)

        Dim novaLbl = New Label With {
            .Text = nomeFichTexto,
            .Location = New Point(720, 174)
        }
        PreviousForm.Controls.Add(novaLbl)

        Me.Close()
    End Sub

End Class

А когда вы вызываете форму окна сообщения, установите свойство

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim m = New MsgForm With {.PreviousForm = Me}
        m.Show()
    End Sub

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