Удаление элементов управления каждый раз, когда вызывается ShowDialog

У меня есть форма, которую я показываю исключительно с ShowDialog метод. в Form_Shown В этом случае я динамически создаю набор меток и текстовых полей на основе общедоступной переменной, установленной в форме, выполняющей вызов.

Я понимаю, что форма не закрыта или уничтожена, а просто скрыта между вызовами, и поэтому я добавил код в верхней части моего Form_Shown событие, чтобы удалить все элементы управления из предыдущего вызова, но элементы управления не удаляются. я пытался ctrl.Dispose (как в коде ниже) и Me.Controls.Remove(ctrl), Ни один из них не приводит к ошибке, но текстовые поля не удаляются, и поверх них создаются новые. (По какой-то причине,

Это первый раз, когда я динамически создаю / удаляю элементы управления в.NET, поэтому возможно, что мое стремление к массивам элементов управления VB6 как-то связано с ошибкой.

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

Public Class frmTableEdit

Private isNew As Boolean
Private inputText() As TextBox

Private Sub FormTableEdit_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    For Each ctrl As Control In Me.Controls
        If TypeOf (ctrl) Is TextBox Or TypeOf (ctrl) Is Label Then
            ctrl.Dispose()
        End If
    Next
    With frmKioskData.TBLobj
        Dim fieldCount As Integer = .Columns.Count - 1
        isNew = .SelectedIndices.Count = 0

        '(code setting size of form and location of OK/Cancel buttons is here)

        ReDim inputText(fieldCount)
        For i As Integer = 0 To fieldCount
            Dim lbl As New Label, txt As New TextBox
            inputText(i) = txt
            Me.Controls.Add(lbl)
            Me.Controls.Add(txt)

            '(code setting size and and position of lbl & txt is here)

            'lbl.Tag = i    (I commented these lines out because I never used the 
            'txt.Tag = i    Tag property, but can if a solution calls for it.)

            lbl.Text = .Columns(i).Text
            If isNew Then
                txt.Text = ""
            Else
                txt.Text = .Items(.SelectedIndices(0)).SubItems(i).Text
            End If
        Next
    End With
End Sub

End Class

1 ответ

Решение

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

Таким образом, у вас будет метод New в frmTableEdit, который использует этот параметр:

Public Sub New(ByVal fieldCount As Integer)
        InitializeComponent()
        fieldCount = fieldCount  'Where fieldCount is a class variable
End Sub

И когда вы вызываете эту форму из frmKioskData, вы можете сделать это так:

Dim newTableEdit As New frmTableEdit(Me.TBLobj.Columns.Count - 1)
newTableEdit.ShowDialog()
newTableEdit.Dispose()

Тогда код в событии Shown вашего frmEditTable просто должен добавить соответствующие элементы управления без необходимости удалять старые:

ReDim inputText(fieldCount)
For i As Integer = 0 To fieldCount
    Dim lbl As New Label, txt As New TextBox
    inputText(i) = txt
    Me.Controls.Add(lbl)
    Me.Controls.Add(txt)

    '(code setting size and and position of lbl & txt is here)

    'lbl.Tag = i    (I commented these lines out because I never used the 
    'txt.Tag = i    Tag property, but can if a solution calls for it.)

    lbl.Text = .Columns(i).Text
    If isNew Then
        txt.Text = ""
    Else
        txt.Text = .Items(.SelectedIndices(0)).SubItems(i).Text
    End If
Next

Как вы получаете значение isNew, зависит от вас - вы можете добавить его в качестве второго параметра в форму New или получить его таким же образом, как сейчас...w/e. Если бы это был я, я бы добавил это как еще один параметр New.

Другие вопросы по тегам