タイトル | : Re^6: スクロールに合わせY軸の目盛りに |
記事No | : 11215 |
投稿日 | : 2014/02/16(Sun) 17:34 |
投稿者 | : ゆか |
VBレスキュー(花ちゃん) 様 ありがとうございます。
教えていただいたこと早速やってみました。 動作確認では上手く行ったのですが移植してみると d1(Ncount) = CDbl(ds.Tables(0).Rows(i).Item(J)) の部分で、 「IndexOutOfRangeExceptionはハンドルされてませんでした。」 「テーブル0が見つかりません。」 が出てしまいます。
ちなみに GoTo Test を有効にしますとエラーは出ませんし、スクロールも正常に働きます。
質問の仕方が凄く幼稚ですみませんが、こんな内容で分るようでしたらお願いします。
Imports System.Windows.Forms.DataVisualization.Charting
Public Class Form1 Private spos As Double = 0
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click Dim ds As New DataSet Dim colums As Integer Using cn As New System.Data.OleDb.OleDbConnection ' Dim csvFileName As String = "【2014年02月15日9時00現在の全国各地の気温】.csv" Dim csvFileName As String = "kion.csv"
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath() & _ ";Extended Properties=""Text;HDR=YES;IMEX=1;FMT=Delimited""" Using da As System.Data.OleDb.OleDbDataAdapter = _ New System.Data.OleDb.OleDbDataAdapter("SELECT * FROM " & csvFileName, cn) da.Fill(ds, "Table1") Chart1.DataSource = ds 'Chart に表示するデータソースを設定 colums = ds.Tables(0).Columns.Count - 1 'データの系列数を取得 End Using End Using
With Chart1 .Titles.Clear() 'タイトルの初期化 .Series.Clear() '系列(データ関係)の初期化 End With
' With Chart1 '============== 実際のプリグラムではこの箇所で表示をしています =============== For i As Integer = 1 To colums 'データベースから列名を読込(現在の気温・昨日同時刻の気温 等) Dim columnName As String = ds.Tables(0).Columns(i).ColumnName.ToString() '系列の設定(現在の気温・昨日同時刻の気温 等) .Series.Add(columnName) 'X 軸のラベルテキストの読込・設定(都市・県名) .Series(columnName).XValueMember = ds.Tables(0).Columns(0).ColumnName.ToString() 'グラフ用のデータの読込・設定(各温度) .Series(columnName).YValueMembers = columnName Next '============================================================================
'■------------------- 横・スクロールバーを表示 ----------------Start--■ Dim sv As AxisScaleView = Chart1.ChartAreas(0).AxisX.ScaleView Dim sh As AxisScaleView = Chart1.ChartAreas(0).AxisY.ScaleView With sv .SmallScrollSize = 1 ' ボタンクリック時のスクロール量 '.Position = 1 ' スクロールバーの初期位置 .Position = spos ' スクロールバーの初期位置 .Size = 8 ' 1画面に表示するデータ数(データ数に対する割合で指定する) End With
GoTo Test
'-------------- スクロールに合わせてメモリの最大値と最小値を変更 ------------- '現在表示されているデータの最大値と最小値を求める Dim d1() As Double = Nothing Dim Ncount As Integer = -1 For i As Integer = CInt(spos) To CInt(spos + sv.Size - 1) ' sv.Size For J As Integer = 1 To colums Ncount += 1 ReDim Preserve d1(Ncount) d1(Ncount) = CDbl(ds.Tables(0).Rows(i).Item(J)) Next Next Dim dMax As Double = 0 Dim dMin As Double = 0
dMax = 5 * (CInt(CLng(d1.Max) \ 5) + 1) '目盛りの最大値を求める
'目盛りの最小値を求める If d1.Min >= 0 Then dMin = 0 '最小値を 0 にしたい場合 Else dMin = d1.Min '目盛りの最大値をデータの最大値 + 5(データに合わせて)に設定 dMin = 5 * (CInt(CLng(d1.Min) \ 5) - 1) End If
With Chart1.ChartAreas(0).AxisY .Maximum = dMax '目盛りの最大値 .Minimum = dMin '目盛りの最小値 .Interval = 2 'メモリ間隔 End With
Test: End With End Sub
Private Sub Chart1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Chart1.Paint 'スクロールの位置を求める Dim sv As AxisScaleView = Chart1.ChartAreas(0).AxisX.ScaleView spos = sv.Position If Double.IsNaN(spos) Then spos = 0 End If Button1.PerformClick() End Sub
End Class
|