2017-05-05 15 views
0

ここで私がしようとしているのは、チェックボックスでチェックまたは選択したすべての項目をチェックボックスに入れて の文字列配列に入れて、ボタンのトリガーによってラベル.. は、ここで私はこれまで試してみましたコードだ...チェックボックスの選択項目を文字列配列に配置する方法

Dim arraySize As Integer 
Dim lbl() As Label 
Dim str() As String 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Label1.Text = arraySize 
End Sub 
Private Sub chkOption1_CheckedChanged(sender As Object, e As EventArgs) Handles chkOption1.CheckedChanged 
    If chkOption1.Checked = True Then 
     arraySize = arraySize + 1 
    Else 
     arraySize = arraySize - 1 
    End If 
    Label1.Text = arraySize 
End Sub 
Private Sub chkOption2_CheckedChanged(sender As Object, e As EventArgs) Handles chkOption2.CheckedChanged 
    If chkOption2.Checked = True Then 
     arraySize = arraySize + 1 
    Else 
     arraySize = arraySize - 1 
    End If 
    Label1.Text = arraySize 
End Sub 
Private Sub chkOption3_CheckedChanged(sender As Object, e As EventArgs) Handles chkOption3.CheckedChanged 
    If chkOption3.Checked = True Then 
     arraySize = arraySize + 1 
    Else 
     arraySize = arraySize - 1 
    End If 
    Label1.Text = arraySize 
End Sub 
Private Sub chkOption4_CheckedChanged(sender As Object, e As EventArgs) Handles chkOption4.CheckedChanged 
    If chkOption4.Checked = True Then 
     arraySize = arraySize + 1 
    Else 
     arraySize = arraySize - 1 
    End If 
    Label1.Text = arraySize 
End Sub 
Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click 
    ReDim lbl2(arraySize) 
    ReDim str(arraySize) 
    For ctr = 1 To lbl2.Length - 1 
     lbl(ctr) = New Label 
     lbl(ctr).Width = 60 
     lbl(ctr).Height = 40 
     If ctr = 1 Then 
      lbl(ctr).Left = 20 
     Else 
      lbl(ctr).Left = ((lbl2(ctr).Width + 20) * ctr) - 60 
     End If 
     lbl(ctr).Top = Me.Height - lbl(ctr).Height * (5/2) 
     Me.Controls.Add(lbl(ctr)) 
    Next 
    For ctrs = 1 To gn.Length - 1 
     If chkAction.Checked = True Then 
      str(ctrs) = "Action" 
     End If 
     If chkFantasy.Checked = True Then 
      str(ctrs) = "Fantasy" 
     End If 
     If chkMystery.Checked = True Then 
      str(ctrs) = "Mystery" 
     End If 
     If chkWar.Checked = True Then 
      str(ctrs) = "War" 
     End If 
     lbl(ctrs).Text = str(ctrs) 
    Next 
End Sub 

の問題は、私が選択した1つまたは複数のチェックボックスをチェックするとき、 1が示されていますラベルのラベルは常にその順序に従って最後のチェックボックスです。たとえば、chkOption1、chkOption3、 chkOption2をチェックした場合、ラベルの出力はすべて「chkOption3」です。そして、アイテムをチェックして一度にボタンを1つ押すと、 はラベルに必要な値を表示します。しかし、私がしようとしているのは、1つまたは複数のチェックボックスを1つ以上選択すると、ボタンの1回のクリックでラベルのすべての値が表示されます。たとえば、option1、option4、option3、option2を選択すると、 ラベルのoption1〜4のすべての値...だから私はこれを行うことができますか?助けてください。事前のおかげで...

答えて

0

私はここでの原則は、タイプCheckBoxのすべてのコントロールをチェックし、その値を取得し、リストに追加することですList(Of T)For Each

となるだろう。

は、チェックボックスがGroupBox または他の容器内にあるかどうか、これは動作しませんように注意してください。その場合は、 をコンテナのすべてのコントロールにループする必要があります。

Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click 
    Label1.Text = "" 
    Dim SelectedGenres As List(Of String) 
    SelectedGenres = GetGenres() 
    For Each Genre As String In SelectedGenres 
     Label1.Text = Label1.Text & vbNewLine & Genre 
    Next 
End Sub 

そして、このような関数を使用します。

Public Function GetGenres() As List(Of String) 
    Dim Genres As New List(Of String) 
    Genres.Clear() 
    For Each ctrl As Control In Me.Controls 
     'If the control is of type Checkbox 
     Dim CurrentCheckbox As CheckBox 
     If TypeOf ctrl Is CheckBox Then 
      CurrentCheckbox = ctrl 
      If CurrentCheckbox.Checked = True Then 
       Genres.Add(CurrentCheckbox.Text) 
      End If 
     End If 
    Next 
    Return Genres 
End Function 
0

私は非常にサイズが変化し、特に以来、あなたの代わりに、配列のリストを使用することをお勧めします。配列のサイズを保持する必要はありません。ちょうどあなたがあなたのARRAYSIZE

selectedAction.Count 
を得た後

Dim selectedActions As New List(Of String) 

If chkAction.Checked Then selectedActions.Add("Action") 
If chkFantasy.Checked Then selectedActions.Add("Fantasy") 
If chkMystery.Checked Then selectedActions.Add("Mystery") 
If chkWar.Checked Then selectedActions.Add("War") 

(列の)リストを使用 値の最大数が固定されている場合は情報に

For ctr = 0 To selectedActions.Count-1 
    Dim lbl As New Label 
    lbl.Width = 60 
    lbl.Height = 40 
    If ctr = 1 Then 
     lbl.Left = 20 
    Else 
     lbl.Left = ((lbl2(ctr).Width + 20) * ctr) - 60 
    End If 
    lbl.Top = Me.Height - lbl.Height * (5/2) 
    Me.Controls.Add(lbl) 

    lbl.Text = selectedActions(ctrs) 
Next 

を取得するために、リスト

だけループ。空のラベルを追加したり、表示/非表示にしたり、値がない場合は.Textを ""に設定したりする方が簡単です。コードでは、毎回新しいラベルを作成します。

+0

私はこれを最初にやったと思っていましたが、ダイナミックなアプローチをとったのは、チェックボックスがたくさんあるからです。 – Mederic

+0

@Medericは良い点です。それを動かすと、グリッドを使用して(あなたのUIをどのように動作させるかによって)見ることができます。 –

+0

私は実際に動的なアプローチlolで答えた質問をしなかった – Mederic

関連する問題