C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[14]: DataGridViewの内容を使ってグラフの作成をするには


(過去ログ 93 を表示中)

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■55424 / inTopicNo.1)  DataGridViewの内容を使ってグラフの作成をするには
  
□投稿者/ daibo (6回)-(2010/12/01(Wed) 14:10:00)

分類:[C#] 

2010/12/02(Thu) 10:37:11 編集(投稿者)
2010/12/01(Wed) 14:18:18 編集(投稿者)
2010/12/01(Wed) 14:18:07 編集(投稿者)
2010/12/01(Wed) 14:11:55 編集(投稿者)

<pre><pre>質問させていただきます。Windows XP VisualStudio C# 2010 Expressを使ってプログラムを作っています。

以前DataGridViewにcsvファイルの内容を表示するにはどのようにすればよいのか質問をし、その点は皆さんのおかげで動作するようにできました。

次にその内容をグラフに描画したいのですが、どの用にcsvファイルの内容を取得して良いのか分かりません。dataGridViewに表示するときに用いたDataTableを使うべきなのか、それとも別によい方法があるのか...私ではどのようにすることがベストなのか分かりません。

そこで皆さんの知識を借りたいと思い、この場に書かせてもらいました。

必要かどうかわからないのですが、DataGridViewにcsvファイルを読み込んだソースコードと、グラフの描画をするソースコードを以下にかきますので、ご指摘等ありましたらよろしくお願いします。

[補足]
csvファイルは365行5列のものでその2列目と4列目の内容でグラフを作成するつもりです。分かりづらくてすいません。


↓csvファイルの内容を表示する部分
public void read_button_Click(object sender, EventArgs e)
        {
            DataSet dataset_sam = new DataSet();
            dataset_sam.Tables.Add("sample");
            dataset_sam.Tables["sample"].Columns.Add("A");
            dataset_sam.Tables["sample"].Columns.Add("B");
            dataset_sam.Tables["sample"].Columns.Add("C");
            dataset_sam.Tables["sample"].Columns.Add("D");
            dataset_sam.Tables["sample"].Columns.Add("E");
            System.IO.StreamReader StreamReader = new System.IO.StreamReader(@"C:\csv.csv", System.Text.Encoding.GetEncoding(932));
            while (StreamReader.Peek() != -1)
            {

                string[] stringBuffer;
                stringBuffer = StreamReader.ReadLine().Split(',');
                //DataSetの作成 
                DataRow row = dataset_sam.Tables["sample"].NewRow();
                for (int counter = 0; counter < row.ItemArray.Length; counter++)
                {
                    row[counter] = stringBuffer[counter];
                }
                dataset_sam.Tables["sample"].Rows.Add(row);
            }
            StreamReader.Close();

            dataGridView1.DataSource = dataset_sam;
            dataGridView1.DataMember = "sample";
        }

↓グラフの描画を行う部分
private void CreateGraph(ZedGraphControl zgc)
        {
            GraphPane myPane = zgc.GraphPane;

            myPane.Title.Text = "My Test Graph\n(For Code Sample)";
            myPane.XAxis.Title.Text = "My X Axis";
            myPane.YAxis.Title.Text = "My Y Axis";

            myPane.XAxis.MajorGrid.IsVisible = true;
            myPane.YAxis.Scale.FontSpec.FontColor = Color.Red;
            myPane.YAxis.Title.FontSpec.FontColor = Color.Red;

            myPane.YAxis.MajorTic.IsOpposite = false;
            myPane.YAxis.MinorTic.IsOpposite = false;

            myPane.YAxis.MajorGrid.IsZeroLine = false;
            myPane.YAxis.Scale.Align = AlignP.Inside;

            myPane.YAxis.Scale.Min = 0;
            myPane.YAxis.Scale.Max = 15;
            myPane.YAxis.Scale.IsVisible = true;
            myPane.Chart.Fill = new Fill(Color.White, Color.LightGray, 45);
            zedGraphControl1.IsShowPointValues = true;

/*            double x, y1, y2;
            PointPairList list1 = new PointPairList();
            PointPairList list2 = new PointPairList();
            for (int i = 0; i < 36; i++)
            {
                x = (double)i + 5;
                y1 = 1.5 + Math.Sin((double)i * 0.2);
                y2 = 3.0 * (1.5 + Math.Sin((double)i * 0.2));
                list1.Add(x, y1);
                list2.Add(x, y2);
            }*/
            LineItem myCurve = myPane.AddCurve("Porsche", list1, Color.Red, SymbolType.Diamond);
            LineItem myCurve2 = myPane.AddCurve("piper", list2, Color.Blue, SymbolType.Circle);
            zgc.AxisChange();
        }</pre></pre>

引用返信 編集キー/
■55428 / inTopicNo.2)  Re[1]: DataGridViewの内容を使ってグラフの作成をするには
□投稿者/ ごう (204回)-(2010/12/01(Wed) 20:48:29)
No55424 (daibo さん) に返信

