C# 配列の値を定数として指定すると正しく動作します。
drv1.Row.ItemArray[1] → 1250
drv1.Row.ItemArray[2] → 180
グラフを描くプログラムです。
配列のまま(drv1.Row.ItemArray[1])では、グラフ(GraphMen)を押すと、
「型 'System.InvalidCastException' のハンドルされていない例外が Graph.exe で発生しました
追加情報: 指定されたキャストは有効ではありません。」
と出て、止まります。
配列のまま、正しく動作させるためにはどうしたら良いでしょうか。
よろしくお願いします。
環境は
Visual Studio 2012
Windows Forms アプリ
.NET Framework 3.5 Service Pack 1
で作っています
エラーとなった際に値を調べると、
drv1.Row.ItemArray[1]=1250
drv1.Row.ItemArray[2]=180 となっています。
2007年から2010年までのデータを読み込んでグラフを書くのですが、
一番最初の2007年のデータを読み込むところでエラーが出てしまいます。
drv1のデータ元である profitTable が
Year | Sales | Gain |
---|---|---|
2007 | 1250 | 180 |
2008 | 1380 | 195 |
2009 | 1450 | 201 |
2010 | 1600 | 253 |
となっています。
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Text; 7using System.Windows.Forms; 8 9namespace Graph 10{ 11 public partial class Form1 : Form 12 { 13 public Form1() 14 { 15 InitializeComponent(); 16 } 17 private void Form1_Load(object sender, EventArgs e) 18 { 19 // TODO: このコード行はデータを 'profitDataSet.ProfitTable' テーブルに読み込みます。必要に応じて移動、または削除をしてください。 20 this.profitTableTableAdapter.Fill(this.profitDataSet.ProfitTable); 21 GraphSales.Checked = true; 22 } 23 24 private void GraphSales_Click(object sender, EventArgs e) 25 { 26 GraphGain.Checked = GraphSales.Checked; 27 GraphSales.Checked = !GraphSales.Checked; 28 Refresh(); 29 } 30 31 private void GraphGain_Click(object sender, EventArgs e) 32 { 33 GraphSales.Checked = GraphGain.Checked; 34 GraphGain.Checked = !GraphGain.Checked; 35 Refresh(); 36 } 37 38 private void GraphGain_Paint(object sender, PaintEventArgs e) 39 { 40 printGraph(e.Graphics); 41 } 42 private void printGraph(Graphics g) 43 { 44 //PenとFontを作る 45 Pen pn = new Pen(Color.Black); 46 Font fnt = new Font("Arial" , 10); 47 //グラフの軸を描く 48 g.DrawLine(pn, 50, 50, 50, 250); 49 g.DrawLine(pn, 50, 250, 310, 250); 50 // グラフのメモリを描く 51 //縦軸 52 for (int i=1; i<11; i++) 53 { 54 g.DrawLine(pn, 50, 30+i*20, 54, 30+i*20); 55 string s; 56 if (GraphSales.Checked) //売上の目盛り 57 { 58 s=String.Format("{0}", 200*i); 59 } 60 else 61 { 62 s=String.Format("{0}", 30*i); 63 } 64 g.DrawString(s, fnt, new SolidBrush(Color.Black), 65 new Point(12,242-i*20)); 66 } 67 //横軸 68 for (int i=0 ; i<5; i++) 69 { 70 g.DrawLine(pn, i*50+50, 250, i*50+50, 246); 71 string s= String.Format("{0}", 2007+i); 72 g.DrawString(s, fnt, new SolidBrush(Color.Black), new Point(i*50+30, 258)); 73 } 74 //レコード数 75 int nRec = profitTableBindingSource.Count; 76 //レコードの数-1だけ線を引く 77 for (int i=0; i<nRec-1; i++) 78 { 79 //現在のレコードのビューを取得する 80 DataRowView drv1=profitTableBindingSource[i] as DataRowView; 81 //売上と利益を取得する 82 int sales1 = (int)(drv1.Row.ItemArray[1]);★★★エラー箇所★★★ 83 int gain1 = (int)(drv1.Row.ItemArray[2]); 84 //次のレコードのビューを取得する 85 DataRowView drv2 = profitTableBindingSource[i+1] as DataRowView; 86 //売上と利益を取得する 87 int sales2 = (int)(drv2.Row.ItemArray[1]); 88 int gain2 = (int)(drv2.Row.ItemArray[2]); 89 int x1 = 50 + 50*i; 90 int x2 = 100 + 50*i; 91 int y1, y2; 92 if (GraphSales.Checked) // 売上をグラフ化する 93 { 94 y1 = 250 - sales1 / 10; 95 y2 = 250 - sales2 / 10; 96 } 97 else //利益をグラフ化する 98 { 99 y1 = 250 - (gain1 * 2) /3; 100 y2 = 250 - (gain2 * 2) /3; 101 } 102 g.DrawLine(pn, x1, y1, x2, y2); 103 } 104 } 105 106 private void FilePrint_Click(object sender, EventArgs e) 107 { 108 if (MessageBox.Show("グラフを印刷します", "印刷の確認", MessageBoxButtons.OKCancel) == DialogResult.OK) 109 { 110 printDocument1.Print(); 111 } 112 //PrintDocumentにグラフを描く 113 114 } 115 116 private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) 117 { 118 printGraph(e.Graphics); 119 } 120 121 private void FileExit_Click(object sender, EventArgs e) 122 { 123 this.Close(); 124 } 125 } 126} 127
回答1件
あなたの回答
tips
プレビュー