Показывать только определенное количество текстовых полей в vb.net - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь сделать несколько текстовых полей видимыми и невидимыми, в зависимости от числа в другом текстовом поле. На самом деле у меня есть 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

Ответы [ 2 ]

1 голос
/ 08 марта 2020

Я создал список текстовых полей и заполнил его в форме Load. Вы можете использовать этот список любым способом в вашей форме.

В Button.Click я использовал .TryParse, чтобы проверить содержимое TextBox7. Я добавил диапазон номеров к тесту с AndAlso. И также замыкает If, чтобы следующие условия не проверялись, если предыдущее условие имеет значение False.

Далее мы используем функцию расширения .Take, чтобы получить текстовые поля, которые мы хотим изменить. A For Each l oop фактически изменяет состояние .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
0 голосов
/ 08 марта 2020

Совет по дизайну: используйте 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

enter image description here

...