Вывод 2 списков данных, но их организация в VB

Надеюсь, это будет мой последний вопрос на какое-то время, и то, что я получил от вас, поможет мне по-настоящему продолжить этот проект! Итак ... в настоящее время у меня есть поля со списком variosu и текстовые поля, которые помещаются в список строк на FORM2, все пробелы игнорируются, а затем выводятся в поля списка на FORM3. это моя последняя часть .. поле со списком 1 будет заполнено, скажем, «Премиум», затем текстовое поле 1 будет иметь 4 значения «400 500 600 700», затем поле со списком 2 с «Обложка» и текстовое поле 2 «TPO, TPFT, COMP»

Я хочу, чтобы он выглядел следующим образом: любые ---- предназначены только для разнесения, поскольку кажется, что он игнорирует пробел

Listbox1 --- | --- ListBox2
Premium ------------ 400
------------------- ------ 500
------------------------- 600
----------- -------------- 700
Обложка ----------------- TPO
---------- --------------- TPFT

и т. д. и т. д.
я получаю

Listbox1 --- | --- ListBox2
Премиум ------------ 400
Обложка ----------------- 500
------------------------- 600
------------------ ------- 700
------------------------- TPO
---------- --------------- TPFT

нет никакой связи между полями, и я не знаю, как лучше всего описать или найти, как это сделать, сделать так, чтобы он выводил поле со списком одним, а затем текстовое поле1 разделено на строки во втором поле. затем под ними следующее поле со списком и т. д., поэтому я предполагаю, что combobox + ((текстовое поле 1 строки -1 значение) как пустые строки), если бы я мог разместить изображения, это было бы намного проще! черт возьми, репутация !!!!

Наконец-то я могу сфотографироваться !!!!! введите описание изображения здесьНадеюсь, вы видите, что форма 1 сейчас неактуальна (не повлияет на GUI для form2 / 3), но вы выбираете различные поля в форме 2, и они отображаются в form3 ATM, некоторые данные отображаются в странном порядке. и нет форматирования между списками 1 и 2

Ниже представлена ​​ранняя концепция Form2 и Form3 Ранняя концепция Form2 и Form3

Это то, что я пытаюсь сделать, данные выложены в удобочитаемом формате (и за кулисами запускались различные DROOLS, которые будут преобразовывать данные и распечатывать результаты).


person Jonathan Spickernell    schedule 10.04.2013    source источник


Ответы (2)


Проблема в том, что вы используете неправильный элемент управления для работы. Вам нужен элемент управления, который может отображать несколько столбцов данных для каждого элемента в списке. Элемент управления 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 (в основном любого списка, такого как Array или List(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 может быть более подходящим. Вы можете показать каждое значение поля со списком как узел корневого уровня, а затем внутри каждого узла корневого уровня будет дочерний узел для каждого из значений с разделителями в текстовом поле, например:

  • Premium
    • 400
    • 500
    • 600
    • 700
  • Cover
    • TPO
    • TPFT
person Steven Doggart    schedule 10.04.2013
comment
Он удалил мой ответ на это, это имеет смысл, я вижу, что он будет работать, но, очевидно, это не жестко закодированные значения, которые я бы вводил, это данные, вручную выбранные / введенные в форму 2 в поле со списком и текст коробки. Могу ли я использовать что-нибудь из того, что мы делали в прошлом? разделите как коллекции строк и используйте combobox1 как Items.add (), затем разделите строку текстового поля 1 (,) как подэлементы, затем combo 2 .... и т. д.? p.s я приложил раннюю концепцию выше, которая может показать это немного яснее - person Jonathan Spickernell; 10.04.2013
comment
Абсолютно. Я просто показал жестко запрограммированные значения в качестве примера. Вы можете так же легко написать цикл for, который загружает элементы из списка или массива. - person Steven Doggart; 10.04.2013
comment
Urrrggg, я отстой в VB, попробовал пару вещей, просто чтобы взять то, что вы показали мне (отлично работает), и заставить его выдавать что-то из массива как Items.Add () Не могу заставить что-либо работать, мне действительно нужно сесть для несколько дней и по-настоящему изучите основы VB. вместо того, чтобы задавать вопросы бесконечно: P Допустим, я создаю массив / список полей со списком и отдельный список текстовых полей, как мне перенести их в приведенный выше список, а также как я могу сообщить, где разместить ответы поля со списком Так как каждый может иметь 1 или 5 значений, было бы легче хранить каждую коробку отдельно? - person Jonathan Spickernell; 10.04.2013
comment
Что ж, вы только что взорвали меня на части, не торопитесь, чтобы осмыслить все это, я полагаю, вы услышите от меня через день или два! : P Спасибо, Стивен - person Jonathan Spickernell; 10.04.2013
comment
Для каждой пары в качестве ControlPair в MyPairs ********** Думаю, я все это понимаю, но не могли бы вы объяснить, что такое eahc выше. Я понимаю, что пара - вы объявляете переменную, тогда ControlPair относится к созданному частному классу, не имея представления, что такое MyPairs. Другими словами, я понятия не имею, на что изменить эти значения для моей собственной работы: P - person Jonathan Spickernell; 10.04.2013
comment
Ты прав. pairs - это локальная переменная итератора для цикла, а ControlPair - это класс (тип переменной итератора). Я обновлю свой ответ, чтобы описать, что такое MyPairs. - person Steven Doggart; 10.04.2013

Никогда не полагайтесь на пробелы или пустые строки при форматировании. Напишите правильную разметку.

<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>
person Martin Joiner    schedule 10.04.2013
comment
ну, дело в том, что в текстовое поле можно поместить что угодно, это сложно объяснить без изображений Поле со списком 1 имеет около 100 значений для выбора, затем в текстовое поле можно поместить любое количество значений, помещенных в него в форме 2, которые будут выведены в форму / list на form3 (и, возможно, эти значения были пропущены через testharness, а выходные значения выводятся в третий список на form3. но пока я просто пытаюсь получить статическую информацию, переносимую и отображаемую правильно. - person Jonathan Spickernell; 10.04.2013
comment
Обновлено с картинками! моя репутация вскочила :) - person Jonathan Spickernell; 10.04.2013
comment
Извинения. Я ответил так, как думал, это вопрос HTML. Теперь я вижу, что вы пометили вопрос как формы vb.net, но было бы яснее, если бы вы определили контекст в вопросе. - person Martin Joiner; 10.04.2013
comment
Аххх, извините за это, Кофе не совсем сработал, когда я это печатал! - person Jonathan Spickernell; 10.04.2013