none
DataGridViewに空白セルがあるときの配列への取り込み RRS feed

  • 質問

  • 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;
                        }
                  }
            }
    }   

     

    2007年11月3日 13:16

回答

  • こんばんわ

     

     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(); ←  ※
                       break;

    上記※2のコードが実行されるから、エラーが発生しています。

    先に記載させていただいた内容を考慮して、※1の箇所を修正することで現象が回避されるはずです。

     

    2007年11月3日 15:49

すべての返信

  • こんばんわ

     

     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(); ←  ※
                       break;

    上記※2のコードが実行されるから、エラーが発生しています。

    先に記載させていただいた内容を考慮して、※1の箇所を修正することで現象が回避されるはずです。

     

    2007年11月3日 15:49
  • Toshiさん,ありがとうございます。

     Toshi さんからの引用

    DBNullとnullが等価なものとしてみなしていないでしょうか

    おっしゃっているとおりに思っていました。

    ご丁寧なご回答をいただきお礼申します。

    教えていただいたように

        if(dgv [4, i].Value != Null)
              dgvData[i, j] = dgv[j, i].Value.ToString();

    とすることで問題を回避することができました。

     

    2007年11月4日 7:22