Почему вход из формы Form3 не получен в форме Form2 после изменения StartupForm - PullRequest
0 голосов
/ 17 марта 2020

У меня есть 3 формы: Form1 (MainForm с меню), Form2 (с ListView и кнопкой) и Form3 (некоторые текстовые поля и кнопки).

В Form1 я могу открыть Form2 через меню. В Form2 я могу открыть Form3 с помощью кнопки. В Form3 я могу добавить данные из объектов ввода в ListView на Form2.

Когда я запускаю проект, а Form2 - StartupForm, все работает. Когда я запускаю проект с Form1 в качестве StartupForm, я больше не могу добавлять данные из Form3 в Form2.

Form1:

    ' Open een venster om een productie aan te passen in de lijst met producties en pas de objecten in dat venster aan.
    Dim venster As New Form2
    With venster
        .Text = "Object " & actie
        .Btn_Opslaan.Text = actie

        ' Controleer welke acties er uit gevoerd dienen te worden (welke objecten krijgen welke waarde aan de hand van functie van het scherm).
        Select Case actie
            Case ACTIE_Toevoegen
                .Btn_Volgende.Enabled = True

            Case ACTIE_Aanpassen
                .Btn_Volgende.Enabled = False

        End Select

        .Show()
    End With

    venster = Nothing

Form2:

    ' Open een venster om een productie aan te passen in de lijst met producties en pas de objecten in dat venster aan.
    Dim venster As New Form3
    With venster
        .Text = "Productie " & actie
        .Btn_Opslaan.Text = actie
        If Cbo_Sets.SelectedIndex > 0 Then .Num_Verbonden.Enabled = True

        ' Controleer welke acties er uit gevoerd dienen te worden (welke objecten krijgen welke waarde aan de hand van functie van het scherm).
        Select Case actie
            Case ACTIE_Toevoegen
                .Btn_Volgende.Enabled = True
                .Lbl_ProductieWaarde.Text = "0"

            Case ACTIE_Aanpassen
                .Btn_Volgende.Enabled = False
                .Lbl_ProductieWaarde.Text = Lst_Producties.SelectedItems(0).SubItems(6).Text

                Dim i As ListViewItem = Lst_Producties.SelectedItems(0)
                .Num_Aantal.Value = Convert.ToInt32(i.SubItems(1).Text)
                .dtp_Tijd.Value = Convert.ToDateTime(i.SubItems(2).Text)
                .Num_Verbonden.Value = Convert.ToInt32(i.SubItems(3).Text)
                .Chk_Gemotiveerd.Checked = CBool(i.SubItems(4).Text)
                .Chk_Gilde.Checked = CBool(i.SubItems(5).Text)
        End Select

        .ShowDialog()
    End With

    venster = Nothing

Form3:

    '  Gegevens van productie toevoegen aan de lijst met producties in het vorige scherm.
    With Form2.Lst_Producties.Items
        Dim productie As New ListViewItem
        With productie
            .Text = Cbo_Producties.Text
            .SubItems.Add(Num_Aantal.Value.ToString)
            .SubItems.Add(dtp_Tijd.Text)
            .SubItems.Add(Num_Verbonden.Value.ToString)
            .SubItems.Add(Convert.ToInt16(Chk_Gemotiveerd.Checked).ToString)
            .SubItems.Add(Convert.ToInt16(Chk_Gilde.Checked).ToString)
            .SubItems.Add(Cbo_Producties.SelectedValue.ToString)            ' Het ID van de productie hoeft niet zichtbaar in beeld maar moet wel worden meegegeven.
        End With
        .Add(productie)
    End With

    Form2.Txt_Omschrijving.Text = "Geslaagd!"

Это похоже на ошибку, но я могу представить, что я что-то здесь упускаю (в 99% случаев последний случай!)

1 Ответ

0 голосов
/ 17 марта 2020

DJ был прав, я думаю

Одна из самых запутанных (и раздражающих) вещей о VB. NET имеет свои корни в VB6. Пытаясь обратиться к обновлению программистов VB6, Microsoft сделала так, чтобы каждое приложение VB. NET создавало экземпляры по умолчанию для каждой из форм, и создаваемый экземпляр имел то же имя, что и тип. Это замечательно для программистов на VB6, которым не нужно было реально понимать разницу между типом и экземпляром, но это вызывает большое раздражение у тех из нас, кто смотрит на вызов Form2.Show() и думает, что он написан с большой буквы, как будто он типа, так что, может быть, это статический / общий метод ", но потом понимаете" нет, на самом деле это не статический / общий метод в экземпляре с именем Form2, созданный процессом, спрятанным где-то в черном ящике ". VB. NET разрешение переменных экземпляров, названных идентично типу, также не помогает людям оценить разницу между экземплярами и общими типами. Dim String as New String, String.IsNullOrEmpty(String) Ахой

В любом случае. Возвращаясь к рассматриваемой проблеме

Ваша Форма 3 помещает вещи в список Form2, , но Форма 2, к которой она относится, - это Форма 2, которую VB. NET создал для вас . Когда вы устанавливаете форму запуска на Form2, это также тот же экземпляр Form2, который появляется. Эта Form2 создает новую Form3, Form3, помещает вещи в список Form2, вы видите их, потому что это Form2, которая на экране (форма запуска показана, остальные формы скрыты)

Когда вы делаете Form1 своей формой запуска, этот экземпляр создает NEW Form2 и показывает ее. Эта новая форма Form2 показывает НОВУЮ FOrm3, но видимая вами форма FOrm3 все еще проталкивает свои вещи в форму Form2, созданную для вас VB. NET, которая невидима, потому что это не форма запуска

Если вы все еще не совсем понял, поместите это изменение кода в Form2, если Form2 - ваш объект запуска:

'BEFORE:

' Open een venster om een productie aan te passen in de lijst met producties en pas de objecten in dat venster aan.
Dim venster As New Form3

'AFTER:

' Open een venster om een productie aan te passen in de lijst met producties en pas de objecten in dat venster aan.
Form1.Text = "VB.NET made this form automatically and my visibility was " & Form1.Visible
Form2.Text = "VB.NET made this form automatically and my visibility was " & Form2.Visible
Form3.Text = "VB.NET made this form automatically and my visibility was " & Form3.Visible
Form1.Show() 
Form2.Show() 
Form3.Show()

Dim venster As New Form3
venster.Text = "SMoKuM made this form in code"

Или поместите это изменение кода в Form1, если Form1 - ваш объект запуска:

'BEFORE:

' Open een venster om een productie aan te passen in de lijst met producties en pas de objecten in dat venster aan.
Dim venster As New Form2



'AFTER:

' Open een venster om een productie aan te passen in de lijst met producties en pas de objecten in dat venster aan.
Form1.Text = "VB.NET made this form automatically and my visibility was " & Form1.Visible
Form2.Text = "VB.NET made this form automatically and my visibility was " & Form2.Visible
Form3.Text = "VB.NET made this form automatically and my visibility was " & Form3.Visible
Form1.Show() 
Form2.Show() 
Form3.Show()

Dim venster As New Form2
venster.Text = "SMoKuM made this form in code"

Теперь используйте ваше приложение. Вы заметите, что независимо от того, установили ли вы form1 или form2 в качестве объекта запуска, вы получите windows больше, чем ожидаете, но в список заголовка формы всегда будет добавляться информация, гласящая: «VB. NET сделал это автоматически "и логическое значение в конце строки заголовка должно указывать, была ли форма видимой или невидимой при запуске приложения


Вы можете избежать этого ужасного поведения, проверив this вопрос

или используя C#:)

...