CAS1224 Ответов: 3

Как скрыть строки datagridview, содержащие нулевые значения в vb.net


Привет, я надеюсь найти способ скрыть определенные строки моего datagridview, если они не содержат ничего или null. Мой datagridview привязан к источнику данных, который представляет собой рабочий лист excel. Я надеюсь, что при импорте я смогу скрыть пустые строки и отобразить только те, которые содержат значения. Я думаю, что что-то вроде этого сработает, но в последнее время мне не везло.
Dim Empty As Boolean = True

For i As Integer = 0 To dataGridView1.Rows.Count - 1
    Empty = True
    For j As Integer = 0 To dataGridView1.Columns.Count - 1
        If dataGridView1.Rows(i).Cells(j).Value IsNot Nothing AndAlso dataGridView1.Rows(i).Cells(j).Value.ToString() <> "" Then
            Empty = False
            Exit For
        End If
    Next
    If Empty Then
        dataGridView1.Rows.RemoveAt(i)
    End If
Next







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

3 Ответов

Рейтинг:
20

Gregory Gadow

Извините за другой ответ, который я дал: в последнее время я был так сосредоточен на веб-программировании, что создал решение для неправильного управления.

У меня было очень мало причин использовать привязанные к базе данных сетки в WinForms, но я верю, что это сделает то, что вы хотите:

Private Sub TestGridView_DataBindingComplete(ByVal sender As Object, _
ByVal e As DataGridViewBindingCompleteEventArgs) _
Handles DataGridView1.DataBindingComplete

    For Each Row As DataGridViewRow In CType(sender, DataGridView).Rows
        Dim Visible As Boolean = True

        'Do this to inspect all cells in the row
        For i As Integer = 0 To Row.Cells.Count - 1
            If Row.Cells(i).Value Is Nothing Then
                Visible = False
                Exit For
            End If
        Next

        'Or you can check specific columns for their values
        If Row.Cells(0).Value Is Nothing OrElse _
        (IsNumeric(Row.Cells(0).Value) AndAlso CInt(Row.Cells(0).Value) < 0) Then
            Visible = False
        End If

        Row.Visible = Visible
    Next
End Sub
То DataBindingComplete событие запускается после того, как все данные были привязаны. Пройдите ряд за рядом и определите, должна ли строка быть видимой или нет.

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

Второй показывает, как проверить определенные столбцы на наличие определенных значений; в этом случае смотрите только на первый столбец и подавляйте строку, если она либо ничего, либо целое число с отрицательным значением. То OrElse и AndAlso столяры закорачивают процесс оценки: если значение Nothing тогда оператор истинен, и числовые тесты никогда не выполняются для ячейки; если значение не является числовым, то он не будет пытаться преобразовать его.

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

Дайте мне знать, если это сделает то, что вам нужно. Если это так, не забудьте принять решение :)


CAS1224

Большое спасибо за ваш ответ!

Рейтинг:
0

Gregory Gadow

Я никогда не пробовал делать это, но я думаю, что это будет соответствовать вашим потребностям:

Protected Sub TestGrid_RowDataBound(ByVal sender As Object, _
ByVal e As GridViewRowEventArgs)
    Dim DVR As DataRowView = CType(e.Row.DataItem, DataRowView)

    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim Visible As Boolean = True
        For i As Integer = 0 To e.Row.Cells.Count - 1
            If DVR(i) Is Nothing Then
                Visible = False
                Exit For
            End If
        Next
        e.Row.Visible = Visible
    End If
End Sub

В сетке RowDataBound событие, сначала определите, связываете ли вы строку данных; нам не нужно запускать этот код на строках верхнего и нижнего колонтитулов и т. д.

Далее, получите ссылку на DataItem, для ряда, бросая его в DataRowView Этот объект имеет свойство по умолчанию, и вы можете ссылаться на столбцы либо по индексу, либо по имени столбца.

Выполните проверку: вы можете проверить каждый столбец с помощью целочисленного цикла или только выбранные столбцы. Свойство возвращает Object, поэтому вы можете привести его к определенному типу данных для поиска определенных значений (например, вы можете подавить строку, если целочисленный столбец меньше нуля). Если вы используете это с источником данных из SQL, вы бы протестировали его против DBNull.Value чтобы найти SQL null.

Если строка соответствует спецификациям "подавить эту строку", то просто установите ее невидимой. Когда элемент управления будет визуализирован, все невидимые строки будут опущены из выходных данных.

Обновление Я изменил пример кода, чтобы он больше соответствовал тому, о чем вы просите.


CAS1224

Спасибо за ваш ответ. Мой datagridview, похоже, не имеет события RowDataBound, есть ли альтернатива?

CAS1224

Я использую datagridview, а не dataview. Должна быть альтернатива этому для работы с datagridview.

Gregory Gadow

Д'о! В последнее время я так сосредоточился на веб-программировании, что ... во всяком случае. Позвольте мне опубликовать для вас еще один ответ с кодом.

Рейтинг:
0

Member 11864556

Для удаления специфической ценности

Dim rdval As Integer = Form1.DGVlap.RowCount - 1
    If rdval > 0 Then
       Try
            For i As Integer = 0 To rdval
               If i > 0 Then
                  If Form1.DGVlap.Rows(i).Cells(12).Value.ToString = "1" Then
                     Form1.DGVlap.Rows(i).Visible = False
                  End If
               End If
            Next
       Catch ex As Exception
            MsgBox(ex.Message)
       End Try
     End If


Получите ошибку в строке 0, если значение = 1, me remove row 0 with add-If i > 0 Then -


Richard Deeming

Этот вопрос был задан, на него ответили и решили ЧЕТЫРЕ ГОДА НАЗАД!