2010/12/02(Thu) 16:36:45 編集(投稿者)
■No55450 (ごう さん) に返信
> 先ほどは、疑ってしまってすみません。
> 参考までに。
>
>
> # object 型で "0" が入っているとき、
> # キャストでこけてしまうのは初めて知りました。
> # こちらこそ勉強になりました。
>
>
> for (int i = 0; i < dataGridView1.Rows.Count-1; i++)
> {
> // doubleの変換に成功したら x に変換後の値が代入される
> if (double.TryParse(dataGridView1.Rows[i].Cells["B"].Value.ToString(),
> System.Globalization.NumberStyles.Any,
> System.Globalization.NumberFormatInfo.InvariantInfo,
> out x) == false)
> {
> // doubleの変換に失敗した
> x = 0;
> }
>
> if (double.TryParse(dataGridView1.Rows[i].Cells["D"].Value.ToString(),
> System.Globalization.NumberStyles.Any,
> System.Globalization.NumberFormatInfo.InvariantInfo,
> out y) == false)
> {
> // doubleの変換に失敗した
> y = 0;
> }
>
> list1.Add(x, y);
> }
>
いえいえ、こちらこそ分かりにくい表現を使ってしまいすいませんでした。
ここまでのご指摘を組み合わせ、無事に完成しました。ここからさらに機能を拡張させていくつもりなので、また疑問や分からない点があったらご指摘頂けたら幸いに存じます。
■No55446 (魔界の仮面弁士さん)に返信
> x = (double)dataGridView1.Rows[i].Cells[1].Value;
> の部分で、'System.InvalidCastException'のハンドルされていない例外が発生しました。
>
>まず、Value プロパティは object 型ですよね。
>そのオブジェクトの中身を double 型にキャストできなかったというエラーかと。
>
>MessageBox.Show( dataGridView1.Rows[i].Cells[1].Value.GetType().FullName );
>などとして、元の型を確認してみてください。
>
>下記の【第7章 キャストとデータ変換】あたり。
>http://www.atmarkit.co.jp/fdotnet/csharp_abc2/index/index.html
>
>
>----------------------------------------
>object o1 = 1.23D; // Double 型(double)
>object o2 = 1.23F; // Single 型(float)
>object o3 = 123; // Int32 型(int)
>object o4 = "1.23"; // String 型(string)
>
>double x;
>
>// Double 値なのでキャスト成功
>x = (Double)o1;
>
>// Double では無いのでキャストできない
>x = (Double)o2; // 例外:InvalidCastException(実行時エラー)
>x = (Double)o3; // 例外:InvalidCastException(実行時エラー)
>x = (Double)o4; // 例外:InvalidCastException(実行時エラー)
>
>// 元の型にキャストしてから代入する場合
>x = (Double)(Single)o2; // Single → Double への拡大変換はOK
>x = (Double)(Int32)o3; // Int32 → Double への拡大変換はOK
>// x = (Double)(string)o4; // String → Double は変換不可(コンパイルエラー)
>
>// 拡大変換の場合は暗黙変換可能
>x = (Single)o2; // Single 値を Double 型に入れる場合は、キャストを省略できる
>x = (Int32)o3; // Int32 値を Double 型に入れる場合は、キャストを省略できる
>
>// String からの変換には、Parse や Convert を用いる
>x = Double.Parse((string)o4);
>x = Convert.ToDouble((string)o4);
>
>
ありがとうございます。適切なアドバイスのおかげで、作業がはかどりました。また、自分の未熟さを痛感したのでC#の習得に励みます。
また疑問や分からない点があったときはよろしくお願いします。
最後になりますが、こんなに丁寧なアドバイスをいただき感謝しています。ありがとうございました。