ASP.NETのTableに行を追加すると 「値をNull にすることはできません。パラメーター名:key」 エラーが表示されWebフォームが表示できない - ASP.NET

ASP.NETアプリケーションで、ASP.NETのTableに行を追加すると 「値をNull にすることはできません。パラメーター名:key」のエラーが表示されWebフォームが表示されないことがあります。

エラー

値をNull にすることはできません。パラメーター名:key

例外の詳細: System.ArgumentNullException: 値を Null にすることはできません。
パラメーター名:key

原因

いくつか原因がありますが、一番多いのはnull文字列をTableに追加している場合です。以下のコードを参考にしてください。

エラーの発生するコード

  protected void Page_Load(object sender, EventArgs e)
  {
    int flag=1;

    TableRow tr = new TableRow();
    TableCell tc = new TableCell();
    
    LiterlControl lc = new LiteralControl();
    if (di[i].flag == 0) {
      lc.Text += "<div>フラグは0です。</div>";
    }
    else if (di[i].flag == 2) {
      lc.Text += "<div>フラグは2です。</div>";
    }
    tc.Controls.Add(lc);
    tr.Cells.Add(tc);
    table1.Rows.Add(tr);
  }
上記のコードで”flag=1”(0,2以外)の場合にエラーが発生します。

解説

上記のコードでは常にセルにLiterlControlを挿入しています。flagの値が0,2の場合はLiterlControlのインスタンス作成後Textプロパティに文字列が代入されます。しかし、0,2以外の値の場合にはTextプロパティに値が代入されないためTextプロパティの値はnullになります。TextプロパティがnullのLiterlControlをテーブルのセルに追加すると先の「値をNull にすることはできません。パラメーター名:key」のエラーが表示されます。

対策

対策1 : Textプロパティのnullを防ぐ

どのような場合でもTextプロパティに値が設定されるようにします。Textプロパティをnullにしてテーブルに追加しないようにします。

修正コード例
  protected void Page_Load(object sender, EventArgs e)
  {
    int flag=1;

    TableRow tr = new TableRow();
    TableCell tc = new TableCell();
    
    LiterlControl lc = new LiteralControl();
    if (di[i].flag == 0) {
      lc.Text += "<div>フラグは0です。</div>";
    }
    else if (di[i].flag == 2) {
      lc.Text += "<div>フラグは2です。</div>";
    }else{
      lc.text="";
    }
    
    tc.Controls.Add(lc);
    tr.Cells.Add(tc);
    table1.Rows.Add(tr);
  }
上記のコードでエラーは回避できます。

対策2 : Literalを用いる

LiteralControlではエラーが発生しますが、Literalの場合は同じコードでもエラーが発生しません。

修正コード例
  protected void Page_Load(object sender, EventArgs e)
  {
    int flag=1;

    TableRow tr = new TableRow();
    TableCell tc = new TableCell();
    
    Literl lt = new Literal();
    if (di[i].flag == 0) {
      lt.Text += "<div>フラグは0です。</div>";
    }
    else if (di[i].flag == 2) {
      lt.Text += "<div>フラグは2です。</div>";
    }
    tc.Controls.Add(lt);
    tr.Cells.Add(tc);
    table1.Rows.Add(tr);
  }
エラーは回避できますが、LiterlのTextプロパティはnullになっていますので、注意が必要かもしれません。

補足

このエラーは開発環境でデバッグしている際に発生する可能性が高いです。同じプログラムをサーバー(IIS 8,IIS 8.5)で実行した場合は発生しないことがあります。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2014-02-27
iPentec all rights reserverd.