ASP.NETアプリケーションで、ASP.NETのTableに行を追加すると 「値をNull にすることはできません。パラメーター名:key」のエラーが表示されWebフォームが表示されないことがあります。
いくつか原因がありますが、一番多いのは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」のエラーが表示されます。
どのような場合でも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);
}
上記のコードでエラーは回避できます。
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)で実行した場合は発生しないことがあります。