Back to Devexpress

How to: Provide Interactive Editing for a Constant Line

windowsforms-5379-controls-and-libraries-chart-control-examples-end-user-interaction-how-to-provide-interactive-editing-for-a-constant-line.md

latest7.1 KB
Original Source

How to: Provide Interactive Editing for a Constant Line

  • Nov 13, 2018
  • 3 minutes to read

The following example illustrates use of XYDiagram2D.PointToDiagram method for dragging the constant line with the mouse, and changing the series point values accordingly.

csharp
using System;
using System.Windows.Forms;
using DevExpress.XtraCharts;

namespace InteractiveConstantLine {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        Cursor defCursor;
        bool dragging = false;
        ChartControl chart;
        XYDiagram diagram;
        ConstantLine line;

        private void Form1_Load(object sender, EventArgs e) {
            this.chart = this.chartControl1;
            this.diagram = this.chart.Diagram as XYDiagram;
            this.line = this.diagram.AxisX.ConstantLines.GetConstantLineByName("ConstantLine1");

            // Add a title to the chart.
            ChartTitle chartTitle1 = new ChartTitle();
            chartTitle1.Text = "Drag the constant line...";
            this.chart.Titles.Add(chartTitle1);

        }

        private void chartControl1_MouseDown(object sender, MouseEventArgs e) {
            if (diagram == null)
                return;

            // Get the information about the clicked point.
            DiagramCoordinates coords = diagram.PointToDiagram(e.Location);

            // If the point is within the diagram and in the constant line ...
            if (!coords.IsEmpty && line.AxisValue is DateTime &&
                coords.DateTimeArgument.Equals((DateTime)line.AxisValue)) {

                // Allows the drag operation.
                dragging = true;
                chart.Capture = true;
                SetCursor();
            }
        }

        private void chartControl1_MouseUp(object sender, MouseEventArgs e) {
            dragging = false;
            chart.Capture = false;
        }

        private void chartControl1_MouseMove(object sender, MouseEventArgs e) {
            if (diagram == null)
                return;

            if (dragging && (e.Button & MouseButtons.Left) == 0) {
                dragging = false;
                chart.Capture = false;
            }

            DiagramCoordinates coords = diagram.PointToDiagram(e.Location);
            if (coords.IsEmpty)
                RestoreCursor();
            else {
                if (dragging)
                    line.AxisValue = coords.DateTimeArgument;

                if (line.AxisValue is DateTime && coords.DateTimeArgument.Equals((DateTime)line.AxisValue))
                    SetCursor();
                else
                    RestoreCursor();
            }
        }
        void SetCursor() {
            if (defCursor == null)
                defCursor = Cursor.Current;
            Cursor.Current = Cursors.VSplit;
        }

        void RestoreCursor() {
            if (defCursor != null) {
                Cursor.Current = defCursor;
                defCursor = null;
            }
        }

    }
}
vb
Imports System
Imports System.Windows.Forms
Imports DevExpress.XtraCharts

Namespace InteractiveConstantLine
    Partial Public Class Form1
        Inherits Form

        Public Sub New()
            InitializeComponent()
        End Sub

        Private defCursor As Cursor
        Private dragging As Boolean = False
        Private chart As ChartControl
        Private diagram As XYDiagram
        Private line As ConstantLine

        Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
            Me.chart = Me.chartControl1
            Me.diagram = TryCast(Me.chart.Diagram, XYDiagram)
            Me.line = Me.diagram.AxisX.ConstantLines.GetConstantLineByName("ConstantLine1")

            ' Add a title to the chart.
            Dim chartTitle1 As New ChartTitle()
            chartTitle1.Text = "Drag the constant line..."
            Me.chart.Titles.Add(chartTitle1)

        End Sub

        Private Sub chartControl1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles chartControl1.MouseDown
            If diagram Is Nothing Then
                Return
            End If

            ' Get the information about the clicked point.
            Dim coords As DiagramCoordinates = diagram.PointToDiagram(e.Location)

            ' If the point is within the diagram and in the constant line ...
            If (Not coords.IsEmpty) AndAlso TypeOf line.AxisValue Is Date AndAlso coords.DateTimeArgument.Equals(CDate(line.AxisValue)) Then

                ' Allows the drag operation.
                dragging = True
                chart.Capture = True
                SetCursor()
            End If
        End Sub

        Private Sub chartControl1_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles chartControl1.MouseUp
            dragging = False
            chart.Capture = False
        End Sub

        Private Sub chartControl1_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles chartControl1.MouseMove
            If diagram Is Nothing Then
                Return
            End If

            If dragging AndAlso (e.Button And MouseButtons.Left) = 0 Then
                dragging = False
                chart.Capture = False
            End If

            Dim coords As DiagramCoordinates = diagram.PointToDiagram(e.Location)
            If coords.IsEmpty Then
                RestoreCursor()
            Else
                If dragging Then
                    line.AxisValue = coords.DateTimeArgument
                End If

                If TypeOf line.AxisValue Is Date AndAlso coords.DateTimeArgument.Equals(CDate(line.AxisValue)) Then
                    SetCursor()
                Else
                    RestoreCursor()
                End If
            End If
        End Sub
        Private Sub SetCursor()
            If defCursor Is Nothing Then
                defCursor = Cursor.Current
            End If
            Cursor.Current = Cursors.VSplit
        End Sub

        Private Sub RestoreCursor()
            If defCursor IsNot Nothing Then
                Cursor.Current = defCursor
                defCursor = Nothing
            End If
        End Sub

    End Class
End Namespace

See Also

Constant Lines

How to: Add a Constant Line to an Axis

How to: Provide Interactive Editing for Series Points

How to: Show Series Labels Only for Hot-tracked Points