【问题标题】:How can I convert a null value to string.empty before it has a chance to throw an exception?如何在有机会引发异常之前将 null 值转换为 string.empty?
【发布时间】:2012-09-19 15:21:10
【问题描述】:

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

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

【问题讨论】:

    标签: c# winforms datagridview nullreferenceexception datagridviewtextboxcell


    【解决方案1】:

    试试这样的:

    string s = SomeStringExpressionWhichMightBeNull() ?? "" ;
    

    简单!

    【讨论】:

    • 简单,但仍然以同样的方式失败。
    【解决方案2】:

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

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

    【讨论】:

    • 第二行可以写成:prevValue = cellValue?.ToString() ?? string.Empty
    【解决方案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 传递给该方法,该方法将所有空值视为空字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-06
      • 2015-10-29
      • 2010-09-26
      • 1970-01-01
      • 2011-08-18
      • 2022-06-15
      • 1970-01-01
      • 2014-05-09
      相关资源
      最近更新 更多