Die Leerzeilen werden vermutlich von der Datenquelle stammen. Während des Debuggens ist das zu überprüfen, wenn dgv_MaterialXLS.DataSource markiert wird und per Shift-F9 die Schnellüberwachung aufgerufen wird. Ein Klick auf die Lupe und der Inhalt der DataTable wird tabellarisch angezeigt. Die DataGridView zeigt diese "Leerzeilen" am Ende der Tabelle an, schlicht deshalb, weil sei vorhanden sind. Diese Zeilen müssen aus der DataTable entfernt werden. Wenn das Programm nur Daten anzeigen soll, dann könnte ein DataTable.Rows.RemoveAt() den Job übernehmen, sollen Daten zurückgeschrieben werden, ist DataTable.Rows(rowIndex).Delete() die bessere Wahl, da damit die Infos erhalten bleiben, welche Zeilen in der Datenquelle zu löschen sind (Beispielcode am Ende).
Anmerkung: eine DataGridView zeigt die Daten einer Tabelle. Im oben gezeigten Code gibt es mehrfache Zuweisungen
' DataGrid füllen und Daten anzeigen
With dgv_MaterialXLS
.DataSource = oDs.Tables(0) <==
.ReadOnly = True
.Refresh()
End With
' Dataset an Datagridview binden
For i = 0 To oDs.Tables.Count - 1
dgv_MaterialXLS.DataSource = oDs.Tables(i) <==
Next
Letztlich wird nur der Inhalt der letzten Tabelle in der DataGridView dargestellt. Die "Leerzeilen" der Tabelle oDS.Tables(oDS.Tables.Count - 1) z.B. per TrimEnd() entfernen:
Private Sub TrimEnd(ByVal dt As System.Data.DataTable)
For rowIndex As Integer = dt.Rows.Count - 1 To 0 Step -1
If IsRowEmpty(dt.Rows(rowIndex)) Then
dt.Rows(rowIndex).Delete()
Else
'bei erster nicht-leerer Zeile Vorgang abbrechen
Exit For
End If
Next
End Sub
Private Function IsRowEmpty(ByVal row As System.Data.DataRow) As Boolean
'alle Spalten berücksichtigen
For columnIndex As Integer = 0 To row.Table.Columns.Count - 1
Dim value As Object = row(columnIndex)
Dim arr As Array = Array.CreateInstance(row.Table.Columns(columnIndex).DataType, 1)
'Spalte gilt als leer, wenn Inhalt DBNull.Value oder Nothing oder Leerstring oder dem 'Empty'
'eines beliebigen Datentypes entspricht
If value IsNot System.DBNull.Value AndAlso _
value IsNot Nothing AndAlso _
((TypeOf value Is String AndAlso CStr(value) <> "") OrElse _
arr(0) Is Nothing OrElse Not value.Equals(arr(0))) Then
Return False
End If
Next
Return True
End Function