2017-06-02 9 views
-2

ユーザーはピザ、サイズなどを選択し、ピザはバスケット(listview)に追加されます。フォームはクリアされますが、ユーザーは追加ボタンを再度クリックすると、不要な行がリストビューに追加されます。私は、新しいレコードを追加する前にチェックボックスがチェックされているかどうかを確認するforループを実装しようとしました。その結果、必要なレコードがリストビューに追加されますが、メッセージはx回ポップアップします。この繰り返しのメッセージボックスは、チェックボックスなしのボタンをクリックしたときにも発生します。助けてください?リストビューへの複数の追加の防止

'Add Pizza to Listview 
Private Sub btnAddPizza_Click(sender As Object, e As EventArgs) Handles btnAddPizza.Click 
    Dim itemname As String 
    Dim price As Decimal 
    Dim qty As Integer 
    grandtotal = 0 
    'Add to list view 
    For Each rb1 In {rb01, rb02, rb03, rb04, rb05, rb06, rb07, rb08, rb09, rb10, rb11, rb12, rb13, rb14, rb15} 
     If rb1.Checked = True Then 
      itemname = GetCheckedItem() 
      price = CDec(pizzacost) 
      qty = 1 
      ListView1.Items.Add(New ListViewItem({itemname, qty, price})) 
     ElseIf rb1.Checked = False Then 
      MsgBox("No pizza is selected", MsgBoxStyle.Information) 
     End If 
    Next 
    'recalculate grandtotal (bottom of listview) 
    For Each x As ListViewItem In ListView1.Items 
     grandtotal += CDec(x.SubItems(2).Text) 
    Next 
    lblGrandTotal.Text = "£ " & grandtotal 
    'Discard Pizza selection 
    For Each rb In {rb01, rb02, rb03, rb04, rb05, rb06, rb07, rb08, rb09, rb10, rb11, rb12, rb13, rb14, rb15} 
     rb.Checked = False 
    Next 
    For Each rb In {rbSmall, rbMedium, rbLarge, rbSuper} 
     rb.Checked = False 
    Next 
    For Each rb In {rbDeep, rbThin, rbStuffed} 
     rb.Checked = False 
    Next 
    lblTotalPizza.Text = "" 
    itemname = "" 
    price = 0 
End Sub 

答えて

1

それはあなたがやろうとしているかを正確に明確ではないのですが、私はあなたの問題はあなたが一度だけ実行するループのためのあなたの内部のコードをしたいということにあると思います。

If radioButtons.Any(Function(rb) rb.Checked) Then 
    ' Add item 
Else 
    ' Show Error 
End If 
:言い換えれば、むしろこれより:

For Each rb In radioButtons 
    If rb.Checked Then ' This happens once per radio button 
     ' Add item 
    Else 
     ' Show Error 
    End If 
Next 

あなたはこのような何かをしたい:それはAny拡張メソッドのヴィア

Dim found As Boolean 
For Each rb In radioButtons 
    If rb.Checked Then ' This happens once per radio button 
     found = True 
    End If 
Next 
If found Then ' This happens once after the loop is done 
    ' Add item 
Else 
    ' Show Error 
End If 

しかし、LINQは、そのようにさらに簡単なものになります

+0

伝説のもの!ありがとうございます – James

+1

LINQは行く方法です。私は個人的にラジオボタンのクリックハンドラで 'btnAddPizza.Enabled = radioButtons.Any(Function(rb)rb.Checked)'を持っています – djv

関連する問題