none
CellValidatingでエラー RRS feed

  • 質問

  • zen73です。つい皆さんのご好意に甘えて質問を重ねており恐縮です。

    質問する前に本で調べたり、Webで検索したりしてみるのですが解決策がなかなか見つからず、結果としてこのフォーラムを頼ってしまいます。殆んど呆け頭の老人ですが何とかプログラミングの勉強を今まで続けてこられたのもこのフォーラムのおかげです。どうぞ呆け頭に免じて些細な質問を続けるのをお許しください。

     

    下のコードを試している最中一度は正しく実行されるのですが、実行フォームを閉じたとき赤色のコードがエラーになります。

        [FormatExceptionはユーザーコードによってハンドルされませんでした。]

        「入力文字列の形式が正しくありません」

    とのエラーでした。

     

    自分なりに原因を考えてみたのですが・・・。

        1列目は「月」、2列目は「日」を表示していますが、.mdbのテーブルでは両方とも文字列とし

            て設計しています。これを数値として設計しなければならない。

    なのかなーとしか思いつきません。

     

    エラーの原因と対策をお教え願います。

     

    コード ブロック

    private void suitoDataGridView_CellValidating(object sender,

                 DataGridViewCellValidatingEventArgs e)
            {
                //入力審査とデータ自動入力と自動セル移動
                DataGridView dgv = (DataGridView)sender;

                int iCol = e.ColumnIndex;
                string sCellValue = e.FormattedValue.ToString();
                int iCellValue = Convert.ToInt32(sCellValue);

                switch (iCol)
                {
                    case 0:
                        if (iCellValue > 12)
                        {
                            dgv.CancelEdit();
                            e.Cancel = true;
                        }
                        break;
                    case 1:
                        if (iCellValue > 31)
                        {
                            dgv.CancelEdit();
                            e.Cancel = true;
                        }
                        break;
                    case 3:

                }

         }

     

     

    2007年10月1日 14:32

回答

  • zen73 さん、こんにちは。

     zen73 さんからの引用

    自分なりに原因を考えてみたのですが・・・。

        1列目は「月」、2列目は「日」を表示していますが、.mdbのテーブルでは両方とも文字列とし

            て設計しています。これを数値として設計しなければならない。

    なのかなーとしか思いつきません。



    例外周辺あたりだけ回答します。

    例外発生時の 'sCellValue' の値を見てみると良いでしょう。

    System.Int32 つまり、int と互換のある文字列でないと例外が発生します。
    このあたりは MSDN ライブラリにも記載されているハズです。

     

    短絡的ですが最も簡単な解決方法は int.TryParse メソッドで検証がてら Parse することでしょう。

    2007年10月1日 15:47
  •  zen73 さんからの引用

    ということは、データベースの設計の問題ではないのですね。

     

    はい。設計については詳しくないのでそういった設計がいいのかどうかまでは私は知りませんが。

     

     zen73 さんからの引用

    明日考えてみますが、Validatedイベントは必ずValidatingイベントと対にして記述しなければいけないものなのでしょうか?

     

    Validatedは今関係ないので無視しておいてよいです。

     

     zen73 さんからの引用

    このサンプルコードの理解は私にはかなり難しいですね。ですから何を質問するかもわからない状態です。

     

    とりあえず、このサンプルコードを貼り付けて動かしてみる、などして解析していきます。

    文字列を選択してF1キー、を覚えるといいですよ。

    F1はヘルプ(MSDNライブラリ)を起動します。

    2007年10月1日 15:58

すべての返信

  • 基本はMSDNとの格闘です。あとはおっしゃるとおり、本や、Web検索ですが、

    Web検索すれば、MSDNのサイトもひっかかります。

     

    具体的には、関係してくる、メソッド、プロパティ、イベントを選択してF1キーです。

    Web検索の時は、キーワードの設定が重要になります。これは、検索を何回もしないとわからないかもしれません。

     

    で、今回の件では、CellValidatingで検索すれば、以下のサイトが検索されます。

    http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.datagridview.cellvalidating(VS.80).aspx

    ここで書かれているサンプルコードを理解すれば大丈夫でしょう。

    わからない場合はまた聞いてください。

     

    あと、回答済みは、回答者の投稿にチェックします。

    2007年10月1日 14:57
  • zen73 さん、こんにちは。

     zen73 さんからの引用

    自分なりに原因を考えてみたのですが・・・。

        1列目は「月」、2列目は「日」を表示していますが、.mdbのテーブルでは両方とも文字列とし

            て設計しています。これを数値として設計しなければならない。

    なのかなーとしか思いつきません。



    例外周辺あたりだけ回答します。

    例外発生時の 'sCellValue' の値を見てみると良いでしょう。

    System.Int32 つまり、int と互換のある文字列でないと例外が発生します。
    このあたりは MSDN ライブラリにも記載されているハズです。

     

    短絡的ですが最も簡単な解決方法は int.TryParse メソッドで検証がてら Parse することでしょう。

    2007年10月1日 15:47
  • このところ、はなはなはなさんには随分と助けていただいております。ありがとうございます。

     はなはなはな さんからの引用

    ここで書かれているサンプルコードを理解すれば大丈夫でしょう。

    わからない場合はまた聞いてください。

    ということは、データベースの設計の問題ではないのですね。

    だとしたら…。

    明日考えてみますが、Validatedイベントは必ずValidatingイベントと対にして記述しなければいけないものなのでしょうか?

    このサンプルコードの理解は私にはかなり難しいですね。ですから何を質問するかもわからない状態です。

    2007年10月1日 15:47
  •  zen73 さんからの引用

    ということは、データベースの設計の問題ではないのですね。

     

    はい。設計については詳しくないのでそういった設計がいいのかどうかまでは私は知りませんが。

     

     zen73 さんからの引用

    明日考えてみますが、Validatedイベントは必ずValidatingイベントと対にして記述しなければいけないものなのでしょうか?

     

    Validatedは今関係ないので無視しておいてよいです。

     

     zen73 さんからの引用

    このサンプルコードの理解は私にはかなり難しいですね。ですから何を質問するかもわからない状態です。

     

    とりあえず、このサンプルコードを貼り付けて動かしてみる、などして解析していきます。

    文字列を選択してF1キー、を覚えるといいですよ。

    F1はヘルプ(MSDNライブラリ)を起動します。

    2007年10月1日 15:58
  • はなはなはなさん、じゃんぬねっとさん、おかげさまでどうやら解決できたようです。

     これを解決しないと先へ進めないものですから昨日は夢の中でも考えていた有様でした。それにしてもTryParseって不思議なメソッドですね。いままでこういうタイプのものに出会ったことがなかったものですからMSDNでみたときにはとても面食らってしまいました。

     現在のコードはこうなってます。

         string sCellValue = e.FormattedValue.ToString();
                int iCellValue;  
                bool result = Int32.TryParse(sCellValue, out iCellValue);

    教えていただいたお二人にはとても感謝しています。ありがとうございました。

     

    2007年10月1日 20:39