まず、文字化けの原因になりますので、「半角カナ」の使用は避けるようにしてくださいね。
(入力フォーム上部の注意事項に記載されています。)

また、ソースコードを提示するときは、投稿モードの「図表モード」にすると
非常に見やすくなります。

で、本題です。

> 次にその内容をグラフに描画したいのですが、どの用にcsvファイルの内容を取得して良いのか分かりません。dataGridViewに表示するときに用いたDataTableを使うべきなのか、それとも別によい方法があるのか...私ではどのようにすることがベストなのか分かりません。

私なら、DataTableをそのまま使っちゃいます。

> [補足]
> csvファイルは365行5列のものでその2列目と4列目の内容でグラフを作成するつもりです。分かりづらくてすいません。

ソースコード見ましたけど、以下の項目についてこちらから質問です。
補足してください。

1. ZedGraphコントロールを使用しているように見えますが、それで合っていますか?
  (Visual Studioが用意していない、ヨソ様のコントロールを使用するときはその旨明記してくださいね)
2. B列とD列の内容で「折れ線グラフ」を作りたいわけですね?折れ線は何本用意しますか? 2本?
3. グラフの縦軸には何を表示しますか?
4. グラフの横軸には何を表示しますか?

願わくば、1〜4の質問の答えを考えているうちに自然と答えに近づいてきているといいですが…。

こちらからもヒント

> /*            double x, y1, y2;
>             PointPairList list1 = new PointPairList();
>             PointPairList list2 = new PointPairList();
>             for (int i = 0; i < 36; i++)
>             {
>                 x = (double)i + 5;
>                 y1 = 1.5 + Math.Sin((double)i * 0.2);
>                 y2 = 3.0 * (1.5 + Math.Sin((double)i * 0.2));
>                 list1.Add(x, y1);
>                 list2.Add(x, y2);
>             }*/

PointParList クラスの、Addメソッドの引数を確認しましょう。
1つめには、x軸で表現したい数値、
2つめには、y軸で表現したい数値が入ります。

参考(おそらくここを参考にしている?):
http://www.atmarkit.co.jp/fdotnet/vblab/extcompo_02/zedgraph_02.html

引用返信 編集キー/
■55436 / inTopicNo.3)  Re[2]: DataGridViewの内容を使ってグラフの作成をするには
□投稿者/ daibo (7回)-(2010/12/02(Thu) 09:30:44)
No55428 (ごう さん) に返信
> ■No55424 (daibo さん) に返信
> 
> まず、文字化けの原因になりますので、「半角カナ」の使用は避けるようにしてくださいね。
> (入力フォーム上部の注意事項に記載されています。)
> 
> また、ソースコードを提示するときは、投稿モードの「図表モード」にすると
> 非常に見やすくなります。
> 
> で、本題です。
> 
>>次にその内容をグラフに描画したいのですが、どの用にcsvファイルの内容を取得して良いのか分かりません。dataGridViewに表示するときに用いたDataTableを使うべきなのか、それとも別によい方法があるのか...私ではどのようにすることがベストなのか分かりません。
> 
> 私なら、DataTableをそのまま使っちゃいます。
> 
>>[補足]
>>csvファイルは365行5列のものでその2列目と4列目の内容でグラフを作成するつもりです。分かりづらくてすいません。
> 
> ソースコード見ましたけど、以下の項目についてこちらから質問です。
> 補足してください。
> 
> 1. ZedGraphコントロールを使用しているように見えますが、それで合っていますか?
>   (Visual Studioが用意していない、ヨソ様のコントロールを使用するときはその旨明記してくださいね)
> 2. B列とD列の内容で「折れ線グラフ」を作りたいわけですね?折れ線は何本用意しますか? 2本?
> 3. グラフの縦軸には何を表示しますか?
> 4. グラフの横軸には何を表示しますか?
> 
> 願わくば、1〜4の質問の答えを考えているうちに自然と答えに近づいてきているといいですが…。
> 
> こちらからもヒント
> 
>>/*            double x, y1, y2;
>>            PointPairList list1 = new PointPairList();
>>            PointPairList list2 = new PointPairList();
>>            for (int i = 0; i < 36; i++)
>>            {
>>                x = (double)i + 5;
>>                y1 = 1.5 + Math.Sin((double)i * 0.2);
>>                y2 = 3.0 * (1.5 + Math.Sin((double)i * 0.2));
>>                list1.Add(x, y1);
>>                list2.Add(x, y2);
>>            }*/
> 
> PointParList クラスの、Addメソッドの引数を確認しましょう。
> 1つめには、x軸で表現したい数値、
> 2つめには、y軸で表現したい数値が入ります。
> 
> 参考(おそらくここを参考にしている?):
> http://www.atmarkit.co.jp/fdotnet/vblab/extcompo_02/zedgraph_02.html

