0

Zuerst habe ich die DataTable wie unten gezeigt eingerichtet. Es wurden 3 Spalten mit Desc, Price und der vollständigen Zeichenfolge hinzugefügt, die angezeigt werden sollen.VB.NET Wie Sie ausgewählte Zeilen aus DataTable entfernen und auf CheckedListBox aktualisieren?

Dann erstelle ich eine neue Datenansicht und binden Sie die CheckedListBox1 an die DataTable.

checkListView = New DataView(checkBoxDT) 
    checkListView.Sort = "Desc ASC, Price ASC" 
    CheckedListBox1.DataSource = checkListView 
    CheckedListBox1.DisplayMember = "DisplayText" 

Hier füge ich neue Elemente in die CheckedListBox1 mit dem Code unten

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim quan As Integer = 0 
    Dim currentPrice As Decimal = 0.0 
    If ComboBox2.SelectedIndex > 0 Then 
     quan = Convert.ToInt32(ComboBox2.Text.Trim()) 
     currentPrice = Convert.ToDecimal(TextBox3.Text.Trim()) 
     For i As Integer = 1 To quan 
      checkBoxDT.Rows.Add({ComboBox1.Text, Convert.ToDecimal(TextBox3.Text)}) 
      totalItems = totalItems + 1 
      totalPrice = totalPrice + currentPrice 
     Next 
    Else 
     currentPrice = Convert.ToDecimal(TextBox3.Text.Trim()) 
     checkBoxDT.Rows.Add({ComboBox1.Text, Convert.ToDecimal(TextBox3.Text)}) 
     totalItems = totalItems + 1 
     totalPrice = totalPrice + currentPrice 
    End If 
    TextBox5.Text = totalItems.ToString() 
    TextBox4.Text = totalPrice.ToString() 
End Sub 

Aber ich Problem habe die CheckedListBox1 Artikel in löschen. Hier ist was ich versucht habe.

Dies ist die Schaltfläche zum Löschen. Ich versuche, die Elemente in CheckedListBox1 für alle ausgewählten Elemente zu löschen. Dann zeigen Sie den richtigen Preis in TextBox4. Wenn ich nur 1 zu löschendes Element auswähle, funktioniert es einwandfrei. Aber mehrere ausgewählte Artikel funktionieren nicht richtig. Es löscht andere Elemente, die nicht ausgewählt sind.

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click 
    Dim currentPrice As Decimal = 0.0 

    While CheckedListBox1.CheckedItems.Count > 0 
     currentPrice = Convert.ToDecimal(CType(CheckedListBox1.SelectedItems(0), DataRowView).Item("Price").ToString()) 
     totalPrice = totalPrice - currentPrice 
     totalItems = totalItems - 1 
     checkListView.Delete(CheckedListBox1.SelectedIndex()) 
    End While 


    TextBox4.Text = totalPrice.ToString() 
    TextBox5.Text = totalItems.ToString() 
End Sub 
+0

dies versuchen: http: //vbcity.com/blogs/xtab/archive/2010/09/22/how-to-delete-selected- items-from-a-checkedlistbox.aspx statt löschen verwenden entfernen – coder32

+0

@ coder32 Ich habe den Leitfaden bereits gesehen. Immer noch nicht in der Lage zu tun, was ich will, also habe ich hier eine Frage gestellt. – Student

+0

[Geprüfte Zeilen in eine andere DataGridView anzeigen] (http://StackOverflow.com/q/37113690/1070452) – Plutonix

Antwort

1

Hier ist ein Beispiel, in dem die DataSource eine DataTable ist. Alle überprüften Elemente werden auf der DataTable.Rows-Ebene entfernt.

Dim dtSource As DataTable = CType(CheckedListBox1.DataSource, DataTable) 
Dim theItems As CheckedItemCollection = CheckedListBox1.CheckedItems 
Dim rows As New List(Of DataRow) 

For Each cItem In theItems 
    Dim row = CType(cItem, DataRowView).Row 
    rows.Add(row) 
Next 

For Each r As DataRow In rows 
    dtSource.Rows.Remove(r) 
Next 

Zweite Version mit Zahl und Summe

Dim dtSource As DataTable = CType(clbCheckedListBox.DataSource, DataView).Table 
Dim theItems As CheckedItemCollection = clbCheckedListBox.CheckedItems 
Dim rows As New List(Of DataRow) 

For Each cItem In theItems 
    Dim row = CType(cItem, DataRowView).Row 
    rows.Add(row) 
Next 

Dim Total As Decimal = rows.Select(Function(row) row.Field(Of Decimal)("Price")).Sum 
Dim Count As Integer = rows.Count 

Console.WriteLine($"Total: {Total}") 

For Each r As DataRow In rows 
    dtSource.Rows.Remove(r) 
Next 
+0

Ich erhalte einen Fehler bei 'dtSource':' Kann nicht Objekt vom Typ 'System.Data.DataView' zu schreiben 'System.Data.DataTable'.' – Student

+0

Dim dtSource Als DataTable = CType (clbCheckedListBox.DataSource, DataView) .Tabelle –

+0

Ich habe es geschafft, das zu beheben, aber ich möchte auch wissen, wie man den aktuell überprüften Artikel "Preis" bekommt, weil ich will zu Minus vom Gesamtpreis auch. Etwas wie 'currentPrice = Convert.ToDecimal (rows (r) (" Price "). ToString())' – Student