在DevExpress XtraCharts中按值对齐系列

时间:2014-02-09 00:10:19

标签: devexpress-windows-ui

我有一个带有几个系列的DevExpress XtraChart对象,所有类型都是:line。

我要求客户将系列与每个系列的最大值对齐。这不考虑附加的轴,有没有人这样做过?

1 个答案:

答案 0 :(得分:0)

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

我能够通过循环遍历系列集合,通过SQL查询获得第一个系列的最大值,然后通过每个后续系列,并注意差异,然后添加或减去差异来实现此目的。数据集级别。

以下是代码:

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