仅在 vb.net 中显示一定数量的文本框

Only show a certain count of textboxes in vb.net

我正在尝试使多个文本框可见和不可见,具体取决于另一个文本框中的数字。事实上我有 14(TextBox1, TextBox2, ...),这是我目前的代码:

Dim s As Integer = 0

While s > 14
   s += 1
   Dim txtBox As String = "TextBox" & CStr(s)
   CObj(txtBox).Visible = False
End While




If txtBoxHowmany.Text = "" Then

   Else
      Dim s As Integer = 0

      While s > txtBoxHowmany.Text
            s += 1
            Dim txtBox As String = "TextBox" & CStr(s)
            CObj(txtBox).Visible = True
      End While
End If

设计提示:使用 spinner 而不是文本框。 然后定义 MinimumMaximum 值,而 Value 表示当前-selected 值。这使得代码对错误输入更加健壮。

因此代码可能如下所示:

dim s as integer = Me.spinner.Value
For i as Integer = 1 to s
    Me.Controls("TextBox" & s.ToString).Visible = True
next

如果 selected 值 5,则 TextBox1 到 TextBox5 变为可见,您可以继续其余部分并根据需要隐藏它们。

或者稍微高级一点的例子:

dim s as integer = me.spinner.Value

For Each ctl As Control In Me.Controls
    Dim i as integer = 1
    If TypeOf ctl Is TextBox Then
        If ctl.Name.StartsWith("TextBox") Then
            If ctl.Name = ("TextBox" & i.ToString()) ' eg TextBox1, TextBox5...
                If i <= s Then ' counter <= value of spinner
                    ctl.Visible= True
                Else
                    ctl.Visible= False
                End If
            End If
            i += 1
        End If
    End If
Next

这里我们循环窗体的子控件,寻找Textbox类型的子控件。 i 是一个内部计数器,每次出现名称以 'TextBox' 开头的 TextBox 控件时都会递增。如果控件名称以 TextBox 开头,并且字符串的其余部分是一个数字 <= 微调器值,我们将 Visible 属性 设置为 True。否则,Visible 设置为 False。

因此,如果微调器值为 5,则控件 TextBox1 到 TextBox5 应该可见,而其余控件将被隐藏。这种方法的优点是文本框的数量可以是可变的。

免责声明:未经测试的代码。


2020 年 3 月 9 日更新

这是一个修订版本,它依赖于 LINQ 查询来获取表单中 排序的 文本框列表,假设您的控件总是以相同的模式命名,即 textbox1 到14.

理论上这段代码可以解决问题,但它不会像我想要的那样排序,即 textbox1 后面是 textbox11、12、13、14,然后是 textbox2。

Dim textboxes= From txt In Me.TableLayoutPanel1.Controls.OfType(Of TextBox)() _
   Where txt.Name.StartsWith("TextBox") _
   Order By txt.Name ' 1, 2, 14...

所以我稍微调整了一下表达方式。我正在从 LINQ 中分配一个变量 textbox_number 来提取文本框的编号:

Dim textboxes = From txt In Me.TableLayoutPanel1.Controls.OfType(Of TextBox)() _
          Let textbox_number = Convert.ToInt32(txt.Name.Substring(7, txt.Name.Length - 7)) _
           Where txt.Name.StartsWith("TextBox") _
           Order By textbox_number ' 1, 2, 14...

此功能用于演示目的,应进行改进以使其更安全。不过,它会为你的目的工作。通过这个技巧,我可以执行 数字排序 ,以便控件以正确的顺序列出。 因此,如果您在微调器中 select 5,则控件 1 到 5 可见,其余控件隐藏。

我附上了截图。请注意,我将所有文本框放在 TableLayoutPanel 中以改进演示。 可能,您的控件直接放在窗体中而不是放在容器中,然后只需将 Me.TableLayoutPanel1.Controls 替换为 Me.Controls.

Public Class frmtextboxes

    Private Sub butShow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butShow.Click
        Dim s As Integer = Me.spinner.Value ' number of textboxes to show

        ' LINQ query: get list of textboxes sorted by number
        Dim textboxes = From txt In Me.TableLayoutPanel1.Controls.OfType(Of TextBox)() _
                  Let textbox_number = Convert.ToInt32(txt.Name.Substring(7, txt.Name.Length - 7)) _
                   Where txt.Name.StartsWith("TextBox") _
                   Order By textbox_number ' 1, 2, 14...

        For Each ctl In textboxes
            Console.WriteLine("TextBox found, name: " & ctl.txt.Name & "=> " & ctl.textbox_number)
            If ctl.textbox_number <= s Then
                Me.TableLayoutPanel1.Controls(ctl.txt.Name).Visible = True ' make control visible
            Else
                Me.TableLayoutPanel1.Controls(ctl.txt.Name).Visible = False ' hide control
            End If
        Next

    End Sub
End Class

我创建了一个文本框列表并将其填充到加载表单中。您可以在表单中的任何方法中使用此列表。

在Button.Click中我用.TryParse检查了TextBox7的内容。我使用 AndAlso 为测试添加了一个数字范围。 AndAlso 将 If 短路,这样如果前面的条件为 False,则不会检查以下条件。

接下来我们使用.Take扩展函数来获取我们想要改变的文本框。 For Each 循环实际改变 .Visible 状态。

Private TBoxes As New List(Of TextBox)

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    TBoxes.AddRange({TextBox1, TextBox2, TextBox3, TextBox4, TextBox5, TextBox6})
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim NumVisible As Integer
    If Integer.TryParse(TextBox7.Text, NumVisible) AndAlso NumVisible > 0 AndAlso NumVisible < 15 Then
        Dim VisibleBoxes = TBoxes.Take(NumVisible)
        For Each tb In VisibleBoxes
            tb.Visible = True
        Next
    Else
        MessageBox.Show("Please enter a valid number.")
    End If
End Sub