none
dataGridViewでの空白セルへの対処のしかた RRS feed

  • 質問

  • 一つの疑問がみなさんのお陰で解消できて喜んでおりましたら,すぐにまた新たな疑問が生じてくるという状況でついついこのフォーラムの皆様に頼ってしまいます。よろしくお願いします。

    <3列目に数字を入力してEnterキーで4列目に移ったとき,3列目の入力を検証>

    して

    <3列目の値が空白であったり,不正な値であった>

    とき

    <カーソルを3列目に戻す> というメソッドが下のコードなのですが,「ア」は正常に動作しますが,「イ」の場合はハングアップしてしまいます。私には「ア」も「イ」も同じと思ってしまうのですが・・・・,

    「イ」はなぜ正常に動作しないのでしょうか?解説していただけますとありがたいのですが。

    //班コードの検証と班名の入力
    private void inpHanName(int iCol, int iRow, object sender)
    {
      //------- ア ------------------------------------
      DataGridView dgv = (DataGridView)sender;
      string sCellValue = dgv[iCol - 1, iRow].Value.ToString();
      int iCellValue;
      bool result = Int32.TryParse(sCellValue, out iCellValue);
    
      if (result == true &&
        (iCellValue > 0 && iCellValue <= listBox1.Items.Count))
      {
        dgv[iCol - 1, iRow].Value = hanmei[iCellValue - 1] + "班";
      }
      else
      {
        SendKeys.Send("+{Tab}");
      }
      //-----------------------------------------------
    
      //======= イ ====================================
      DataGridView dgv = (DataGridView)sender;
      if (dgv[iCol - 1, iRow].Value != null)
      {
        string sCellValue = dgv[iCol - 1, iRow].Value.ToString();
        int iCellValue = int.Parse(sCellValue);
    
        if (iCellValue > 0 && iCellValue <= listBox1.Items.Count)
        {
          dgv[iCol - 1, iRow].Value = hanmei[iCellValue - 1] + "班";
        }
        else
        {
          SendKeys.Send("+{Tab}");
        }
      }
      else
      {
        SendKeys.Send("+{Tab}");
      }
      //===============================================
    }
    
    2010年8月11日 21:17

回答

  • (ア)ではセルの内容を数値に変換するときTryParseを使っているのに対し、(イ)ではParseを使っています。文字列を数値に変換できなかったとき、TryParseは例外を出しませんが、Parse は例外を出します。おそらくこれが原因だと思います。詳しくは下の記事を読んでください。

    http://www.atmarkit.co.jp/fdotnet/dotnettips/408tryparse/tryparse.html

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    • 回答としてマーク Koyan 2010年8月12日 1:51
    2010年8月11日 22:45
  • ブレークポイントで止めて、ステップ実行してみましょう。ちなみに、空白(空文字)とnullは全くの別物です。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク Koyan 2010年8月12日 1:51
    2010年8月12日 0:57
    モデレータ

すべての返信

  • int.Parseは与えられた文字列が数字に変換できない場合、例外が発生します。
    dgv[iCol - 1, iRow]には、何とか班という文字列が入りますので、少なくともそれを対象にしてinpHanNameメソッドを実行すると例外が発生します。

    Int32.Parse メソッド (String)
    http://msdn.microsoft.com/ja-jp/library/aa328655(VS.71).aspx


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年8月11日 22:45
    モデレータ
  • (ア)ではセルの内容を数値に変換するときTryParseを使っているのに対し、(イ)ではParseを使っています。文字列を数値に変換できなかったとき、TryParseは例外を出しませんが、Parse は例外を出します。おそらくこれが原因だと思います。詳しくは下の記事を読んでください。

    http://www.atmarkit.co.jp/fdotnet/dotnettips/408tryparse/tryparse.html

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    • 回答としてマーク Koyan 2010年8月12日 1:51
    2010年8月11日 22:45
  • お二人に解説をしていただいたのですが,いまひとつ腑に落ちないのです。


     //======= イ ====================================
      DataGridView dgv = (DataGridView)sender;
      if (dgv[iCol - 1, iRow].Value != null)←空白だったら,以下を飛ばして
      {
        string sCellValue = dgv[iCol - 1, iRow].Value.ToString();
        int iCellValue = int.Parse(sCellValue);

        if (iCellValue > 0 && iCellValue <= listBox1.Items.Count)
        {
          dgv[iCol - 1, iRow].Value = hanmei[iCellValue - 1] + "班";
        }
        else
        {
          SendKeys.Send("+{Tab}");
        }
      }
      else←ここに来るのではないでしょうか?
      {
        SendKeys.Send("+{Tab}");
      }
      //===============================================

    一番下のSendKeys.Send("+{Tab}");にいくものとばかり思っていたのですが,下に行ってしまっているということなのですね。ということは,if (dgv[iCol - 1, iRow].Value != null) がだめということになる。と思ってしまいます。

    2010年8月12日 0:54
  • ブレークポイントで止めて、ステップ実行してみましょう。ちなみに、空白(空文字)とnullは全くの別物です。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク Koyan 2010年8月12日 1:51
    2010年8月12日 0:57
    モデレータ
  • >空白(空文字)とnullは全くの別物です。

    if (dgv[iCol - 1, iRow].Value != DBNull.Value )としたら,期待通りの動きになりました。

    なかむらさんとtrapemiyaさん,ありがとうございました。

    2010年8月12日 1:50