我正在填充我的列表视图,当我单击命令按钮时,数据将保存到数据库,但如果数据库中已存在数据,则数据将从我的列表视图中删除。我的问题是,当数据已经存在时,它会删除数据,但它总是在我的列表视图中留下1个数据。例如,我用数据库中已经存在的10个数据填充我的列表,当我按下命令按钮,因为它已经在数据库中,它将删除我的listview中的10个数据,它会在listview中留下最后一个数据
Dim ListOfExistingItem As List(Of Integer) = New List(Of Integer)
Try
locconn.Open()
For x = 0 To ListView2.Items.Count - 1
Dim a As String = ListView2.Items.Item(x).Text
a = ListView2.Items.Item(x).Text
Dim command As New SqlCommand
Dim TMP_SQL_VAL As String = "select count([Check-Out]) from tbl_list1 where barcode = '" + a + "'"
command = New SqlCommand(TMP_SQL_VAL, locconn)
Dim READER As SqlDataReader
READER = command.ExecuteReader()
READER.Read()
If READER(0) = 0 Then
MsgBox("Barcode: " & a & "is still Inside", MsgBoxStyle.Exclamation)
TextBox4.Text = Nothing
ListOfExistingItem.Add(x)
READER.Close()
End If
READER.Close()
Next
If Not IsNothing(ListOfExistingItem) Then
For Each x As Integer In ListOfExistingItem
If Not x >= ListView2.Items.Count - 1 Then
ListView2.Items.RemoveAt(x)
End If
Next
End If
答案 0 :(得分:0)
我认为你的问题比一分一秒的错误要复杂一点。
当你遍历ListOfExistingItem时,它应该包含要删除的项目的索引,你将从ListView2中删除项目。
问题在于,通过从列表中删除项目,您将更改其后的所有项目的位置。
例如,列出{a,b,c}列表。 ' a'的指数是0,' b'是1,' c'是2。
现在,如果您要说list.RemoveAt(1)那么它将删除' b'。这将导致' c'改为1而不是2。然后,当你去尝试删除' c'时,它就不会在同一个地方。
要快速解决问题,请尝试添加' ListOfExistingItem.Reverse'在最后一次'之前循环:
Call ListOfExistingItem.Reverse()
For Each x As Integer In ListOfExistingItem
If Not x >= ListView2.Items.Count - 1 Then
ListView2.Items.RemoveAt(x)
End If
Next
这样,您将从列表中的最后一项开始,向后工作,这样可以避免这个问题。