tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルChart point の更新方法
記事No12049
投稿日: 2020/12/05(Sat) 14:19
投稿者かるび
下記のように更新時、すべてをクリアして 更新していますが、すべてではなく部分的に指定して更新する方法はありますか?


'チャート関係の名前空間です。
Imports System.Windows.Forms.DataVisualization.Charting

Public Class Form1
    Public dat() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Chart1.Series.Clear()
        Me.Chart1.Series.Add(0)
        For i As Integer = 0 To 10
            Me.Chart1.Series(0).Points.AddXY(i, dat(i))
        Next
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'ここで Series(0).Points(1)のX値を 10に 変更!
        dat(1) = 10
        Me.Chart1.Series(0).Points.Clear()
        For i As Integer = 0 To 10
            Me.Chart1.Series(0).Points.AddXY(i, dat(i))
        Next

    End Sub
End Class

[ツリー表示へ]
タイトルRe: Chart point の更新方法
記事No12050
投稿日: 2020/12/05(Sat) 16:11
投稿者魔界の仮面弁士
> 下記のように更新時、すべてをクリアして 更新していますが、
> すべてではなく部分的に指定して更新する方法はありますか?

「部分的な指定」とは、どの部分のことでしょうか。

Series であれば、「Chart1.Series(インデックス番号または名前)」でアクセスできますし、
Points も同様に、インデックス番号で特定できますね。

[ツリー表示へ]
タイトルRe^2: Chart point の更新方法
記事No12051
投稿日: 2020/12/05(Sat) 18:10
投稿者かるび
> 「部分的な指定」とは、どの部分のことでしょうか。

        dat(1) = 10
        Me.Chart1.Series(0).Points.Clear()
        For i As Integer = 0 To 10
            Me.Chart1.Series(0).Points.AddXY(i, dat(i))
        Next

これでは、Me.Chart1.Series(0)すべてを更新で時間がかかります。
データの変化があったのは dat(1) = 10だけなので
Me.Chart1.Series(0)のPoints(1)の部分だけ更新させたいのです。


私、関数を知らないだけかもしれません。

[ツリー表示へ]
タイトルRe^3: Chart point の更新方法
記事No12052
投稿日: 2020/12/06(Sun) 21:09
投稿者魔界の仮面弁士
> Me.Chart1.Series(0)のPoints(1)の部分だけ更新させたいのです。

…?

文字通り、Me.Chart1.Series(0).Points(1) の内容を差し替えれば
よいと思うのですが、それでは駄目だったということでしょうか。

【案1】.Points(1) を直接差し替える(インデクサへの代入)
【案2】.Points から不要な座標を .RemoveAt で取り除いてから、.InsertXY で差し替える
【案3】.Points(1) が指し示す DataPoint の XValue / YValues プロパティを書き換える

[ツリー表示へ]
タイトルRe^4: Chart point の更新方法
記事No12053
投稿日: 2020/12/07(Mon) 09:42
投稿者かるび

魔界の仮面弁士さん、ご対応、誠にありがとうございます。
> 【案1】.Points(1) を直接差し替える(インデクサへの代入)
> 【案2】.Points から不要な座標を .RemoveAt で取り除いてから、.InsertXY で差し替える
> 【案3】.Points(1) が指し示す DataPoint の XValue / YValues プロパティを書き換える

案1:方法解らず?

案2:これで出来ました
Points.RemoveAt(1)
Points.InsertXY(1, 3, 10)

案3:表示が更新されません、この後になにか必要なのでしょうか?
Points[1].SetValueXY(3,1)

[ツリー表示へ]
タイトルRe^5: Chart point の更新方法
記事No12054
投稿日: 2020/12/07(Mon) 10:30
投稿者魔界の仮面弁士
> ここで Series(0).Points(1)のX値を 10に 変更!
そもそも最初の質問のこれ、変更しているのは Y 値ですよね。


> 案1:方法解らず?
.Points(1) = New DataPoint(x, y)
という書き方ですね。

そもそも
 Me.Chart1.Series(0).Points.AddXY(1.0, 2.0)
という処理は、
 Me.Chart1.Series(0).Points.Add(New DataPoint(1.0, 2.0))
もしくは
 Me.Chart1.Series(0).Points.Add(New DataPoint() With {.XValue = 1.0, .YValues = {2.0}})
と同義です。

実際、For や For Each で Points コレクションを列挙すると、
個々の座標要素は DataPoint クラスとして取得されますよね。



