Not sure if this is your problem, but I've always had issues deleting from a list (Rows) within a For Each that is traversing the list.

I usually use a standard for loop that begins with the last index and counts down to the first.

Dim nLastRowIndex As Integer = DataGridView1.Rows.Count - 1
Dim nIndex As Integer = 0

For nIndex = nLastRowIndex To 0 Step -1
    If DataGridView1.Rows[nIndex].Cells("Select").Value = True Then
        ' ... Code to Delete the Row
    End If
Next

Code is not tested, and my VB.NET is a bit rusty.

-----Original Message-----
From: Ian Thomas
Sent: 1/7/2012 10:36 PM

I'm stuck on something that must be fairly simple, if not obvious. It's just a small home project that should have taken an hour or so.

I am writing a simple utility to clean up duplicate files on disk, which calculates crc32 for all files of a type in a folder and displays the checksum and some file info in a Windows Forms DataGridView, which has a checkbox column (DataGridViewCheckBoxColumn).

Files to be deleted are chosen by the user, by inspection (using the checksum, etc) and deleted to the Recycle Bin with My.Computer.FileSystem.DeleteFile(FileToDelete, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin (.NET v4.0, Visual Basic).

Under trial & error testing, I can confirm that all chosen files are deleted (always) -- but I am having consistent troubles with clearing the deleted rows from the DGV. Several items remain, and their checkboxes remain checked.

A button starts the delete and clear process. I first check that there are rows (files) marked for deletion -

Public Function CountChecked() As Integer

Dim counter As Integer = 0

For Each row As DataGridViewRow In DataGridView1.Rows

' Named cell 'Select' is a DataGridViewCheckBoxColumn

If row.Cells("Select").Value = True Then

                counter = counter + 1

Debug.Print("{0}", row.Cells("FileName").Value)

End If

Next

Return counter

End Function

Then the file deletion process can begin -

Public Function DeleteChecked() As Boolean

Dim FileToDelete As String = ""

Dim rowToDelete As Int32 = vbNull

Dim nDeleted As Integer = 0

Dim nRowsRemoved As Integer = 0

Try

' loop through and delete the physical files

For Each row As DataGridViewRow In DataGridView1.Rows

If row.Cells("Select").Value = True Then ' the column named "Select" is a DataGridViewCheckBoxColumn

'Fully-pathed filename

FileToDelete = CurrentFolder & "\" & (row.Cells("FileName").Value)

' Delete (move to Recycle Bin)

'My.Computer.FileSystem.DeleteFile(FileToDelete, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin) ' Probably too conservative

My.Computer.FileSystem.DeleteFile(FileToDelete, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) ' should be OK

                    nDeleted = nDeleted + 1

End If

Next

Debug.Print("Deleted {0} files", nDeleted) ' Result = 15

' Remove rows from the DataGridView

For Each row As DataGridViewRow In DataGridView1.Rows

If row.Cells("Select").Value = True Then

                    nRowsRemoved = nRowsRemoved + 1

                    rowToDelete = row.Index

Me.DataGridView1.Rows.RemoveAt(rowToDelete)

Me.DataGridView1.Refresh() ' refresh isn't fixing the discrepancy

End If

Next

Debug.Print("Removed {0} rows from the DataGridView", nRowsRemoved) ' Result = 10 removed

Return True

Catch ex As Exception

Debug.Print(ex.Message)

End Try

Return False

End Function

I have a folder full of 5000 image files, many similarly named and with identical checksums, and my trial & error testing with a small subset in the DGV always results in a discrepancy similar to the above (highlighted). I can check the test folder and the recycle bin -- and restore any of the files, of course -- and always have rows that are not removed from the DGV. The discrepancy seems to be up to 50% of the checked rows still remaining (eg, 4 of 7, 10 of 21, 5 of 15).

There are no permissions problems on the folder or files, and no exceptions appear. Oh, and the DGV is not in virtual mode.

Suggestions?

------------------------------------------------------------------------

Ian Thomas
Victoria Park, Western Australia

No virus found in this message.
Checked by AVG - www.avg.com <http://www.avg.com>
Version: 2012.0.1901 / Virus Database: 2109/4728 - Release Date: 01/07/12


Reply via email to