1

我有以下代碼將一個以前的值輸入到DataGridView單元格中。如果0行和第2欄或更大,瓦爾向左,否則價值正上方:如何在空值拋出異常之前將空值轉換爲string.empty?

private void dataGridViewPlatypi_CellEnter(object sender, DataGridViewCellEventArgs args) 
{ 
    // TODO: Fails if it sees nothing in the previous cell 
    string prevVal = string.Empty; 
    if (args.RowIndex > 0) 
    { 
     prevVal = dataGridViewPlatypi.Rows[args.RowIndex - 1].Cells[args.ColumnIndex].Value.ToString(); 
    } else if (args.ColumnIndex > 1) 
    { 
     prevVal = dataGridViewPlatypi.Rows[args.RowIndex].Cells[args.ColumnIndex-1].Value.ToString(); 
    } 
    dataGridViewPlatypi.Rows[args.RowIndex].Cells[args.ColumnIndex].Value = prevVal; 
} 

這隻要存在要看到和複製的值的偉大工程。如果該單元是空的,雖然,我得到:

System.NullReferenceException了未處理由用戶代碼不設置爲一個對象的一個​​實例
消息=對象引用。

我猜這是一個使用空合併運算符的機會,但(假設我的猜測是好的),我該如何實現它?

回答

3

假設價值是什麼,是空(不完全清楚,從您的文章),你可以做

object cellValue = 
    dataGridViewPlatypi.Rows[args.RowIndex - 1].Cells[args.ColumnIndex].Value; 
prevValue = cellValue == null ? string.Empty : cellValue.ToString() 
5

嘗試是這樣的:

string s = SomeStringExpressionWhichMightBeNull() ?? "" ; 

輕鬆!

+1

簡單,但仍然以相同的方式失敗。 –

3

使用的方法,如:

public static class MyExtensions 
{ 
    public static string SafeToString(this object obj) 
    { 
     return (obj ?? "").ToString(); 
    } 
} 

那麼你可以使用它像:

object obj = null; 

string str = obj.SafeToString(); 

或從你的代碼的例子:

prevVal = dataGridViewPlatypi.Rows[args.RowIndex - 1].Cells[args.ColumnIndex].Value.SafeToString(); 

這將創建一個擴展方法,所以如果爲名稱空間添加一個using,那麼擴展類將在所有對象中出現在intellisense中使用SafeToString方法。該方法實際上並不是一個實例方法,它只是顯示爲一個,因此,如果對象爲null,則不會生成空引用異常,而只是將null傳遞給將所有空值視爲空字符串的方法。

+0

非常好;謝謝Servy,這對我也很好。 –