VB帮助:多个文本框按特定顺序显示为单个标签

时间:2013-12-23 02:56:24

标签: vb.net textbox label

我有一个涉及多个文本框和标签的项目。在选项卡中将有3个groupbox(gb)。 gb1将有单选按钮可供选择。 gb2将有一些标签和2行文本框。 gb3将包含所有将根据gb2中文本框中的用户输入进行修改的标签。 gp2中的标签和文本框将按行和列排列,并在运行时通过选择radiobutton2创建。

我想要完成的是从一行标签中获取数据,并且gb2中的两行8个文本框在gb3中按照从左到右的顺序排列为三个标签,基于文本长度为5的底部文本框和textchanged事件处理程序。请注意,并非所有框都需要填充。

例如,第1列和第4列下面的两个文本框都有用户输入。我想在gb3中使用两个单独的标签来按顺序显示用户输入,第1列为第1列,第4列为第2列。

如果没有构建卡车装载的if和then语句,怎么会这样呢

e.g。

if textbox9.textlength = 5 and textbox12.textlength = 5 then
    label17.text= textbox1.text & "  " & textbox4.text 
    label18.text= textbox9.text & "  " & textbox12.text
end if

要编码的所有8列文本框的用户输入组合太多。寻找更智能的解决方案。

也许这会有所帮助 enter image description here

3 个答案:

答案 0 :(得分:0)

也许创建一个子程序可能有帮助,朋友。

子例程是一组代码,当您调用它并为其提供适当的参数时,它会运行某个任务。

代替给出的例子,也许以下内容可以帮助您

     Public Sub ManipulateLables(ByVal FirstTextToCheck as Textbox, _
      ByVal SecondTextToCheck as Textbox, _
      ByVal FirstLabel as Label, _
      ByVal SecondLabel as Label, _
      ByVal FirstText as Textbox, _
      ByVal SecondText as Textbox, _
      ByVal ThirdText as Textbox, _
      ByVal FourthText as Textbox)


           If FirstTextToCheck.textlength = 5 and SecondTextToCheck.textlength = 5 then
                FirstLabel.text= FirstText.text & "  " & SecondText.text 
                SecondLabel.text= ThirdText.text & "  " & FourthText.text
           End If

     End Sub

现在,您可以通过绑定到事件处理程序的子例程来调用它们 例如:按下按钮:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ManipulateLabels(textbox9, textbox12, label17,label18, textbox1, textbox4, textbox9, textbox12)
    End Sub

这里发生的事情是我们调用了ManipulateLabels子程序,并将我们希望受子程序影响的控件作为Arguments传递。

子程序中的FirstToCheck现在变为Textbox9,SecondToCheck变为textbox12,依此类推。

如果这对您有所帮助,请告诉我们。

答案 1 :(得分:0)

我完全不了解你的要求。但这里有一个例子,建立在我自己的要求上,希望离你的不太远。在这个例子中,我在设计器中声明了4个TextBox,1个Label和1个Button。该应用程序的作用:

  1. 在表单加载中,将所有文本框添加到TextBox变量列表中。
  2. 单击按钮,根据TextBox的名称顺序遍历文本框列表,文本不为空,获取文本将其附加到由空格分隔的标签。

  3. 单击Button1后的

    屏幕截图: enter image description here

    TextBox名称(从左到右):TextBox1,TextBox2,TextBox3,TextBox4


    代码段:

    Dim TextBoxes As List(Of TextBox)
    
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TextBoxes = New List(Of TextBox)()
        For Each control As Control In TabPage1.Controls.Cast(Of Control).Where(Function(x) TypeOf x Is TextBox)
            TextBoxes.Add(control)
        Next
    End Sub
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Label1.Text = ""
        For Each textBox As TextBox In TextBoxes.Where(Function(x) x.Text.Length > 0).OrderBy(Function(x) CInt(x.Replace("TextBox", "")))
            Label1.Text &= textBox.Text & " "
        Next
    End Sub
    

    由于TextBox是根据您的情况从代码创建的,因此您可以在创建后将TextBox添加到列表中。我希望你能得到这个想法,并进一步希望这个概念适用于你的情况。

答案 2 :(得分:0)

如果按顺序命名文本框,使用Name-col,row格式,可以将它们展平为一个列表并检查是否有文本并将它们连接在一起。这样您就可以从名称中获取文本框的col,row位置。这样的东西可以工作,我使用“输入”作为文本框的名称:

    'This uses linq to flatten the result to an array, then join is used to create _
     a string with spaces between
    label1.Text = Join(gb2.Controls _
                        .OfType(Of TextBox)() _
                        .Where(Function(w) w.Name.Contains("Input") AndAlso Not w.Text = "") _
                        .OrderBy(Function(t) t.Name).ToArray, " ")

    label1.Text = String.Join(" ", gb2.Controls _
                        .OfType(Of TextBox)() _
                        .Where(Function(w) w.Name.Contains("Input") AndAlso Not w.Text = "") _
                        .OrderBy(Function(t) t.Name))

如果您使用的是旧版本的VS

,则可能需要Imports System.Linq