0

我有一个专门用该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
4

1 回答 1

0

如果@Plutonix 在上面的评论中的建议对你不太有效,我认为在调用 ShowDialog 之后处理表单会最简单也更有意义,然后当你需要显示该表单时,你会创建一个带有 a 的新实例告诉它要加载哪些动态控件的参数。

因此,您将在 frmTableEdit 中有一个使用此参数的 New 方法:

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()

然后,您的 frmEditTable 的 Shown 事件中的代码只需相应地添加控件,而无需删除旧控件:

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。如果是我,我通常会将其添加为另一个新参数。

于 2015-08-27T15:05:37.017 回答