Попытка удалить всю строку в datagridview, если все ячейки в строке имеют одинаковое значение

У меня есть datagridview, в котором я заполняю через цикл, а затем использую рисование ячеек, чтобы сделать все ячейки, которые имеют значение te "$0,00". Что я пытаюсь сделать сейчас, так это то, что после выполнения моего цикла заполнения я хочу просмотреть каждую строку, и если каждая ячейка содержит «$ 0,00», я хочу удалить всю строку (включая заголовок строки). Как я могу сделать это с помощью цикла? Я искал в Интернете и наткнулся на «Datagridview1.rows.remove (datagridiew1 [строка])». Можно ли это реализовать, чтобы помочь мне выполнить это? Если да, то как? Пример кода приветствуется. Спасибо!

*Отредактировано для включения кода

У меня есть две подпрограммы, в которых я вызываю контрольную строку сразу после заполнения подпрограммы datagridview.

    Sub PopulateDataGridView()
    pb.Value = 0
    pb.Visible = True
    pb.Enabled = True
    'Loop through each column
    Dim cIndex As Integer = 0
    Dim rIndex As Integer = 0
    While cIndex < DataGridView1.ColumnCount



        'Loop through and populate each row in column
        rIndex = 0
        While rIndex < DataGridView1.RowCount

            'pb.Value = pb.Value + 1

            If cIndex = 0 Then
                'Set row header titles
                DataGridView1.Rows.Item(rIndex).HeaderCell.Value = sheet.Range("A1").Offset(rIndex + 1, cIndex).Value()

                DataGridView1.Rows(rIndex).Cells(cIndex).Value = sheet.Range("A1").Offset(rIndex + 1, cIndex + 1).Value()
            End If
            If cIndex > 0 Then
                DataGridView1.Rows(rIndex).Cells(cIndex).Value = sheet.Range("A1").Offset(rIndex + 1, cIndex + 1).Value()
            End If

            'Set column header title
            DataGridView1.Columns(cIndex).HeaderText = sheet.Range("A1").Offset(0, cIndex + 1).Value

            'Change last cell (Result) color Red or Green to represent positive gain or negative loss
            If rIndex = RowCount - 2 Then
                If DataGridView1.Rows(rIndex).Cells(cIndex).Value < 0 Then
                    DataGridView1.Item(cIndex, rIndex).Style.BackColor = Color.Red
                    DataGridView1.Item(cIndex, rIndex).Style.ForeColor = Color.White
                End If
                If DataGridView1.Rows(rIndex).Cells(cIndex).Value > 0 Then
                    DataGridView1.Item(cIndex, rIndex).Style.BackColor = Color.Green
                    DataGridView1.Item(cIndex, rIndex).Style.ForeColor = Color.White
                End If
                If DataGridView1.Rows(rIndex).Cells(cIndex).Value = 0 Then
                    DataGridView1.Rows(rIndex).Cells(cIndex).Value = "Broke Even"
                End If

            End If

            pb.Value = pb.Value + 1
            rIndex = rIndex + 1
        End While

        'Make column unsortable
        DataGridView1.Columns(cIndex).SortMode = DataGridViewColumnSortMode.NotSortable

        cIndex = cIndex + 1

    End While
    pb.Visible = False
    pb.Value = 0
    pb.Enabled = False

    DataGridView1.AutoResizeColumns()

    'Resize all Row Headers so user can see Row Titles without resizing
    DataGridView1.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders)
End Sub

Sub EmptyRowCheck()
    Dim SkipRemove As Boolean
    'loop through rows in datagrid
    For Each Row As DataGridViewRow In DataGridView1.Rows
        SkipRemove = False
        'loop through each cell in row
        For Each Cell As DataGridViewCell In Row.Cells
            'if value is not $0.00 then set boolean and exit inner loop
            If Not Cell.Value = " $0.00" Then
                SkipRemove = True
                Exit For
            End If
        Next
        'check if to remove the row or not
        If Not SkipRemove = True Then
            DataGridView1.Rows.Remove(Row)
        End If
    Next
End Sub

Мой код будет включать

    PopulateDataGridView()
    EmptyRowCheck()

Проблема, с которой я столкнулся сейчас, заключается в том, что этот метод пропускает каждую вторую пустую строку, удаляя только половину пустых строк.


person CaffeinatedMike    schedule 23.12.2013    source источник
comment
Не могли бы вы предоставить код?   -  person Bjørn-Roger Kringsjå    schedule 23.12.2013


Ответы (2)


что-то вроде этого может работать:

    Dim SkipRemove As Boolean
    Dim Rowindex As Integer
    'loop through rows in datagrid starting from the bottom
    For Rowindex = DataGridView1.Rows.Count - 1 To 0 Step -1
        SkipRemove = False
        'loop through each cell in row
        For Each Cell As DataGridViewCell In DataGridView1.Rows(Rowindex).Cells
            If Not Cell.Value = "£0.00" Then
                SkipRemove = True
                Exit For
            End If
        Next
        'check if to remove the row or not
        If Not SkipRemove = True Then
            DataGridView1.Rows.RemoveAt(Rowindex)
        End If
    Next

это начинается в нижней части datagridview и предотвращает проблему пропуска.

person OSKM    schedule 23.12.2013
comment
Это работает по большей части. Единственное, что необычно, это то, что он пропускает каждую вторую пустую строку, поэтому удаляет только половину пустых строк. Есть идеи, почему? - person CaffeinatedMike; 23.12.2013

Это должно выглядеть примерно так:

Dim RemoveThis AS Boolean = True

FOR EACH dgvrow AS Datagridviewrow IN Datagridview1.Rows
'Loop thru each row

    FOR i AS Integer = 0 to Datagridview1.Columncount
    'Loop thru each column/field of the current row

        IF NOT dgvrow(i)="$0.00" THEN RemoveThis = False
        'If any one of the cells does not contain the value "$0.00", do not remove the row
    NEXT

    If RemoveThis THEN Datagridview1.Rows.Remove(dgvrow)
    RemoveThis = True
NEXT
person Ruben_PH    schedule 23.12.2013
comment
Я получаю следующую ошибку при попытке реализовать ваш метод. Ошибка для «dgvrow», и ошибка заключается в том, что класс «System.Windows.Forms.DataGridViewRow» не может быть проиндексирован, поскольку у него нет свойства по умолчанию. - person CaffeinatedMike; 23.12.2013