1

我有以下代码将先前的值输入到 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=Object 引用未设置为对象的实例。

我猜这是一个使用空合并运算符的机会,但是(假设我的猜测很好),我该如何实现呢?

4

3 回答 3

5

尝试这样的事情:

string s = SomeStringExpressionWhichMightBeNull() ?? "" ;

简单的!

于 2012-09-27T18:55:20.303 回答
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该方法实际上不是实例方法,它只是显示为一个,因此如果对象为空,它不会生成空引用异常,而是简单地传递null给该方法,该方法将所有空值视为空字符串。

于 2012-09-27T19:24:11.633 回答
3

假设Value是 null (从你的帖子中不完全清楚)你可以做

object cellValue = 
    dataGridViewPlatypi.Rows[args.RowIndex - 1].Cells[args.ColumnIndex].Value;
prevValue = cellValue == null ? string.Empty : cellValue.ToString()
于 2012-09-27T18:52:10.037 回答