1

これがしばらくの間私の最後の質問になることを願っています。私が皆さんから得たものは、このプロジェクトを本当に進めるのに役立ちます! だから...私は現在、さまざまなコンボボックスとテキストボックスをFORM2の文字列のリストに入れています。すべての空白は無視され、FORM3のリストボックスに出力されます。これが私の最後の作品です..コンボボックス1には「プレミアム」と入力され、テキストボックス1には4つの値「400、500、600、700」があり、コンボボックス2には「カバー」、テキストボックス2には「TPO、TPFT、COMP」があります

次のようにしたい ---- スペースバーを無視しているように見えるので、スペースを空けるためだけのものです

リストボックス1 --- | --- ListBox2
プレミアム ------------ 400
--------------------------500
------ -------------------600
---------------700
カバー --- --------------TPO
--------------------------TPFT

などなど
私が得ているのは

リストボックス1 --- | --- ListBox2
プレミアム ------------ 400
カバー --- 500
------------- ------------600
--------------------------700
----------- --------------TPO
--------------------------TPFT

フィールド間に関係はなく、これを行う方法を最もよく説明または検索する方法がわからず、コンボボックス1を出力してから、textbox1を行に分割して2番目のボックスにします。次に、これらの下に次のコンボボックスなどがあるので、コンボボックス + ((テキストボックス 1 行 -1 値) を空白行として) 写真を配置できれば、これははるかに簡単になると思います! 評判が悪い!!!!

やっと写真撮れる!!!!!! ここに画像の説明を入力 ご覧のとおり、フォーム 1 は現時点では無関係ですが (フォーム 2/3 の GUI には影響しません)、フォーム 2 のさまざまなフィールドを選択すると、フォーム 3 の ATM にマップされます。変な順番。リスト 1 と 2 の間に書式設定はありません

Form2 と Form3 の初期の概念を以下に示しますForm2 と Form3 初期のコンセプト

これは私がやろうとしていることであり、データは読み取り可能な形式でレイアウトされています (そして、データをモーフィングし、この結果を出力するさまざまな DROOLS を舞台裏で実行しました)。

4

2 に答える 2

1

問題は、ジョブに間違ったコントロールを使用していることです。リスト内の項目ごとに複数のデータ列を表示できるコントロールが必要です。このListBoxコントロールは、1 つの列を表示するためだけに設計されているため、これにはあまり適していません。

これが WPF ではなく WinForm プロジェクトであると仮定すると、DataGridViewコントロールまたはコントロールのいずれかを使用することをお勧めしますListView。これらのコントロールはどちらも複数の列を表示できますが、コントロールはプロパティが に設定されてListViewいる複数の列のみを表示します。私自身、コントロールに偏っているので、それを使用した例を示します:)ViewDetailsListView

ListViewまず、フォームにコントロールを追加します。次に、Viewデザイナーでコントロールのプロパティをに設定しますDetails。次に、ボタンをクリックしてColumns、コントロールのプロパティを編集します。2 つの列を追加します。次に、次のようなコードを使用してリストを作成します。

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")

最初の列のテキストがコンボ ボックスに格納され、2 番目の列のテキストがカンマ区切りのテキスト ボックスに格納されている場合、次のようなことができます。

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は、オブジェクト内のすべての項目 (基本的には anや aIEnumerableなどの任意のリスト)を反復処理するための便利な構文です。したがって、この場合、はオブジェクトのリストである必要があります。たとえば、次のようになります。ArrayList(Of T)MyPairsControlPair

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
于 2013-04-10T12:52:03.240 に答える
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>
于 2013-04-10T08:17:40.890 に答える