大変失礼しました。今後気をつけたいと思います。
大変初歩的な質問なのですが、
> 私なら、DataTableをそのまま使っちゃいます。
とありますが、どのような記述をすればよいでしょうか?
csvファイルの2列目が時間、4列目が乱数で構成されていてそれを2次元配列にしてfor文に組み込みたいのですが、記述が分からないので
できればご教授して頂きたく思います。
また、上記1〜4についてなのですが、
1.その通りです。分かりにくくて申し訳ありません。
2.折れ線グラフで1本作りたいです。
3.グラフの縦軸は適当な乱数です。
4.グラフの横軸は時間です。

追加の質問もあり不躾ですがよろしくお願いします。

引用返信 編集キー/
■55437 / inTopicNo.4)  Re[3]: DataGridViewの内容を使ってグラフの作成をするには
□投稿者/ ごう (207回)-(2010/12/02(Thu) 10:21:49)
No55436 (daibo さん) に返信
>>私なら、DataTableをそのまま使っちゃいます。
> とありますが、どのような記述をすればよいでしょうか?
> csvファイルの2列目が時間、4列目が乱数で構成されていてそれを2次元配列にしてfor文に組み込みたいのですが、記述が分からないので
> できればご教授して頂きたく思います。

時間がないのでヒントだけ。

DataTableの値の参照の仕方について。
データテーブル.Rows[行番号][列番号または列名] といった書き方で取り出せます。

DataGridViewなら
dataGridView1.Rows[行番号].Cells[列番号または列名].Value で取り出せます。

> 2.折れ線グラフで1本作りたいです。
PointPairListはいくついると思いますか?

> 3.グラフの縦軸は適当な乱数です。
> 4.グラフの横軸は時間です。

list1.Add(x, y)のxが横軸の数値、yが縦軸の数値です。
何を代入していけばいいかわかりますか?


引用返信 編集キー/
■55439 / inTopicNo.5)  Re[4]: DataGridViewの内容を使ってグラフの作成をするには
□投稿者/ daibo (8回)-(2010/12/02(Thu) 11:31:05)
No55437 (ごう さん) に返信
> ■No55436 (daibo さん) に返信
> >>私なら、DataTableをそのまま使っちゃいます。
>>とありますが、どのような記述をすればよいでしょうか?
>>csvファイルの2列目が時間、4列目が乱数で構成されていてそれを2次元配列にしてfor文に組み込みたいのですが、記述が分からないので
>>できればご教授して頂きたく思います。
> 
> 時間がないのでヒントだけ。
> 
> DataTableの値の参照の仕方について。
> データテーブル.Rows[行番号][列番号または列名] といった書き方で取り出せます。
> 
> DataGridViewなら
> dataGridView1.Rows[行番号].Cells[列番号または列名].Value で取り出せます。
> 
>>2.折れ線グラフで1本作りたいです。
> PointPairListはいくついると思いますか?
> 
>>3.グラフの縦軸は適当な乱数です。
>>4.グラフの横軸は時間です。
> 
> list1.Add(x, y)のxが横軸の数値、yが縦軸の数値です。
> 何を代入していけばいいかわかりますか?
> 
> 
何かとありがとうございます。
現在ご指摘を元に以下のようにソースコードを一部書き直しました。
      double x, y1, y2;
            PointPairList list1 = new PointPairList();
            PointPairList list2 = new PointPairList();
            for (int i = 0; i < 36; i++)
            {
                x = (double)i + 5;
                y1 = 1.5 + Math.Sin((double)i * 0.2);
                y2 = 3.0 * (1.5 + Math.Sin((double)i * 0.2));
                list1.Add(x, y1);
                list2.Add(x, y2);
            }
