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

在vb.net中仅显示一定数量的文本框,vb.net,textbox,Vb.net,Textbox,我试图根据另一个文本框中的数字,使几个文本框可见和不可见。事实上,我有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

我试图根据另一个文本框中的数字,使几个文本框可见和不可见。事实上,我有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

设计提示:使用文本框而不是文本框。 然后定义
最小值
最大值
值,而
表示当前选择的值。这使得代码对不正确的输入更加健壮

因此,代码可以如下所示:

dim s as integer = Me.spinner.Value
For i as Integer = 1 to s
    Me.Controls("TextBox" & s.ToString).Visible = True
next
如果选择了值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
所以我稍微调整了一下表达式。我正在从LINQ分配一个变量textbox_number,以提取textbox的编号:

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...
此功能用于演示,应加以改进以使其更安全。不过,它会为你的目的而工作。通过执行此技巧,我可以执行数字排序,以便按正确的顺序列出控件。 因此,如果在微调器中选择5,则控件1到5将可见,其余控件将隐藏

我附上了一个截图。请注意,我将所有文本框放在一个文件夹中,以改进演示文稿。 很可能,您的控件直接放置在表单中,而不是容器中,然后只需将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
公共类frmtextboxs
私有子butShow_Click(ByVal发件人作为System.Object,ByVal e作为System.EventArgs)处理butShow。单击
Dim s As Integer=Me.spinner.Value'要显示的文本框数
'LINQ查询:获取按编号排序的文本框列表
Dim textboxs=来自Me.TableLayoutPanel1.Controls.Of type(文本框的)()中的txt_
让textbox_number=Convert.ToInt32(txt.Name.Substring(7,txt.Name.Length-7))_
其中txt.Name.StartsWith(“文本框”)_
按文本框编号“1、2、14”订购。。。
对于文本框中的每个ctl
Console.WriteLine(“找到文本框,名称:”&ctl.txt.name&“=>”&ctl.TextBox\u编号)

如果ctl.textbox\u number我创建了一个文本框列表,并将其填入表单加载。您可以在表单中的任何方法中使用此列表

在按钮中。单击我使用的
.TryParse
检查
TextBox7
的内容。我用AndAlso的测试增加了一个数字范围。如果
,则也会使
短路,以便在前一个条件为假时不会检查以下条件

接下来,我们使用
.Take
扩展函数来获取要更改的文本框。每个
循环的
实际更改
.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
Private TBoxes作为新列表(文本框)
私有子表单1_Load(发送方作为对象,e作为事件参数)处理MyBase.Load
TBoxes.AddRange({TextBox1,TextBox2,TextBox3,TextBox4,TextBox5,TextBox6})
端接头
私有子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击
Dim NUM可视为整数
如果Integer.TryParse(TextBox7.Text,NumVisible)和其他NumVisible>0和其他NumVisible<15,则
昏暗的可视框=t框。拍摄(NumVisible)
对于可视框中的每个tb
tb.Visible=True
下一个
其他的
MessageBox.Show(“请输入有效数字”)
如果结束
端接头

从这个角度来看,第一个while循环将不会执行,0小于14,因此当您到达while循环时,条件
s>14
将不为真。将字符串名称转换为对象也无法获得文本框。我建议您在代码文件的顶部使用
选项Strict On
,以突出其他问题。我将尝试回答此问题,但需要更多信息才能正确回答。如果您对文本框进行数组引用,如
Dim tbs={Textbox1、Textbox2、Textbox3、Textbox4、Textbox5、Textbox6、Textbox7、Textbox8、Textbox9、Textbox10、Textbox11、Textbox12、Textbox13、Textbox14}
然后你可以用数字表示它们,如
tbs(s)。Visible=True
-请记住数组从索引0开始,而不是1。但现在我遇到了一个新的奇怪问题:每次我在14个文本框中的任何一个框中键入一个字母,在框显示并正常运行后,选择切换到按钮测试,并在框中键入。不应将焦点设置回按钮。设置一个
TextChanged
事件处理程序和一些虚拟代码,您可以在其中为尝试键入的文本框设置断点,可能会显示一些内容。
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