2013-12-23 2 views
0

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

* Edited включить код *

У меня есть два Subs, в которых я называю проверки строки сразу после Заселите 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() 

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

+0

Не могли бы вы предоставить код? –

ответ

1

что-то подобное может работать:

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 и работает до предотвращения пропуска проблемы.

+0

Это работает по большей части. Единственное, что необычно, это пропустить любую другую пустую строку, поэтому она удаляет только половину пустых строк. Любая идея почему? – CaffeinatedCoder

+0

да, я знаю почему - опубликует обновление, чтобы исправить это! – OSKM

+0

Он отлично работает сейчас, спасибо! – CaffeinatedCoder

0

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

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 
+0

При попытке реализовать свой метод появляется следующее сообщение об ошибке. Ошибка для «dgvrow», а ошибка «Class» System.Windows.Forms.DataGridViewRow не может быть проиндексирована, поскольку она не имеет свойства по умолчанию ». – CaffeinatedCoder

Смежные вопросы