↓↓↓↓↓↓↓↓↓↓↓↓↓
      int i;
            double x,y;
            PointPairList list = new PointPairList();
            for(i = 0; i <= dataGridView1.Rows.Count; i++)
            {
               x = (double)dataGridView1.Rows[i+2].Cells[1].Value;
               y = (double)dataGridView1.Rows[i+2].Cells[3].Value;
               list.Add(x,y);
            }

このようにしてビルドしてみたところ、エラーはなかったのですが、実行してみると

追加情報:インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。

と出ます。csvファイルの中に負の数があるのがいけないのか、はたまた上記の全体のソースコードの中で不備があるのか分かりません。
この例外の解決法が分かる方いましたらご教授して頂きたく思います。よろしくお願いします。

引用返信 編集キー/
■55440 / inTopicNo.6)  Re[5]: DataGridViewの内容を使ってグラフの作成をするには
□投稿者/ ごう (208回)-(2010/12/02(Thu) 11:52:33)
No55439 (daibo さん) に返信

> 何かとありがとうございます。
> 現在ご指摘を元に以下のようにソースコードを一部書き直しました。
>       int i;
> double x,y;
> PointPairList list = new PointPairList();
> for(i = 0; i <= dataGridView1.Rows.Count; i++)
> {
> x = (double)dataGridView1.Rows[i+2].Cells[1].Value;
> y = (double)dataGridView1.Rows[i+2].Cells[3].Value;
> list.Add(x,y);
> }
>
> 追加情報:インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
> と出ます。


いいところまで出来てきましたね。
若干惜しいね。
ヒント: dataGridView1の行数。新規行も1行とカウントします。
それから、何でRows[i+2]なの?
for(int i=2; ・・・ って「2からスタート」させちゃいけない理由って何でしょうか??

あと、質問。
dataGridViewのセル内に、数字でないデータ(文字列とか空白)が含まれていたらどう対応しますか?
引用返信 編集キー/
■55441 / inTopicNo.7)  Re[6]: DataGridViewの内容を使ってグラフの作成をするには
□投稿者/ daibo (9回)-(2010/12/02(Thu) 12:08:50)
No55440 (ごう さん) に返信
> ■No55439 (daibo さん) に返信
>
>>何かとありがとうございます。
>>現在ご指摘を元に以下のようにソースコードを一部書き直しました。
>>      int i;
>> double x,y;
>> PointPairList list = new PointPairList();
>> for(i = 0; i <= dataGridView1.Rows.Count; i++)
>> {
>> x = (double)dataGridView1.Rows[i+2].Cells[1].Value;
>> y = (double)dataGridView1.Rows[i+2].Cells[3].Value;
>> list.Add(x,y);
>> }
>>
>>追加情報:インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
>>と出ます。
>
>
> いいところまで出来てきましたね。
> 若干惜しいね。
> ヒント: dataGridView1の行数。新規行も1行とカウントします。
> それから、何でRows[i+2]なの?
> for(int i=2; ・・・ って「2からスタート」させちゃいけない理由って何でしょうか??
>
> あと、質問。
> dataGridViewのセル内に、数字でないデータ(文字列とか空白)が含まれていたらどう対応しますか?

ヒントとしては
i <= dataGridView1.Rows.Count + 1
という形でよろしいのでしょうか?
i+2とした理由は、1行目に各項目の名前、2行目に各項目の単位としていて、3行目から読み込みたい対象のデータがあったからです。ご指摘の通りfor文の最初をi = 2としたほうがスマートでしたね。ありがとうございます。
質問についてなのですが、現在読み込み対象としているファイルに最初の2行以外文字列がなく、空白もないため特に意識せずに進めてきたので対応等は考えていませんでした。
引用返信 編集キー/
■55443 / inTopicNo.8)  Re[7]: DataGridViewの内容を使ってグラフの作成をするには
□投稿者/ ごう (209回)-(2010/12/02(Thu) 12:53:02)
No55441 (daibo さん) に返信
> ヒントとしては
> i <= dataGridView1.Rows.Count + 1
> という形でよろしいのでしょうか?

