我有以下代码将以前的值输入DataGridView单元格。如果在第0行和第2列或更大,则为左边的val,否则直接在上面的值:
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未被用户代码
处理 Message =对象引用未设置为对象的实例。
我猜这是使用null coalesce运算符的机会,但是(假设我的猜测很好),我该如何实现呢?
答案 0 :(得分:5)
尝试这样的事情:
string s = SomeStringExpressionWhichMightBeNull() ?? "" ;
容易!
答案 1 :(得分:3)
假设 Value 是null(你的帖子中不完全清楚)你可以做
object cellValue =
dataGridViewPlatypi.Rows[args.RowIndex - 1].Cells[args.ColumnIndex].Value;
prevValue = cellValue == null ? string.Empty : cellValue.ToString()
答案 2 :(得分: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
,则所有对象中的SafeToString
方法在intellisense中都会显示null
方法。该方法实际上不是一个实例方法,它只显示为一个,因此如果对象为null,它不会生成空引用异常,而只是将{{1}}传递给方法,该方法将所有空值视为空字符串。