Удаление элементов управления каждый раз, когда вызывается 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.