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

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

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

キャストのエラー

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

■87385 / inTopicNo.1)  キャストのエラー
  
□投稿者/ Ponta (1回)-(2018/05/16(Wed) 17:15:07)

分類:[C#] 


こんにちは
Datatable(ds.Tables["TableB"])のデータを用いて、以下の計算を試みましたが
キャストが上手くいきません(エラー:指定されたキャストが有効ではありません)
現状はobject型(中は整数値)からint型にキャストしています。



for (int i = 0; i < ds.Tables["TableA"].Rows.Count; i++)
{
var data2 = new DataPoint();
data2.SetValueXY(ds.Tables["TableB"].Columns[0],
(int)ds.Tables["TableB"].Rows[i+1][0]-(int)ds.Tables["TableB"].Rows[i][0]);   ←ここでエラー
totalSrs.Points.Add(data2);
}
chart1.Series.Add(totalSrs); //グラフにシリーズを追加


キャストの仕方が間違っているのか、そもそもキャストだとできないのかわかりません。
以上、よろしくお願いします。

引用返信 編集キー/
■87386 / inTopicNo.2)  Re[1]: キャストのエラー
□投稿者/ WebSurfer (1497回)-(2018/05/16(Wed) 17:28:08)
No87385 (Ponta さん) に返信

> data2.SetValueXY(ds.Tables["TableB"].Columns[0],
> (int)ds.Tables["TableB"].Rows[i+1][0]-(int)ds.Tables["TableB"].Rows[i][0]);   ←ここでエラー

その DataTable(即ち ds.Tables["TableB"])の当該列の型は何でしょう?
引用返信 編集キー/
■87387 / inTopicNo.3)  Re[1]: キャストのエラー
□投稿者/ 魔界の仮面弁士 (1671回)-(2018/05/16(Wed) 17:42:37)
2018/05/17(Thu) 10:29:11 編集(投稿者)

No87385 (Ponta さん) に返信
> for (int i = 0; i < ds.Tables["TableA"].Rows.Count; i++)
ここは TableB で無いようですが、あえてそうしているのでしょうか。

TableA と TableB の関係次第ではあるのですが、ループ内では
TableA を見ておらず、むしろ
TableB の行差分を取っているように見えたので、
 i < ds.Tables["TableB"].Rows.Count - 1
といった継続条件になるのではないか、と思ってみたり。


> 現状はobject型(中は整数値)からint型にキャストしています。
その整数値は int ですか。それとも long とか short だったりしますか?
string 値ということは無いですよね?

念のため、ds.Tables["TableB"].Columns[0].DataType を確認しておいた方が良いかと。


> キャストの仕方が間違っているのか、そもそもキャストだとできないのかわかりません。
ボックス化解除するためには、object 内のデータの型を正しく把握している必要があります。

int intValue = 10;
long longValue = 10L;
short shortValue = 10;
string stringValue = "10";

object oInt = intValue;
object oLong = longValue;
object oShort = shortValue;
object oString = stringValue;

Console.WriteLine((int)oInt); // OK
// Console.WriteLine((int)oLong); // InvalidCastException
// Console.WriteLine((int)oShort); // InvalidCastException
// Console.WriteLine((int)oString); // InvalidCastException
Console.WriteLine((int)(long)oLong); // OK
Console.WriteLine((int)(short)oShort); // OK
Console.WriteLine(int.Parse((string)oString)); // OK



> var data2 = new DataPoint();
> data2.SetValueXY(ds.Tables["TableB"].Columns[0], (int)ds.Tables["TableB"].Rows[i+1][0]-(int)ds.Tables["TableB"].Rows[i][0]);   ←ここでエラー

DataPoint クラスの
public void SetValueXY(object xValue, params object[] yValue)
というメソッドを呼び出しているようですが、ここで
第一引数 xValue に対して、System.Data.DataColumn を渡していますよね。

SetValueXY の第一引数には、データポイントの X 値を渡すべきなのでは?
https://referencesource.microsoft.com/#System.Windows.Forms.DataVisualization/Common/DataManager/DataPoint.cs,2086
https://referencesource.microsoft.com/#System.Windows.Forms.DataVisualization/Common/DataManager/DataSeries.cs,a83419cfea834cf1,references

上記の実装を見る限りでは、第一引数のデータ型は、
数値や文字列が求められているように見受けられます。

…と思ったんですが、こっちは私の勘違いでした。
var data2 = new DataPoint();
data2.SetValueXY(xValue, yValue);
の場合は、xValue が DataColumn でもいけますね。

もしもこれが、
chart1.Series[a].Points[b].SetValueXY(xValue, yValue);
の場合は、xValue が DataColumn だとエラーになりますが。
引用返信 編集キー/
■87390 / inTopicNo.4)  Re[1]: キャストのエラー
□投稿者/ furu (168回)-(2018/05/17(Thu) 09:52:33)
No87385 (Ponta さん) に返信

ORACLEなどのDBからGetDataTableで取得したデータの場合
小数部がない数値列でもdecimalになったりします。

もとのデータが整数だとわかっている場合
Convert.ToInt32で変換してはどうでしょうか?

整数でない場合、丸めが発生しますが例外にはなりません。
引用返信 編集キー/
■87394 / inTopicNo.5)  Re[2]: キャストのエラー
□投稿者/ Ponta (3回)-(2018/05/17(Thu) 13:30:59)
No87387 (魔界の仮面弁士 さん) に返信

Console.WriteLine(int.Parse((string)oString)); エラーが消えました。。
ありがとうございます。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