windowsforms-5379-controls-and-libraries-chart-control-examples-end-user-interaction-how-to-provide-interactive-editing-for-a-constant-line.md
The following example illustrates use of XYDiagram2D.PointToDiagram method for dragging the constant line with the mouse, and changing the series point values accordingly.
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;
}
}
}
}
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
How to: Add a Constant Line to an Axis