【问题标题】:Delete multiple textboxes from list of controls从控件列表中删除多个文本框
【发布时间】:2014-12-20 13:24:17
【问题描述】:

我有一个在控件列表中动态创建的控件列表。用户可以选择在控制列表中添加textboxes 并删除它们。

我使用以下代码创建了textboxes

Dim tb As New TextBox
tb.Name = "Textbox" & counter.ToString
tb.Left = 55
tb.Top = fields
Me.Controls.Add(tb)
MyControls.Add(tb)
counter = counter + 1

因此,textbox 创建时的名称为Textbox1Textbox2 等等,最多可达Textbox10

用户可以通过点击按钮一一删除textboxes。如果用户想删除这些textboxescounter会向后运行,会先删除Textbox10,然后再删除Textbox9,依此类推(这与先进先出相同)。

所以,为了删除,我尝试了以下代码,但它没有执行,出现错误。代码写在Button的删除按钮的Click事件下。

For Each CType(Me.Controls("Textbox" & counter), TextBox) As Control In MyControls
     Me.Controls.Remove(...) 'The textbox's name to be deleted in place of dots
     'The textbox name to be deleted here with .Dispose()
Next

错误是:上面代码的第一行中的“表达式是一个值,因此不能成为赋值的目标”。

如何动态删除一系列textboxes

【问题讨论】:

  • "但它没有执行,出现错误。" -- 错误是什么?
  • 哦,我忘了写错误——“表达式是一个值,因此不能成为赋值的目标。”
  • 请不要在 cmets 中发布——更新问题。另外,它到底发生在哪里(在哪一行)?
  • 已经做了,好吧。有什么帮助吗?

标签: vb.net textbox controls


【解决方案1】:

此行导致问题:

For Each CType(Me.Controls("Textbox" & counter), TextBox) As Control In MyControls

CType(Me.Controls("Textbox" & counter), TextBox) 解析为一个值,因此它不能是循环增量变量。

要基于循环删除,您需要知道要删除多少控件。这是一种方法:

For i As Integer = 1 To Math.Min(NumberOfControlsToDelete, 10) ' Cap deleting at 10.
    ' Make sure we don't go below 1.
    If counter < 1 Then Continue

    ' Expected that the control will exist.
    Me.Controls.Remove(Controls.Find("TextBox" & counter, True)(0))
    ' Decrement counter.
    counter -= 1
Next

【讨论】:

  • 它给出了一个错误-“没有为'Public Function Find(key As String, searchAllChildren As Boolean) As System.Windows.Forms.Control()'的参数'searchAllChildren'指定参数。”但看起来这与我需要的东西有关。
  • @Error404 - 我总是忘记那个参数。我更新了答案。
  • 还是有错误。我花了很多时间来修改,但没有任何帮助。 “'System.Windows.Forms.Control' 的一维数组类型的值无法转换为 'System.Windows.Forms.Control'。”我真的很无奈。
【解决方案2】:

您似乎已经通过将这些动态按钮添加到列表来跟踪它们?在这一行(你的第 6 行代码):

MyControls.Add(tb)

因此,只需抓取最后一个条目并将其删除,无需按名称搜索控件:

    If MyControls.Count > 0 Then
        Dim TB As TextBox = MyControls(MyControls.Count - 1)
        MyControls.Remove(TB)
        TB.Dispose()
    End If

如果你想同时删除它们:

    For Each TB As TextBox In MyControls
        TB.Dispose()
    Next
    MyControls.Clear()

【讨论】:

    【解决方案3】:

    这就是你要找的吗?我不确定我是否正确阅读了您的问题。

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Me.Controls.Remove(Me.Controls.Find(""Textbox" & counter"))
    End Sub
    

    【讨论】:

    • 有点。但它给出了一个错误-“没有为'Public Function Find(key As String,searchAllChildren As Boolean)As System.Windows.Forms.Control()'的参数'searchAllChildren'指定参数。”我应该在这里做什么?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    相关资源
    最近更新 更多