2017-03-04 17 views
0

編集はにCheckedListBox項目が

選択されたときに、データベースから関連するdouble型の値を追加するこんにちは、私は私がデータベースから読み込まれたときの値の合計を表示する必要があり、このプログラムを持っています。私はこのような何か試してみました:

Dim selec As String 
    Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\rose&mike\Desktop\DbSysDel3\salondbaccess.accdb") 
    Dim dt2 As New DataTable 
    selec = "" 
    con.Open() 
    For Each incheck In chcklstbx1.CheckedIndices 
     Dim valName As String 
     valName = chcklstbx1.Items.Item(incheck).ToString 
     Dim sqlstr2 As String = "SELECT Service_Fee FROM Service_Types WHERE [Service_Name] = '" & valName & "'" 
     Dim cmd As New OleDbCommand(sqlstr2, con) 
     Dim sum As Double = 0 
     Dim rdr As OleDbDataReader = cmd.ExecuteReader 
     If rdr.HasRows Then 
      While rdr.Read 
       selec += "P" + rdr("Service_Fee").ToString & ControlChars.NewLine 
       sum = sum + rdr("Service_Fee") 

      End While 
     End If 
     lblFees.Text = selec 
     lblTotal.Text = sum.ToString 
     rdr.Close() 
    Next 
    con.Close() 

をしかし、それはないすべては、私がチェックしたときに1つずつ追加したい値を表示します。

+0

CheckedListBoxに基づいてクエリやループの適格性を確認する場所はどこにもありません。コード内のどこにでも表示されません。 – Plutonix

+0

私はそれを読むことができるようにあなたの投稿を編集しないでください – Plutonix

+0

@Plutonixはい私はすでに行いました。見てください。ありがとうございました。 – luca

答えて

0

は、ここでは、この全体のことをどのように処理すべきかの例です:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Using connection As New OleDbConnection("connection string here"), 
      adapter As New OleDbDataAdapter("SELECT Name, Amount FROM MyTable", connection) 
     Dim table As New DataTable 

     adapter.Fill(table) 

     'Bind the DataTable to the CheckedListBox. 
     'Normally the DataSource should be set last but, in my experience, that can cause problems with a CheckedListBox. 
     With CheckedListBox1 
      .DataSource = table 
      .DisplayMember = "Name" 
      .ValueMember = "Amount" 
     End With 
    End Using 
End Sub 

Private Sub CheckedListBox1_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles CheckedListBox1.ItemCheck 
    'Get all the currently checked items. 
    Dim checkedItems = CheckedListBox1.CheckedItems.Cast(Of DataRowView)().ToList() 

    'Get the item that is being checked or unchecked. 
    Dim currentItem = DirectCast(CheckedListBox1.Items(e.Index), DataRowView) 

    If e.NewValue = CheckState.Checked Then 
     'The current item is being checked so add it to the list. 
     checkedItems.Add(currentItem) 
    Else 
     'The current item is being unchecked so remove it from the list. 
     checkedItems.Remove(currentItem) 
    End If 

    'Sum the Amounts from each checked item. 
    Dim sum = checkedItems.Sum(Function(drv) CDec(drv("Amount"))) 

    'Use sum here. 
    '... 
End Sub 

あなたが表示するすべてのテキストおよび関連するすべての数値を含むアップフロントのすべてのデータを、取得します。そのデータは、としてCheckedListBoxにバインドされ、すべて一緒にパッケージされています。

ユーザーがリスト内の項目をチェックまたはチェック解除するたびに、既に持っているデータに基づいて計算が実行されます。データベースに戻る必要はありません。

ItemCheckイベントについて注意する重要なことは、アイテムがチェックされているかチェックされていない場合に発生することです。そのため、コードでは、現在のアイテムをチェックするか、チェックされたアイテムのリストから削除する必要があります。

DataTableをバインドすると、各バインドされたアイテムはDataRowView、つまりテーブルのDefaultViewのアイテムになります。チェックされたすべてのDataRowViewアイテムを取得し、数値を取得して合計します。私は簡潔に合計を計算するためにLINQクエリを使用しましたが、必要に応じてループを使用することができます。

Dim sum As Decimal = 0D 

For Each drv In checkedItems 
    sum += CDec(drv("Amount")) 
Next 
+0

私は実際にVB.Netには非常に新しいので、私のデザインが悪い場合はお詫び申し上げます。あなたが参考にしたサンプルを使って試してみるよ、ありがとう。 – luca

+0

謝罪する必要はありません。私が始めた時、私のアプリのデザインは悪かった。私は誰かのコードが悪いと言っていると判断しません。私は、コードの重要な変更がなぜ保証されるのかを強調しています。 – jmcilhinney

+0

すごくありがとう@jmcilhinneyありがとう。しかし今、私はチェックされたアイテムの個々の量を表示する方法を知らない、それは私が 'selec'を使うものです。どのように私はそれを正しく行う必要がありますかに関する任意の提案? – luca

関連する問題