トップ回答者
DataGridViewに空白セルがあるときの配列への取り込み

質問
-
5×35のDatagridViewのセル値を配列に取り込んで印刷しようとしています。
0列から3列までの取り込みと印刷には何の問題もありません。
問題は「値がまばらにしかなくほとんどが空白」の4列目のデータの取り込みです。
いろいろやってみたのですが,何か勘違いをしているようで「NullReferenceExceptionはハンドルされませんでした」「オブジェクト参照がオブジェクト インスタンスに設定されていません。」とのエラーから抜け出せないでもがいております。
4列目で空白でないときに,そのデータを配列に取り込もうとしています。
if(dgv [4, i].Value != DBNull.Value )
dgvData[i, j] = dgv[j, i].Value.ToString();if(dgv[j,i].value.ToString() != string.null)
dgvData[i, j] = dgv[j, i].Value.ToString();
などとしてみましたが,どれもだめでした。private void printDocument1_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
DataGridView dgv = new DataGridView();
dgv = dataGridView2;
int iRow = dgv.RowCount;
int iCol = dgv.ColumnCount - 1;string[,] dgvData = new string[iRow, iCol+1]; //データ
//データ
int num;
for (int i = 0; i < iRow; i++)
{
for (int j = 0; j < iCol + 1; j++)
{
switch (j)
{
case 0:
dgvData[i, j] = dgv[j, i].Value.ToString();
break;
case 1:
case 2:
num = Convert.ToInt32(dgv[j, i].Value);
if (num != 0)
dgvData[i, j] = num.ToString("#,###").PadLeft(10);
else
dgvData[i, j] = num.ToString().PadLeft(10);
break;
case 3:
dgvData[i, j] = dgv[j, i].Value.ToString();
break;
case 4:
if(dgv [4, i].Value != DBNull.Value )
dgvData[i, j] = dgv[j, i].Value.ToString();
break;
}
}
}
}
回答
-
こんばんわ
zen73 さんからの引用 問題は「値がまばらにしかなくほとんどが空白」の4列目のデータの取り込みです。
いろいろやってみたのですが,何か勘違いをしているようで「NullReferenceExceptionはハンドルされませんでした」「オブジェクト参照がオブジェクト インスタンスに設定されていません。」とのエラーから抜け出せないでもがいております。
4列目で空白でないときに,そのデータを配列に取り込もうとしています。
if(dgv [4, i].Value != DBNull.Value )
dgvData[i, j] = dgv[j, i].Value.ToString();if(dgv[j,i].value.ToString() != string.null)
dgvData[i, j] = dgv[j, i].Value.ToString();
などとしてみましたが,どれもだめでした。とありますが、zen73さんは、実際にどこでエラーが発生しているのか、確認されてますでしょうか。
NullReferenceExceptionは、ざっくりいってしまうと、インスタンスが生成されていない状態(nullオブジェクト)の変数に対して、
メソッドやプロパティを呼び出したりしたときに発生するExceptionです。
つまり、何かの値がnullになっているわけです。
どこがnullになっているのか、なぜnullになってしまったのかを突き止めることが、
「NullReferenceExceptionを回避する」
ための基本的なアプローチになります。
また、一点指摘させていただきたい内容があります。
zen73 さんからの引用 4列目で空白でないときに,そのデータを配列に取り込もうとしています。
if(dgv [4, i].Value != DBNull.Value )
dgvData[i, j] = dgv[j, i].Value.ToString();この内容から、zen73さんは、DBNullとnullが等価なものとしてみなしていないでしょうか?
等価のように見えますが、異なります。
DBNullクラスについて
http://msdn2.microsoft.com/ja-jp/library/system.dbnull(VS.80).aspx
ためしに以下のコードの結果を確認してみてください。
コード ブロックbool result = (DBNull.Value == null);
MessageBox.Show(result.ToString());
今回の問題ですが、おそらく
case 4:
if(dgv [4, i].Value != DBNull.Value ) ← ※1
dgvData[i, j] = dgv[j, i].Value.ToString(); ← ※2
break;上記※2のコードが実行されるから、エラーが発生しています。
先に記載させていただいた内容を考慮して、※1の箇所を修正することで現象が回避されるはずです。
すべての返信
-
こんばんわ
zen73 さんからの引用 問題は「値がまばらにしかなくほとんどが空白」の4列目のデータの取り込みです。
いろいろやってみたのですが,何か勘違いをしているようで「NullReferenceExceptionはハンドルされませんでした」「オブジェクト参照がオブジェクト インスタンスに設定されていません。」とのエラーから抜け出せないでもがいております。
4列目で空白でないときに,そのデータを配列に取り込もうとしています。
if(dgv [4, i].Value != DBNull.Value )
dgvData[i, j] = dgv[j, i].Value.ToString();if(dgv[j,i].value.ToString() != string.null)
dgvData[i, j] = dgv[j, i].Value.ToString();
などとしてみましたが,どれもだめでした。とありますが、zen73さんは、実際にどこでエラーが発生しているのか、確認されてますでしょうか。
NullReferenceExceptionは、ざっくりいってしまうと、インスタンスが生成されていない状態(nullオブジェクト)の変数に対して、
メソッドやプロパティを呼び出したりしたときに発生するExceptionです。
つまり、何かの値がnullになっているわけです。
どこがnullになっているのか、なぜnullになってしまったのかを突き止めることが、
「NullReferenceExceptionを回避する」
ための基本的なアプローチになります。
また、一点指摘させていただきたい内容があります。
zen73 さんからの引用 4列目で空白でないときに,そのデータを配列に取り込もうとしています。
if(dgv [4, i].Value != DBNull.Value )
dgvData[i, j] = dgv[j, i].Value.ToString();この内容から、zen73さんは、DBNullとnullが等価なものとしてみなしていないでしょうか?
等価のように見えますが、異なります。
DBNullクラスについて
http://msdn2.microsoft.com/ja-jp/library/system.dbnull(VS.80).aspx
ためしに以下のコードの結果を確認してみてください。
コード ブロックbool result = (DBNull.Value == null);
MessageBox.Show(result.ToString());
今回の問題ですが、おそらく
case 4:
if(dgv [4, i].Value != DBNull.Value ) ← ※1
dgvData[i, j] = dgv[j, i].Value.ToString(); ← ※2
break;上記※2のコードが実行されるから、エラーが発生しています。
先に記載させていただいた内容を考慮して、※1の箇所を修正することで現象が回避されるはずです。