2

チャートのデータ シリーズを管理するクラスを開発しています。ただし、新しいシリーズを追加すると、最初の dataPoint の XValue が 0 の場合、代わりに XValue が 1 としてプロットに表示されます。さらに dataPoint を追加すると、自動的に修正されるようです。以下のコードを使用すると、コンストラクターが最初に (明らかに) 呼び出され、次に Initialize ("Series1",0,0 のようなデータを使用) が呼び出され、後で AddPoint を呼び出すことができます。誰が何が起こっているのか知っていますか?

編集:私が見つけたものから、これはシリーズにデータポイントが1つしかなく、そのデータポイントのxValueが0の場合にいつでも発生します。シリーズは、ゼロ以外のデータポイントが1つ(またはそれ以上)になるまで正しく動作しませんxValues が追加されます。私の回避策は、追加するデータ ポイントの xValue が 0 の場合、代わりにその xValue を非常に小さくすることです (1x10^-150)。動作しているように見えますが、これはまだ私の本の奇妙なバグです。私もそれに関する情報を見つけることができませんでした。

Public Sub New(ByVal chartObj As Chart)
    'Init m_chart
    m_chart = chartObj

    m_chart.BackColor = Color.Gainsboro

    'Init Legend
    m_legend = New Legend("Legend")
    m_legend.Docking = Docking.Bottom
    m_chart.Legends.Add(m_legend)

    'Init m_chartArea

    m_chartArea = New ChartArea("Default")

    m_chartArea.BackColor = Color.Black

    m_chartArea.AxisX.LabelStyle.Format = "{0:0.00}"

    setXLimits(-10, 10)
    setYLimits(-0.5, 0.5)

    m_chartArea.AxisX.Title = "Position (mm)"
    m_chartArea.AxisX.TitleFont = New Font("Arial", 10, FontStyle.Regular)

    m_chartArea.AxisY.Title = "Peak-To-Peak (Volts)"
    m_chartArea.AxisY.TitleFont = New Font("Arial", 10, FontStyle.Regular)

    m_chartArea.AxisX.MajorGrid.LineDashStyle = ChartDashStyle.Dash
    m_chartArea.AxisX.MajorGrid.LineColor = Color.DarkGreen
    m_chartArea.AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Dash
    m_chartArea.AxisY.MajorGrid.LineColor = Color.DarkGreen

    m_chart.ChartAreas.Add(m_chartArea)

    'Init m_dataSeries
    m_dataSeries = New List(Of Series)

    'Init m_markerSeries
    m_markerSeries = New Series("Peaking Markers")
    m_markerSeries.ChartType = SeriesChartType.Point
    m_markerSeries.MarkerColor = Color.Red
    m_markerSeries.MarkerStyle = MarkerStyle.Triangle
    m_markerSeries.MarkerSize = 10
    m_chart.Series.Add(m_markerSeries)

    'Init m_title
    m_title = New Title("Plots")
    m_title.Font = New Font("Arial", 20, FontStyle.Regular)
    m_chart.Titles.Add(m_title)

End Sub

Public Sub Initialize(ByVal Legend As String, ByVal xVal As Double, ByVal yVal As Double)
    Dim temp As New Series(Legend)
    temp.ChartType = SeriesChartType.Line
    temp.Points.Clear()

    If nextAxis = "X" Then
        temp.Color = xColor
        nextAxis = "Y"
    Else
        temp.Color = yColor
        nextAxis = "X"
    End If

    temp.MarkerStyle = MarkerStyle.Circle

    m_dataSeries.Add(temp)
    m_chart.Series.Add(temp)

    AddPoint(xVal, yVal)

End Sub

Public Sub AddPoint(ByVal x As Double, ByVal y As Double)
    If m_chart.InvokeRequired Then
        m_chart.Invoke(New Action(Of Double, Double)(AddressOf AddPoint), x, y)
    Else
        Dim temp As New DataPoint(x, y)

        m_dataSeries.Item(m_dataSeries.Count - 1).Points.Add(temp)
    End If
End Sub
4

2 に答える 2

0

これを変更してみてください:

If m_chart.InvokeRequired Then
    m_chart.Invoke(New Action(Of Double, Double)(AddressOf AddPoint), x, y)
Else
    Dim temp As New DataPoint(x, y)

    m_dataSeries.Item(m_dataSeries.Count - 1).Points.Add(temp)
End If

これに:

If m_chart.InvokeRequired Then
    m_chart.Invoke(New Action(Of Double, Double)(AddressOf AddPoint), x, y)
End If

Dim temp As New DataPoint(x, y)
m_dataSeries.Item(m_dataSeries.Count - 1).Points.Add(temp)
于 2014-04-15T08:11:36.280 に答える