2017-02-22 164 views
-1

我有以下代碼,它從Devexpress Datagrid中刪除空行。從網格刪除空行

Private Sub btnRemoveBlanks_ItemClick(sender As Object, e As ItemClickEventArgs) Handles btnRemoveBlanks.ItemClick 
    Try 
    Dim I As Integer 
     For I = 0 To StudentsGrid.DataRowCount - 1 
      Dim CellValue As Object = StudentsGrid.GetRowCellValue(I, "FirstName") 
     If String.IsNullOrWhiteSpace(CellValue.ToString) = True OrElse CellValue Is Nothing OrElse CellValue Is DBNull.Value Then 
      ' Debug.Print("Empty") 
      StudentsGrid.DeleteRow(I) 
     Else 
      ' Debug.Print("Not Empty") 
     End If 
     Next 
    StudentsGrid.RefreshData() 
    btnRefresh.PerformClick() 
    Catch ex As Exception 
    MessageBox.Show(ex.Message, "Error: " & System.Reflection.MethodBase.GetCurrentMethod.Name, MessageBoxButtons.OK, MessageBoxIcon.Error) 
    End Try 
End Sub 

然而,一個問題是,我接收

對象引用不設置爲一個對象的一個​​實例。

上線起點:if string.isnullorwhitespace

或者我必須點擊該按鈕兩次或三次,除去所有的空白。

有沒有更好的方法來確定行是空的還是空白的?任何想法我可能會改進這個代碼?

編輯:主要的原因問題是去除空白,這我能夠向後步進通過網格

+2

如果IsDBNull以便(CellValue)OrElse運算CellValue是Nothing OrElse運算... – Aaron

+1

你需要重新安排你的支票讓'CellValue爲Nothing '先來...如果它爲空,你不能檢查它的'ToString()'方法。您還需要向後循環而不是向前循環,否則一旦刪除一行,您的索引值將不同步。如果您必須前進,您必須在刪除後手動調整'i'的值 – pinkfloydx33

回答

2

你想要兩個不同的事情要做:

  1. 的空引用異常可以通過重新排序If命令中的條件來解決。
  2. 需要重新運行刪除多次是由於您如何遍歷行。您的For循環迭代至網格視圖中的行數。假設您目前正在查看第4行並決定將其刪除。現在前索引5的行取這個位置(每一行的索引減1)。在下一次迭代中,您會看到索引5,該索引現在是索引爲6的行,這意味着您將永遠不會查看原始第五行。爲了解決這個問題反向你的循環

試試這個稍微改變版本的代碼(未經測試):

Private Sub btnRemoveBlanks_ItemClick(sender As Object, e As ItemClickEventArgs) Handles btnRemoveBlanks.ItemClick 
    Try 
     Dim rowIdx as Integer = StudentsGrid.DataRowCount - 1 
     For i as Integer = rowIdx To 0 Step -1 
      Dim CellValue As Object = StudentsGrid.GetRowCellValue(I, "FirstName") 
      If CellValue Is Nothing OrElse IsDBNull(CellValue) OrElse String.IsNullOrWhiteSpace(CellValue.ToString()) Then 
       ' Debug.Print("Empty") 
       StudentsGrid.DeleteRow(i) 
      Else 
       ' Debug.Print("Not Empty") 
      End If 
     Next 
     StudentsGrid.RefreshData() 
     btnRefresh.PerformClick() 
    Catch ex As Exception 
     MessageBox.Show(ex.Message, "Error: " & System.Reflection.MethodBase.GetCurrentMethod.Name, MessageBoxButtons.OK, MessageBoxIcon.Error) 
    End Try 
End Sub