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参照によって処理されませんでした。

これはnull合体演算子を使用する機会だと思いますが(私の推測が適切であると仮定して)、どうすればそれを実装できますか?

4

3 に答える 3

5

次のようなものを試してください。

string s = SomeStringExpressionWhichMightBeNull() ?? "" ;

簡単!

于 2012-09-27T18:55:20.303 に答える
3

が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 に答える
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、インテリセンスのメソッドがあるように見えます。このメソッドは実際にはインスタンスメソッドではなく、1つとして表示されるだけなので、オブジェクトがnullの場合にnull参照例外を生成する代わりに、nullすべてのnull値を空の文字列として扱うメソッドに渡すだけです。

于 2012-09-27T19:24:11.633 に答える