tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルChart繰返し表示で前表示をクリア
記事No10866
投稿日: 2012/07/24(Tue) 18:39
投稿者et
はじめまして。

開発環境:VB2010pro Win7    

初めて投稿させていただきます。
CSVファイルからチャートコントロールを利用して曲線グラフを表示します。
CSVファイルに1分毎に流量のデータを追加した後グラフを再表示したいのですが、
前回表示したデータに加えて二重、三重にグラフ表示するデータが増えていきます。
グラフ表示データをクリアして最新のデータだけ表示したいのですが、
どうしたら良いでしょうか初歩的な事ですが教えて頂けますでしょうか。
宜しくお願いします。

以下ソースです。
-------------------------------------------------------------------------------
    Private Sub ChartDataOpen(ByVal FolderPath As String, ByVal fileName As String)
        'CSV ファイルを読み込みChart に表示するデータソースを設定
        Using cn As New System.Data.OleDb.OleDbConnection
            Dim csvFileName As String = fileName
            cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FolderPath & _
                        ";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
    End Sub

    Private Sub ChartClar(ByVal cht As Chart)
        'Chart の設定を初期値に戻す
        With cht
            .Titles.Clear()                  'タイトルの初期化
            .BackGradientStyle = GradientStyle.None '背景グラデーション
            .BackColor = Color.White         '背景色を白色に
            '外形をデフォルトに
            .BorderSkin.SkinStyle = BorderSkinStyle.None
            .Legends.Clear()                 '凡例の初期化
            '.Legends.Add("Legend1")
            .Series.Clear()                  '系列(データ関係)の初期化
            .ChartAreas.Clear()              '軸メモリ・3D 表示関係の初期化
            .ChartAreas.Add("ChartArea1")
            .Annotations.Clear()            'グラフの注釈
        End With
    End Sub

    Private Sub ChartDisplay(ByVal upper As Integer, ByVal lower As Integer)
        '設定を一旦初期値に戻す。
        Call ChartClar(Chart1)
        '起動フォルダーに入れて置いてください。
        Call ChartDataOpen(System.Windows.Forms.Application.StartupPath(), "GraphFile.csv")
        With Chart1
            For i As Integer = 1 To colums
                Dim columnName As String = ds.Tables(0).Columns(i).ColumnName.ToString()
                '系列の設定(水量)
                .Series.Add(columnName)
                'グラフの種類を曲線グラフに設定
                .Series(columnName).ChartType = DataVisualization.Charting.SeriesChartType.Spline  'Column
                'X 軸のラベルテキストの読込・設定(時間)
                .Series(columnName).XValueMember = ds.Tables(0).Columns(0).ColumnName.ToString()
                '.Series(columnName).XAxisType.Format
                'グラフ用のデータの読込・設定(水量)
                .Series(columnName).YValueMembers = columnName
            Next
        End With
        '--- Y軸 に関する設定 ---
        With Chart1.ChartAreas(0).AxisY
            '目盛りの設定
            .Maximum = upper    '流量の最大値
            .Minimum = lower    '流量の最小値
            'Y軸のタイトル関係の設定
            .Title = "流  量"
            .TitleAlignment = StringAlignment.Center        '中央に表示
            .TextOrientation = TextOrientation.Stacked      '縦書きで表示
        End With

    End Sub
-----------------------------------------------------------------------------
GraphFile.csv
時刻  流量
0:00    50
0:01    55
0:02    65
0:03    80
0:04    100
0:05    120
0:06    150
0:07    170
0:08    185
0:09    195
0:10    200
0:11    204
0:12    207
0:13    209
0:14    210
0:15    209
0:16    208
0:17    207
0:18    206
0:19    205
0:20    204
0:21    202
0:22    198
0:23    194
0:24    186
0:25    176
0:26    168
0:27    160
0:28    152
0:29    144
0:30    137
0:31    130
0:32    123
0:33    117
0:34    111
0:35    105
0:36    100
0:37    95
0:38    90
0:39    86
0:40    82
0:41    79
0:42    76
0:43    73
0:44    70
0:45    68
0:46    66
0:47    64
0:48    62
0:49    60
0:50    59
0:51    58
0:52    57
0:53    56
0:54    55
0:55    54
0:56    53
0:57    52
0:58    51
0:59    50

[ツリー表示へ]
タイトルRe: Chart繰返し表示で前表示をクリア
記事No10867
投稿日: 2012/07/24(Tue) 20:11
投稿者VBレスキュー(花ちゃん)
> CSVファイルに1分毎に流量のデータを追加した後グラフを再表示したいのですが、
ChartDisplay() はどこでどのように呼んでいるのですか?
ChartDataOpen した時のデーターはどうなっていますか?