残念。
あえて正解は言わないでおくので、やってみて。

dataGridView1.Rows.Count は何行あって、
あなたの必要としているデータは何行なのでしょうか??
そこらへんを考慮に入れれば、多分わかってくるんじゃないでしょうか。

参考に、デバッガの使い方を紹介しておきますので
ブレークポイントをfor文の前後に設定して、
dataGridView1.Rows.Count と CSVファイルの行数-2(最初の2行はデータじゃないみたいですから)を比較してみましょう。

http://journal.mycom.co.jp/articles/2008/08/18/debug/index.html

> 質問についてなのですが、現在読み込み対象としているファイルに最初の2行以外文字列がなく、空白もないため特に意識せずに進めてきたので対応等は考えていませんでした。

今後のことを考えるならば、TryParseメソッドについて調べておいた方がいいと思います。
まあこれは、今の課題が出来るようになってから。
引用返信 編集キー/
■55444 / inTopicNo.9)  Re[8]: DataGridViewの内容を使ってグラフの作成をするには
□投稿者/ daibo (10回)-(2010/12/02(Thu) 13:18:45)
No55443 (ごう さん) に返信
> ■No55441 (daibo さん) に返信
>>ヒントとしては
>>i <= dataGridView1.Rows.Count + 1
>>という形でよろしいのでしょうか?
>
> 残念。
> あえて正解は言わないでおくので、やってみて。
>
> dataGridView1.Rows.Count は何行あって、
> あなたの必要としているデータは何行なのでしょうか??
> そこらへんを考慮に入れれば、多分わかってくるんじゃないでしょうか。
>
> 参考に、デバッガの使い方を紹介しておきますので
> ブレークポイントをfor文の前後に設定して、
> dataGridView1.Rows.Count と CSVファイルの行数-2(最初の2行はデータじゃないみたいですから)を比較してみましょう。
>
> http://journal.mycom.co.jp/articles/2008/08/18/debug/index.html
>
>>質問についてなのですが、現在読み込み対象としているファイルに最初の2行以外文字列がなく、空白もないため特に意識せずに進めてきたので対応等は考えていませんでした。
>
> 今後のことを考えるならば、TryParseメソッドについて調べておいた方がいいと思います。
> まあこれは、今の課題が出来るようになってから。

デバッグをしてみたところ、dataGridView1.Rows.Countの値が364でcsvファイルの行数-2が365-2=363だったので
dataGridView.Rows.Count - 1としました。
後半の案件については後日勉強したいと思います。

重ね重ね質問して申し訳ないのですが、次は
x = (double)dataGridView1.Rows[i].Cells[1].Value;
の部分で、'System.InvalidCastException'のハンドルされていない例外が発生しました。

追加情報:指定されたキャストは有効ではありません。
とのことですが、この例外についてもご指摘いただけたらなと思います。
よろしくお願いします。
引用返信 編集キー/
■55445 / inTopicNo.10)  Re[9]: DataGridViewの内容を使ってグラフの作成をするには
□投稿者/ ごう (210回)-(2010/12/02(Thu) 13:32:31)
2010/12/02(Thu) 13:33:22 編集(投稿者)

No55444 (daibo さん) に返信
> デバッグをしてみたところ、dataGridView1.Rows.Countの値が364でcsvファイルの行数-2が365-2=363だったので
> dataGridView.Rows.Count - 1としました。

その通りです!

> 重ね重ね質問して申し訳ないのですが、次は
> x = (double)dataGridView1.Rows[i].Cells[1].Value;
> の部分で、'System.InvalidCastException'のハンドルされていない例外が発生しました。
>
> 追加情報:指定されたキャストは有効ではありません。
> とのことですが、この例外についてもご指摘いただけたらなと思います。
> よろしくお願いします。


