0

Сначала я установил DataTable, как показано ниже. Добавлено 3 столбца с Desc, Price и полная строка для отображения.VB.NET Как удалить выбранные строки из DataTable и обновить его до CheckedListBox?

checkBoxDT = New DataTable 
    checkBoxDT.Columns.Add(New DataColumn With 
        {.ColumnName = "Desc", .DataType = GetType(String)}) 
    checkBoxDT.Columns.Add(New DataColumn With 
        {.ColumnName = "Price", .DataType = GetType(Decimal)}) 
    checkBoxDT.Columns.Add(New DataColumn With 
        {.ColumnName = "DisplayText", .DataType = GetType(String), 
        .Expression = "Desc + ' - RM ' + Price"}) 

Затем я создаю новый DataView и привязать CheckedListBox1 к DataTable.

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

Здесь я добавляю новые элементы в CheckedListBox1 с кодом ниже

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 

Но у меня возникли проблемы при удалении элементов CheckedListBox1. Вот что я пробовал.

Это кнопка удаления. Я пытаюсь удалить элементы в CheckedListBox1 для всех выбранных элементов. Затем покажите правильную цену в TextBox4. Когда я выбираю только один элемент для удаления, он отлично работает. Но несколько выбранных элементов не работают должным образом. Он удаляет другой элемент, который также не выбран.

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

попробовать это: HTTP: //vbcity.com/blogs/xtab/archive/2010/09/22/how-to-delete-selected- items-from-a-checkedlistbox.aspx вместо удаления использовать удалить – coder32

+0

@ coder32 Я уже видел гид. Все еще не в состоянии делать то, что я хочу, поэтому я разместил здесь вопрос. – Student

+0

[Показывать отмеченные строки в другом DataGridView] (http://stackoverflow.com/q/37113690/1070452) – Plutonix

ответ

1

Вот пример, где DataSource является DataTable. Любые отмеченные элементы удаляются на уровне DataTable.Rows.

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 

Вторая версия с счета и сумму

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

Я получаю сообщение об ошибке в 'dtSource':' Невозможно использовать объект типа 'System.Data.DataView' для ввода типа 'System.Data.DataTable'.' – Student

+0

Dim dtSource As DataTable = CType (clbCheckedListBox.DataSource, DataView) .Table –

+0

Мне удалось это исправить, но я также хочу знать, как получить текущий элемент «Цена», потому что я хочу до минус от общей цены. Что-то вроде 'currentPrice = Convert.ToDecimal (строки (r) (« Цена »). ToString())' – Student