Совет по дизайну: используйте spinner вместо текстового поля. Затем вы определяете значения Minimum
и Maximum
, а Value
представляет текущее выбранное значение. Это делает код более устойчивым к некорректному вводу.
Таким образом, код может выглядеть следующим образом:
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
Здесь мы l oop на дочерних элементах управления формы, ищем элементы типа Textbox. i
- это внутренний счетчик, который увеличивается при каждом появлении элемента управления TextBox, имя которого начинается с 'TextBox'. Если имя элемента управления начинается с TextBox, а остальная часть строки представляет собой число <= значение счетчика, мы устанавливаем для свойства Visible значение True. В противном случае Visible имеет значение False. </p>
Поэтому, если значение счетчика равно 5, элементы управления TextBox1 - TextBox5 должны стать видимыми, а остальные должны быть скрыты. Преимущество этого подхода заключается в том, что количество текстовых полей может быть переменным.
Отказ от ответственности: непроверенный код.
Обновление 09 марта 2020 года
Вот пересмотренная версия который опирается на запрос LINQ для извлечения отсортированного списка текстовых полей в форме, при условии, что ваши элементы управления всегда имеют одинаковые имена ie textbox1 - 14.
Теоретически этот код мог бы сделать трюк, но он не будет сортироваться, как я хочу, за ie 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...
Так что я немного подправил выражение. Я назначаю переменную textbox_number из LINQ для извлечения номера текстового поля:
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...
Эта функция предназначена для демонстрации и должна быть улучшена, чтобы сделать ее более безопасной. Это будет работать для вашей цели, хотя. Делая этот трюк, я могу выполнить цифру c сортировку , чтобы элементы управления были перечислены в правильном порядке. Поэтому, если вы выбираете 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