2014-03-28 41 views
0

目標:我想查詢datagridview上的所有行並檢查同一行上的兩列是否等於特定值。我得到一個「對象引用等於空」的錯誤,因爲我使用的是一個foreach循環。執行此任務的最佳方式是什麼?顯示範例同一行上的特定值的查詢數據表

當前代碼:

foreach (DataGridViewRow row in dataTABLE.Rows) 
{                
if ((row.Cells[0].Value.ToString().ToUpper().Equals(MyServerChecked)) & (row.Cells[1].Value.ToString().ToUpper().Equals(service.ServiceName.ToString().ToUpper()))) 
} 

值被寫入到數據表上單擊按鈕時。在那個按鈕裏面,這個foreach循環存在,因爲我不希望多次創建同一行。這就是爲什麼我試圖查詢列值並進行比較

回答

1

爲避免該異常首先檢查你的對象不是空試圖調用它們的方法之前。檢查...

dataTABLE != null 
Cells[0].Value != null 
Cells[1].Value != null 

這就是說,你問了最好的方式來完成任務,所以這裏有一些其他的事情要考慮。

您可以使用諸如dataTable.AsEnumerable().Any(dr => ...);之類的內容遍歷數據表,以查看是否存在符合您的條件的行。

當你需要字符串比較其他字符串或對象可能爲空,你需要仔細考慮你的要求和什麼空引用意味着你。

如果cell[0].value == null你還想繼續比較MyServerChecked嗎?如果cell[0].value == nullMyServerChecked == null那麼他們應該被認爲是平等的?

同樣,你想如何處理空弦?應該認爲空字符串是否等於null?

以下是一個簡單的解決方案。如果單元格爲空,則不會嘗試比較它們。這可能不是你想要的行爲,但就像我說的,想一想什麼空值和空字符串意味着你的特定場景和代碼相應地。

string MyServerChecked = "Something"; 
string ServiceName = service.ServiceName.ToString(); 

if (dataTable != null) 
{ 
    foreach (DataGridViewRow row in dataTable.Rows) 
    { 
     if (row.Cells[0].Value != null 
      && row.Cells[1].Value != null 
      && string.Equals(row.Cells[0].Value.ToString(), MyServerChecked, StringComparison.OrdinalIgnoreCase) 
      && string.Equals(row.Cells[1].Value.ToString(), ServiceName, StringComparison.OrdinalIgnoreCase)) 
     { 
      // Row already exists... 
     } 
    } 
} 

使用重載string.Equals方法有StringComparison枚舉類型意味着你不必轉換爲大寫自己。它還爲您提供一些額外的文化設置選項。有關詳細信息,請參閱MSDN上的StringComparison Enumeration

1

foreach與空引用異常無關,除非您在處理它們時刪除某些行。您沒有提供任何關於哪個對象出現錯誤的信息,但如果它們爲空,則不能調用row.Cells[0].Valuerow.Cells[0].ValueToString()方法。 你可以添加額外的條件,你的if語句:

if(row.Cells[0].Value!=null && row.Cells[1].Value!=null 
    && row.Cells[0].Value.ToString().ToUpper().Equals(MyServerChecked) 
    & row.Cells[1].Value.ToString().ToUpper().Equals(service.ServiceName.ToString().ToUpper())) 
+1

「寫入表格前」是什麼意思?您已經通過dataTABLE.Rows集合進行了遊戲。如果你在所有行上都需要一些條件,你可以迭代'dataTable.Rows.Where(某些lambda條件)'。你也可以使用'Distinct'擴展方法。你沒有提供任何代碼,你會檢查行是否重複,只是一個條件。另外 - 調用'service.ServiceName。ToString()'是無效的 - 爲什麼每次迭代都要處理字符串? – Tarec

相關問題