Элементы управления не заполняются, когда форма загружается во второй раз - PullRequest
0 голосов
/ 21 мая 2018

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

Это все работает хорошо, когда это делается в первый раз.Однако во второй раз, когда вызывается эта вторая форма, раскрывающийся список остается пустым.С помощью некоторой отладки я подтвердил, что выполняется правильный код и что записи добавляются через «SecondForm.ComboBox1.Items.Add» (я могу очистить комбинированный список, проверить его на ноль, прочитать данные и затем проверить элементы всписок снова увеличивается правильно) но они просто не отображаются в форме.Я не могу понять, почему или как это исправить.

И поэтому соответствующие части кода ....

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

Public Class Form1 Friend WithEvents SecondForm As New Form2

Public Sub OpenStripformatstxtToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles OpenStripformatstxtToolStripMenuItem.Click

    Dim fd As OpenFileDialog = New OpenFileDialog()
    Dim pos1 As Integer
    Dim pos2 As Integer


    ' Select the file to open
    fd.Title = "Open File Dialog"
    fd.InitialDirectory = "C:\BEST\Data"
    fd.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*"
    fd.FilterIndex = 1
    fd.RestoreDirectory = True

    ' Put the filename selected in strfilename2
    If fd.ShowDialog() = DialogResult.OK Then
        strFileName2 = fd.FileName
    Else : Return
    End If

    If SecondForm.IsDisposed Then
        Dim secondform As New Form2

Я подозреваю, что эта строка выше является проблемой, я создаюсформировать во второй раз, но без параметра WithEvents.Однако я не могу использовать это из этой части кода, я получаю ошибку «WithEvents» не является допустимым объявлением локальной переменной ».Я читал, что закрытие и повторное открытие форм не является хорошим кодом, и что я должен скрывать / показывать их

        secondform.Show()
        InitializeComponent()

    Else
        SecondForm.Show()
    End If

    ' Copy the file contents to a string called sfcontents (Strip Format Contents)
    sfcontents = My.Computer.FileSystem.ReadAllText(fd.FileName)


    ' Define some points in the string, starting at the beginning
    pos1 = 1
    pos2 = 1


    ' Loop from the start to the end of the string
    For pos1 = 1 To Len(sfcontents)

        ' Look for FO, the strip name header, do the following if you find it
        If Mid(sfcontents, pos1, 3) = "FO " Then
            pos1 = pos1 + 3
            pos2 = pos1 + 1

            'Find the space after "FO " so we've captured the whole next word, that's the strip name
            Do Until Mid(sfcontents, pos2, 1) = " "
                pos2 = pos2 + 1
            Loop
            ' Add that strip name to the combobox for selecting by user
            SecondForm.ComboBox1.Items.Add(Mid(sfcontents, pos1, pos2 - pos1))

Именно эта строка выше заполняет ComboBox, но эти данные НЕ отображаются наформа, которая отображается пользователю после показа первого экземпляра формы

        End If

        ' Next step in the string
    Next pos1
End Sub

Private Sub secondform_formclosing(sender As Object, e As FormClosingEventArgs) Handles SecondForm.FormClosing

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

End Sub

Код на Form2.vb выглядит следующим образом:

Public Class Form2
Public selectedstrip As String '= ComboBox1.SelectedItem
Public stripfunction As Integer

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If RadioButton1.Checked Then stripfunction = 1
    If RadioButton2.Checked Then stripfunction = 2
    If RadioButton3.Checked Then stripfunction = 3
    selectedstrip = ComboBox1.SelectedItem
    Me.Close()

End Sub
End Class

Я читал немного онлайнЭто говорит о том, что закрытие и повторное открытие форм не является, извините за каламбур, хорошей формой.Однако тогда мне понадобятся обработчики событий для form.hide, и я не могу понять, как их использовать или даже чем они являются.Если скрытие формы является лучшим альтернативным решением, если кто-то может указать мне правильное направление для того, как это сделать и какие обработчики использовать вместо этого, то я буду благодарен.

Я, вероятно, что-то делаюневероятно глупо, потому что все, что я делаю, самоучка от поиска в Google, и мне, вероятно, не хватает лучшего понимания ПОЧЕМУ мне нужно делать определенные вещи, так что извиняюсь за любое невежество с моей стороны.Имея это в виду, если я делаю что-то совершенно глупо, я открыт для того, чтобы переписать это так, чтобы это помогло, но мне, возможно, понадобится какое-то владение рукой для этого!

Заранее спасибо залюбая помощь, которую может дать любой.

1 Ответ

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

Здесь возникает основная проблема:

If SecondForm.IsDisposed Then
    Dim secondform As New Form2

Вы объявляете там новую локальную переменную и назначаете для нее новый Form2 объект, а не переменную-член, поэтому при последующем обращении кпеременная-член для заполнения ComboBox, вы не имеете в виду только что созданный экземпляр Form2.

Ваш код в любом случае довольно странный.Вот мой совет.

Во-первых, избавьтесь от формы кода Form1, которая заполняет ComboBox в Form2.Формы должны заполнять свои собственные элементы управления.Поместите код для заполнения ComboBox в обработчике событий Load Form2.Затем вы гарантируете, что каждый раз, когда вы вызываете Show для нового экземпляра Form2, код для заполнения ComboBox будет выполнен.Вот как должна работать форма.

В качестве альтернативы, учитывая, что вы читаете из файла и что данные, вероятно, не изменятся в течение сеанса, прочитайте данные и поместите их в массивв Load обработчик событий Form1 и затем передать этот массив конструктору Form2.Вам придется написать этот конструктор самостоятельно, и в нем вы должны будете заполнить ComboBox данными массива.Таким образом, вы не читаете и не обрабатываете один и тот же файл данных снова и снова, но по-прежнему заполняете элементы управления Form2 в Form2.

Во-вторых, измените этот код:

If SecondForm.IsDisposed Then
    Dim secondform As New Form2
    secondform.Show()
    InitializeComponent()
Else
    SecondForm.Show()
End If

к этому:

If SecondForm.IsDisposed Then
    'Create and display a new instance.
    Secondform = New Form2
    Secondform.Show()
Else
    'Focus the existing instance.
    SecondForm.Activate()
End If

Обратите внимание, что локальной переменной нет, поэтому новый экземпляр назначен переменной-члену.

Также нет вызова InitializeComponent.Именно этот метод создает и настраивает элементы управления в форме на основе действий в конструкторе.ЕДИНСТВЕННОЕ место, которое вызывается, находится в конструкторе.

Наконец, если экземпляр Form2 уже отображается, вызывается его метод Activate, чтобы убедиться, что он имеет фокус.

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