Как получить пользовательские значения X в областях диаграммы при использовании мыши на графике - PullRequest
0 голосов
/ 28 декабря 2018

Я делаю диаграмму для отчетов, и моя проблема в том, как я могу получить значения x (пользовательские значения областей диаграммы) моего графика, когда наведу указатель мыши на диаграмму (аннотация)?

Iуже делал это в течение последних 2 дней, и я до сих пор не понимаю, как я должен получить значения х графика.Я попытался использовать коды, относящиеся к диаграммам, но все равно не получил желаемого результата

Private Sub cmdGenChart_Click(sender As Object, e As EventArgs) Handles cmdGenChart.Click
    Access.AddParam("@dt1", DateTimePicker1.Value.AddDays(-1).ToString)
    Access.AddParam("@dt2", DateTimePicker2.Value.ToString)

    Access.ExecQuery("SELECT [Flood_ID], [Flood_Level], [Flood_Time], [Flood_Date] " & _
                     "FROM WaterLevel " & _
                     "WHERE [Flood_Date] BETWEEN @dt1 AND @dt2 " & _
                     "ORDER BY [Flood_ID] ASC")

    Dim checkDate As DateTime = DateTimePicker1.Value

    For Each r As DataRow In Access.dt.Rows

        Chart1.ChartAreas(0).AxisX.CustomLabels.Add(Counter - 1, Counter + 1, r("Flood_Time"))

        Chart1.Series("Water Level").Points.AddXY(Counter, r("Flood_Level"))

        Counter += 1
    Next

    Dim PC As New CalloutAnnotation

    With PC
        Chart1.Annotations.Add(PC)
    End With
End Sub

Private Sub Chart1_MouseMove(sender As Object, e As MouseEventArgs) Handles Chart1.MouseMove

    Dim result As HitTestResult = Chart1.HitTest(e.X, e.Y)

    If result.ChartElementType = ChartElementType.DataPoint Then
        Chart1.Series(0).Points(result.PointIndex).XValue.ToString()

        Dim thisPt As New PointF(CSng(Chart1.Series(0).Points(result.PointIndex).XValue),
                               CSng(Chart1.Series(0).Points(result.PointIndex).YValues(0)))

        Dim ta As New CalloutAnnotation

        With ta
            .AnchorDataPoint = Chart1.Series(0).Points(result.PointIndex)
            .Text = "Water Level: " & thisPt.Y.ToString & vbCrLf & "Time: " & DateTime.FromOADate(thisPt.X).ToShortTimeString

            If thisPt.Y.ToString <= 20 And thisPt.Y Then
                .ForeColor = Color.Green
                .Font = New Font("Tahoma", 10, FontStyle.Bold)
            ElseIf thisPt.Y.ToString <= 60 Then
                .ForeColor = Color.Orange
                .Font = New Font("Tahoma", 10, FontStyle.Bold)
            ElseIf thisPt.Y.ToString > 60 Then
                .ForeColor = Color.Red
                .Font = New Font("Tahoma", 10, FontStyle.Bold)
            End If

        End With

        Chart1.Annotations(0) = ta
        Chart1.Invalidate()
    End If
End Sub

Я хочу, чтобы значение Time было равно значению соответствующего значения x ниже него.

На изображении:
Уровень воды: 15
Время: 12:00

Желаемый результат:
Уровень воды: 15
Время: 6:21

http://prntscr.com/m0p4xb

1 Ответ

0 голосов
/ 04 января 2019

После долгих раздумий решение, которое я нашел, состоит в том, чтобы установить мой счетчик равным значению моих первичных ключей в базе данных и установить, что он будет связан с диаграммой, тогда я буду загружать его только в свой SQLКоманды и это сделали свое дело.

Глобальная переменная

    Dim counter as Double = 1

Кнопка создания диаграммы

Private Sub cmdGenChart_Click(sender As Object, e As EventArgs) Handles cmdGenChart.Click
    Access.AddParam("@dt1", DateTimePicker1.Value.AddDays(-1).ToString)
    Access.AddParam("@dt2", DateTimePicker2.Value.ToString)


    Access.ExecQuery("SELECT [Flood_ID], [Flood_Level], [Flood_Time], [Flood_Date] " & _
                     "FROM WaterLevel " & _
                     "WHERE [Flood_Date] BETWEEN @dt1 AND @dt2 " & _
                     "ORDER BY [Flood_ID] ASC")

    For Each r As DataRow In Access.dt.Rows

        Counter = r("Flood_ID")

        Chart1.ChartAreas(0).AxisX.CustomLabels.Add(Counter - 1, Counter + 1, r("Flood_Time"))

        Chart1.Series("Water Level").Points.AddXY(Counter, r("Flood_Level"))

        Counter += 1
    Next

    Dim PC As New CalloutAnnotation

    With PC
        Chart1.Annotations.Add(PC)
    End With

End Sub

Перемещение мыши диаграммы

Private Sub Chart1_MouseMove(sender As Object, e As MouseEventArgs) Handles Chart1.MouseMove

    Dim result As HitTestResult = Chart1.HitTest(e.X, e.Y)

    If result.ChartElementType = ChartElementType.DataPoint Then
        Chart1.Series(0).Points(result.PointIndex).XValue.ToString()

        Access.AddParam("@pos", Chart1.Series(0).Points(result.PointIndex).XValue)
        Access.AddParam("@level", Chart1.Series(0).Points(result.PointIndex).YValues(0))

        Access.ExecQuery("SELECT [Flood_ID], [Flood_Level], [Flood_Time] " & _
                         "FROM WaterLevel " & _
                         "WHERE [Flood_ID] = @pos AND [Flood_Level] = @level ")

        Dim r As DataRow = Access.dt.Rows(0)

        Dim ta As New CalloutAnnotation

        With ta
            .AnchorDataPoint = Chart1.Series(0).Points(result.PointIndex)
            .Text = "Water Level: " & r("Flood_Level") & vbCrLf & "Time: " & r("Flood_Time")

        End With

        Chart1.Annotations(0) = ta
        Chart1.Invalidate()
    End If
End Sub

Это результат: http://prntscr.com/m2xpnf

...