0

我有一个包含多个系列的 DevExpress XtraChart 对象,所有类型均为:line。

我有客户要求按每个系列的最大值对齐系列。这与附加轴无关,以前有人这样做过吗?

4

1 回答 1

0

虽然我有兴趣在图表元素上显示它,但“工作”是在底层 DataSet 上完成的。

我能够通过循环遍历系列集合、通过 SQL 查询得出第一个系列的最大值、然后是每个后续系列,并注意差异,然后在 DataSet 级别添加或减去差异来实现这一点。

这是代码:

Private Sub cbAlignPeaks_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbAlignPeaks.CheckedChanged
    Dim dt As DataTable = chart.DataSource
    Dim Row() As Data.DataRow
    Dim s As Series = Nothing
    Dim dtr As DataTableReader = Nothing
    Dim maxTimeGet, maxTimeSet, diff As Decimal

    Me.Cursor = Cursors.WaitCursor
    If cbAlignPeaksPre.Checked Then
        For i As Integer = 0 To chartPreTim.Series.Count - 1
            s = chartPreTim.Series(i)
            If _offsets.Count = chartPreTim.Series.Count - 1 Then
                If i > 0 Then
                    diff = _offsets(s.DataFilters(0).Value)
                    Row = dt.Select("BORING_NAME = '" & s.Name & "'")
                    For k As Integer = 0 To Row.Count - 1
                        Row(k)("TIME_SEC") = Row(k)("TIME_SEC") + diff
                    Next
                End If
            Else
                If i = 0 Then 'get adjustment info
                    dtr = getDetectorMax(s.DataFilters(0).Value, cbDetectors.Text, timType.PRE) ' <-- getDetectorMax runs a SQL query returning the max value
                    If dtr.Read Then
                        maxTimeGet = dtr("TIME_SEC")
                    End If
                Else 'set adjustment info
                    dtr = Nothing
                    dtr = getDetectorMax(s.DataFilters(0).Value, cbDetectors.Text, timType.PRE)
                    If dtr.Read Then
                        maxTimeSet = dtr("TIME_SEC")
                    End If

                    If maxTimeGet > maxTimeSet Then
                        diff = maxTimeGet - maxTimeSet
                        _offsets.Add(s.DataFilters(0).Value, diff)
                        Row = dt.Select("BORING_NAME = '" & s.DataFilters(0).Value & "'")
                        For k As Integer = 0 To Row.Count - 1
                            Row(k)("TIME_SEC") = Row(k)("TIME_SEC") + diff
                        Next
                    Else
                        diff = maxTimeSet - maxTimeGet
                        _offsets.Add(s.DataFilters(0).Value, diff * -1)
                        Row = dt.Select("BORING_NAME = '" & s.DataFilters(0).Value & "'")
                        For k As Integer = 0 To Row.Count - 1
                            Row(k)("TIME_SEC") = Row(k)("TIME_SEC") - diff
                        Next
                    End If
                End If
            End If
        Next
    Else
        For i As Integer = 1 To chartPreTim.Series.Count - 1 ' We skip item 0 as that's the baseline
            s = chartPreTim.Series(i)
            diff = _offsets(s.DataFilters(0).Value)
            Row = dt.Select("BORING_NAME = '" & s.DataFilters(0).Value & "'")
            For k As Integer = 0 To Row.Count - 1
                Row(k)("TIME_SEC") = Row(k)("TIME_SEC") - diff
            Next
        Next
    End If
    chartPreTim.RefreshData()
    chartPreTim.Refresh()
    Me.Cursor = Cursors.Default
End Sub
于 2014-02-17T16:48:10.270 回答