输出2个数据列表,但将它们组织在VB中

时间:2013-04-10 08:09:01

标签: vb.net forms list organization

这有希望成为我的最后一个问题,而且我从你自己获得的东西将帮助我真正继续这个项目! 所以...我目前将variosu组合框和文本框放入FORM2上的字符串列表中,忽略所有空格然后输出到FORM3上的列表框中。这是我的最后一件...... 组合框1将填充说“Premium”,然后文本框1将具有4个值“400,500,600,700” 然后组合box2与“封面”和textbox2“TPO,TPFT,COMP”

我希望它看起来如下任何----只是为了间隔,因为它似乎忽略空格键

Listbox1 --- | --- ListBox2
高级------------ 400
------------------------- 500
------------------------- 600
------------------------- 700
封面----------------- TPO
------------------------- TPFT

等等 我得到的是

Listbox1 --- | --- ListBox2
高级------------ 400
封面----------------- 500
------------------------- 600
------------------------- 700
------------------------- TPO
------------------------- TPFT

字段之间没有关系,我不知道如何最好地描述或查找如何做到这一点,使其输出组合框一,然后textbox1分成行到第二个框。然后在这些下一个组合框等等所以我猜组合框+((文本框1行-1值)为空行) 如果我能把照片放到这里会更容易! darnnn youu声誉!!!!

最后我可以拍照!!!!! enter image description here 正如您所希望看到的那样,表单1与momemnt无关(对于form2 / 3的GUI没有影响) 但是你选择了表格2中的各种字段,并将它们映射到form3 ATM的某些数据正以奇怪的顺序映射。列表1和2之间没有格式化

在下面找到Form2和Form3的早期概念Form2 and Form3 Early Concept

这就是我想要做的,数据以可读格式布局(并且幕后运行各种DROOLS,它将变形数据并打印出结果)。

2 个答案:

答案 0 :(得分:1)

问题是您使用了错误的控件来完成工作。您需要一个控件,可以为列表中的每个项目显示多列数据。 ListBox控件并不适用于此,因为它仅用于显示单个列。

假设这是一个WinForm项目,而不是WPF,我建议使用DataGridView控件或ListView控件。这些控件中的任何一个都可以显示多个列,但ListView控件仅显示多个列,其View属性设置为Details。由于我偏爱ListView控件,我自己,我会用一个例子给你一个例子:)

首先,在表单中添加ListView控件。然后,将设计器中控件的View属性设置为Details。然后单击按钮以编辑控件的Columns属性。添加两列。然后,使用这样的代码填充列表:

Dim item As ListViewItem = ListView1.Items.Add("Premium")
item.SubItems.Add("400")
item = ListView1.Items.Add("")
item.SubItems.Add("500")
item = ListView1.Items.Add("")
item.SubItems.Add("600")
item = ListView1.Items.Add("")
item.SubItems.Add("700")
item = ListView1.Items.Add("Cover")
item.SubItems.Add("TPO")
item = ListView1.Items.Add("")
item.SubItems.Add("TPFT")

如果看起来像是第一列的文本存储在组合框中,那么第二列的文本存储在逗号分隔的文本框中,那么你可以这样做:

For Each cbo As ComboBox In MyComboBoxes
    Dim first As Boolean = True
    For Each value As String In GetTextBoxForComboBox(cbo).Text.Split(",")
        Dim item As ListViewItem = Nothing
        If first Then
            item = ListView1.Items.Add(cbo.Text)
        Else
            item = ListView1.Items.Add("")
        End If
        item.SubItems.Add(value)
        first = False
    Next
Next

当然,不是像GetTextBoxForComboBox这样的方法,最好有一个存储控件配对的类,如下所示:

Private Class ControlPair
    Public Property Cbo As ComboBox
    Public Property Txt As TextBox
End Class

然后,您可以像这样循环遍历它们:

For Each pair As ControlPair In MyPairs
    ' ...
    For Each value As String In pair.Txt.Text.Split(",")
        ' ...
        ListView1.Items.Add(pair.Cbo.Text)
        ' ...
    Next
Next

For Each是一种方便的语法,用于迭代IEnumerable对象中的所有项目(基本上是任何列表,例如ArrayList(Of T))。因此,在这种情况下,MyPairs需要是ControlPair个对象的列表,例如:

Dim MyPairs As New List(Of ControlPair)()
Dim pair1 As New ControlPair()
pair1.Cbo = ComboBox1
pair1.Txt = TextBox1
MyPairs.Add(pair1)
Dim pair2 As New ControlPair()
pair2.Cbo = ComboBox2
pair2.Txt = TextBox2
MyPairs.Add(pair2)

或者,如果您不想创建自己的课程,可以使用Tuple(Of ComboBox, TextBox)

实际上,在看到截图后,看起来TreeView控件实际上可能更合适。您可以将每个组合框值显示为根级节点,然后在每个根级节点内部为文本框中每个分隔值的子节点,如下所示:

  • 高级
    • 400
    • 500
    • 600
    • 700
  • 封面
    • TPO
    • TPFT

答案 1 :(得分:0)

不要依赖空格或空行进行格式化。写出适当的标记。

<form>
<label>Premium</label>
<select name="premium">
    <option>400</option>
    <option>500</option>
    <option>600</option>
    <option>700</option>
</select><br><br>
<label>Cover</label>
<select name="cover">
    <option>TPO</option>
    <option>TPFT</option>
    <option>COMP</option>
</select>
</form>