x = (double)dataGridView1.Rows[i].Cells[1].Value; の行前に、
「object objTmp = dataGridView1.Rows[i].Cells[1].Value;」という文を入れ、

x = (double)dataGridView1.Rows[i].Cells[1].Value; の行にブレークポイントを張り
objTmpの値をデバッガで確認しましょう。
どうなってましたか??

# まー、そこで「セルに数字以外の文字が入っていたら、(double)を頭につけるだけではキャストできないけど大丈夫なの?」という問題が生きてくるのですが


引用返信 編集キー/
■55446 / inTopicNo.11)  Re[9]: DataGridViewの内容を使ってグラフの作成をするには
□投稿者/ 魔界の仮面弁士 (1969回)-(2010/12/02(Thu) 13:51:03)
No55444 (daibo さん) に返信
> 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);

引用返信 編集キー/
■55447 / inTopicNo.12)  Re[10]: DataGridViewの内容を使ってグラフの作成をするには
□投稿者/ daibo (11回)-(2010/12/02(Thu) 13:52:28)
No55445 (ごう さん) に返信
> 2010/12/02(Thu) 13:33:22 編集(投稿者)
>
> x = (double)dataGridView1.Rows[i].Cells[1].Value; の行前に、
> 「object objTmp = dataGridView1.Rows[i].Cells[1].Value;」という文を入れ、
>
> x = (double)dataGridView1.Rows[i].Cells[1].Value; の行にブレークポイントを張り
> objTmpの値をデバッガで確認しましょう。
> どうなってましたか??
>
> # まー、そこで「セルに数字以外の文字が入っていたら、(double)を頭につけるだけではキャストできないけど大丈夫なの?」という問題が生きてくるのですが
>
>
デバッグしてみたところ、"0"とだけウォッチウィンドウに出ましたが、これはnullとは違うのですか?
この"0"の意味が分かりません。
引用返信 編集キー/
■55448 / inTopicNo.13)  Re[11]: DataGridViewの内容を使ってグラフの作成をするには
□投稿者/ ごう (211回)-(2010/12/02(Thu) 14:00:51)
No55447 (daibo さん) に返信

> デバッグしてみたところ、"0"とだけウォッチウィンドウに出ましたが、これはnullとは違うのですか?
> この"0"の意味が分かりません。


失礼かもしれないけど、ホントに数字の"0"ですかね? O(オー)じゃなくて???

# ホントに0なら、もう私にはわかりません。
# また、Double型への変換は、下記と魔界の仮面弁士さんのコメントを参考に。

Double.TryParse
http://msdn.microsoft.com/ja-jp/library/994c0zb1(VS.80).aspx

文字列が数字に変換できるか調べる
http://dobon.net/vb/dotnet/vb2cs/isnumeric.html


引用返信 編集キー/
■55449 / inTopicNo.14)  Re[12]: DataGridViewの内容を使ってグラフの作成をするには
□投稿者/ ごう (212回)-(2010/12/02(Thu) 14:10:10)
あっ、ごめんなさい。
簡単に再現できました。

object o = "0";
double d = (double)o; ← エラー(System.InvalidCastException はハンドルされませんでした。指定されたキャストは有効ではありません。)



TryParseを使ってこういう風に記述すれば、キャストエラーは防げます。

object o = "0";

double d = -1;

if (double.TryParse(o.ToString(),
System.Globalization.NumberStyles.Any,
System.Globalization.NumberFormatInfo.InvariantInfo,
out d) == false)
{
    MessageBox.Show(o.ToString() + "の変換に失敗しました");
}


引用返信 編集キー/
■55450 / inTopicNo.15)  Re[13]: DataGridViewの内容を使ってグラフの作成をするには
□投稿者/ ごう (214回)-(2010/12/02(Thu) 14:52:02)
先ほどは、疑ってしまってすみません。
参考までに。


# 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);
}
     

引用返信 編集キー/
■55454 / inTopicNo.16)  Re[14]: DataGridViewの内容を使ってグラフの作成をするには
□投稿者/ daibo (12回)-(2010/12/02(Thu) 16:36:08)
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#の習得に励みます。
また疑問や分からない点があったときはよろしくお願いします。

最後になりますが、こんなに丁寧なアドバイスをいただき感謝しています。ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -