c# - ejemplos - agregar etiquetas de datos grafico excel 2016
Seleccionar valores especĂficos en un gráfico (1)
Estoy tratando de crear una especie de función de copiar y pegar con los datos en mi gráfico y me preguntaba si había alguna forma de obtener la posición x de un punto en el gráfico cuando se hace clic en él.
Básicamente, la idea es poder hacer clic en una parte del gráfico y arrastrar para seleccionar un área, que luego procesaré en consecuencia.
Entonces, debo ser capaz de averiguar en qué parte del gráfico ha hecho clic el usuario para determinar cuál será el primer punto del área seleccionada.
Miré a través de la API de gráfico, pero no pude encontrar nada útil para este tipo de problema ..
Para hacer clic directamente en un DataPoint
puede hacer un HitTest
. Pero para pequeños puntos o para una selección de un rango, esto no funcionará bien.
Las funciones necesarias están ocultas en los métodos de Axes
.
Esta solución usa un rectángulo de banda de goma regular para seleccionar los puntos atrapados:
Point mdown = Point.Empty;
List<DataPoint> selectedPoints = null;
private void chart1_MouseDown(object sender, MouseEventArgs e)
{
mdown = e.Location;
selectedPoints = new List<DataPoint>();
}
private void chart1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
chart1.Refresh();
using (Graphics g = chart1.CreateGraphics())
g.DrawRectangle(Pens.Red, GetRectangle(mdown, e.Location));
}
}
private void chart1_MouseUp(object sender, MouseEventArgs e)
{
Axis ax = chart1.ChartAreas[0].AxisX;
Axis ay = chart1.ChartAreas[0].AxisY;
Rectangle rect = GetRectangle(mdown, e.Location);
foreach (DataPoint dp in chart1.Series[0].Points)
{
int x = (int)ax.ValueToPixelPosition(dp.XValue);
int y = (int)ay.ValueToPixelPosition(dp.YValues[0]);
if (rect.Contains(new Point(x,y))) selectedPoints.Add(dp);
}
// optionally color the found datapoints:
foreach (DataPoint dp in chart1.Series[0].Points)
dp.Color = selectedPoints.Contains(dp) ? Color.Red : Color.Black;
}
static public Rectangle GetRectangle(Point p1, Point p2)
{
return new Rectangle(Math.Min(p1.X, p2.X), Math.Min(p1.Y, p2.Y),
Math.Abs(p1.X - p2.X), Math.Abs(p1.Y - p2.Y));
}
Tenga en cuenta que esto funcionará para los Line, FastLine and Point
. Para otros tipos, debería adaptar el criterio de selección.