> 前回表示したデータに加えて二重、三重にグラフ表示するデータが増えていきます。
GraphFile.csv ファイルは、どのように更新しているのですか?
再読み込み時、DataSet 等は初期化していますか?

> グラフ表示データをクリアして最新のデータだけ表示したいのですが、
GraphFile.csv ファイル に最新のデータ(表示したいデータを)だけを保存するばいいのでは。

肝心の部分のコードや説明がないと...。

[ツリー表示へ]
タイトルRe^2: Chart繰返し表示で前表示をクリア
記事No10868
投稿日: 2012/07/24(Tue) 21:16
投稿者et
問合せ内容が不十分ですみません。

> > CSVファイルに1分毎に流量のデータを追加した後グラフを再表示したいのですが、
>  ChartDisplay() はどこでどのように呼んでいるのですか?
GraphFile.csv ファイルに1件データを追加で保存した後に呼んでいます。


> ChartDataOpen した時のデーターはどうなっていますか?
GraphFile.csv ファイルに新たに1件データを追加で保存したファイルを使用しています。
ここでDataSetの初期化が必要なのでしょうか?
CSVファイルとグラフ領域の初期化だけに気をとられていました。


> > 前回表示したデータに加えて二重、三重にグラフ表示するデータが増えていきます。
> GraphFile.csv ファイルは、どのように更新しているのですか?
> 再読み込み時、DataSet 等は初期化していますか?
GraphFile.csv ファイルにデータを追加して保存後グラフ表示することを繰り返しています。
DataSetの初期化は、どのタイミングでまたどのようにコーディングしたらいいでしょうか?


> > グラフ表示データをクリアして最新のデータだけ表示したいのですが、
> GraphFile.csv ファイル に最新のデータ(表示したいデータを)だけを保存するばいいのでは。
GraphFile.csv ファイルには最新の表示したいデータだけを保存しているつもりですが、
確認のため、DataGridViewにGraphFile.csv ファイルを表示してます。
それでもグラフ表示データに前回のデータがなぜか付いてきてしまいます。
DataSetの初期化をしていないからでしょうか?
初歩的なことからでもご教授宜しくお願いします。

[ツリー表示へ]
タイトルRe^3: Chart繰返し表示で前表示をクリア
記事No10869
投稿日: 2012/07/25(Wed) 08:37
投稿者VBレスキュー(花ちゃん)
DataSet をグローバル変数として使っているのなら、プログラムを終了(スコープを抜けるまで)
するまで、データーは保持されますよね。
(ここのサンプルでも使い分けしていたかと、又、起動時にしか呼んでいないとか)

da.Fill(ds, "Table1")
これは、myText &= TextBox1.Text としているのと同様で、DS にデーターを追加更新しています。


  da.Fill(ds, "Table1")
  Chart1.DataSource = ds                       'Chart に表示するデータソースを設定
  colums = ds.Tables(0).Columns.Count - 1      'データの系列数を取得
  'ここで下記のようにすれば、行数が増えている事が解るかと。
  Debug.Print(ds.Tables(0).Rows.Count.ToString)
End Using
  
一般的に言って、変数をどこで宣言してどのように使うかはそのプログラムの仕様によります。
DS に複数回データーをセットするような仕様で、新たにデーターをセットしたいのであれば
その前に初期化する必要があるのは当然の事ですよね。
カウンタ用変数を思い浮かべて見て下さい。使用前に 0 にセットしたりしますよね。

初期化の方法は、使用する変数によって、使い方等でも変わりますが、一般的に言えば
変数を宣言した時の値に戻せばいいので、DataSet の場合は、Clear メソッドがあるので Clear
メソッドを使ってもデーターを削除できますが、連続して使用する場合等にうまく削除できない
場合があるとかで、AcceptChanges  と併用するとか、一旦破棄して、再び宣言し直すように
した方が無難とか。

[DataSet 初期化] とかをキーワードに検索して見れば、色々見つかりますよ。
http://dotnetdotnet.seesaa.net/article/131294169.html

[ツリー表示へ]
タイトルRe^4: Chart繰返し表示で前表示をクリア
記事No10870
投稿日: 2012/07/25(Wed) 16:58
投稿者et
DataSetをChartDataOpenで一旦破棄して、再び宣言し直すようにしましたら
ChartにCSVファイルの最新データのみ表示するようになりました。

本当にありがとうございました。助かりました。
サンプルソースを参考にさせて頂いていますが、理解できてなく使用している
ところもあり、今回は初歩的なところでとても勉強になりました。
またお世話になることがありましたら宜しくお願いします。

[ツリー表示へ]