> 案2:これで出来ました
> Points.RemoveAt(1)
> Points.InsertXY(1, 3, 10)
いやいやいやいや。
なぜ 3, 10 を指定したのでしょうか。その数字はどこから来たものですか?

当初の質問を見る限り、Load イベントで「.AddXY(1.0, 2.0)」がセットされていた
.Points(1) の箇所の Y 値を、2 から 10 へ変更するコードを求めていたはずですよね。
であれば、「.InsertXY(1, 1.0, 10.0)」となるはずだと思うのですが…。

With Me.Chart1.Series(0).Points
 .RemoveAt(1)
 .InsertXY(1, 1, 10)
End With


でもまぁ、今回は案3を使うのが良いでしょうね。


> 案3:表示が更新されません、この後になにか必要なのでしょうか?
> Points[1].SetValueXY(3,1)
表示が更新されないどころか、そもそも動作すらしないはず…。
Visual Basic で Points[1] 表記は許されないので、コンパイルエラーになることでしょう。


今回は、XValue は置き換えずに YValue のみを差し替えるのですから、
 'Me.Chart1.Series(0).Points(1).ValueX = 1.0
 Me.Chart1.Series(0).Points(1).ValueY = { 10.0 }
と書けば十分です。

先の回答でも、私は「SetValueXY メソッド」ではなく、
「XValue / YValues プロパティ」と回答していましたよね?


なお、
 Me.Chart1.Series(0).Points(1).SetValueXY(1.0, 10.0)
の書き方だと、DataPoint の変化がチャートに伝わりません。
この方法で書き換えた場合には、
 Me.Chart1.Series(0).Points.Invalidate()
または
 Me.Chart1.Invalidate()
などとして、データが更新されたことをチャートに伝える必要があります。

[ツリー表示へ]
タイトルRe^6: Chart point の更新方法
記事No12055
投稿日: 2020/12/07(Mon) 12:00
投稿者かるび
魔界の仮面弁士さん、ご対応ありがとうございます。

> なぜ 3, 10 を指定したのでしょうか。その数字はどこから来たものですか?
すみませんでした。

> Me.Chart1.Series(0).Points(1).ValueY
この .ValueY が 無くて エラーになります。
環境はVSexp2017を使用しています。

ご指導していただいた内容でこのようにしてみました。
(見て解るようにY値をおのおの違う値に変えています)
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'ここで Series(0).Points(1)のY値を 10に 変更!
        dat(1) = 10
        Me.Chart1.Series(0).Points.Clear()
        For i As Integer = 0 To 10
            Me.Chart1.Series(0).Points.AddXY(i, dat(i))
        Next
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        'ここで Series(0).Points(1)のY値を 11に 変更!
        Me.Chart1.Series(0).Points(1) = New DataPoint(1, 11)
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        'ここで Series(0).Points(1)のY値を 12に 変更!
        Me.Chart1.Series(0).Points.RemoveAt(1)
        Me.Chart1.Series(0).Points.InsertXY(1, 1, 12)
    End Sub

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        'ここで Series(0).Points(1)のY値を 13に 変更!
        Me.Chart1.Series(0).Points(1).YValues = {13.0}

    End Sub

    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
        'ここで Series(0).Points(1)のY値を 14に 変更!
        Me.Chart1.Series(0).Points(1).SetValueY(14)
        Me.Chart1.Series.Invalidate()
    End Sub


[ツリー表示へ]
タイトルRe^7: Chart point の更新方法
記事No12056
投稿日: 2020/12/07(Mon) 13:26
投稿者魔界の仮面弁士
> > Me.Chart1.Series(0).Points(1).ValueY
> この .ValueY が 無くて エラーになります。

済みません。
ValueX / ValueY ではなく
XValue / YValue の間違いです。


No.12052
> 【案3】.Points(1) が指し示す DataPoint の XValue / YValues プロパティを書き換える
の方では正しい記述になっていたのに…orz

[ツリー表示へ]
タイトルRe^8: Chart point の更新方法
記事No12057
投稿日: 2020/12/07(Mon) 13:36
投稿者かるび
魔界の仮面弁士さん、いろいろご指導ありがとうございます。


一番簡単なのは
 Me.Chart1.Series(0).Points(1).YValues(0) = 11
かとおもっています。

ちなみにC#では、
 chart1.Series[1].Points.Invalidate();
を付加しないと表示が更新されませんでした。

ありがとうございました。

[ツリー表示へ]