仅在 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 而不是文本框。
然后定义 Minimum
和 Maximum
值,而 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
我正在尝试使多个文本框可见和不可见,具体取决于另一个文本框中的数字。事实上我有 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 而不是文本框。
然后定义 Minimum
和 Maximum
值,而 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