2016-10-15 3 views
0

Ich versuche, eine Art Copy-and-Paste-Funktion mit den Daten in meinem Diagramm zu erstellen, und ich fragte mich, ob es eine Möglichkeit gab, die x-Position eines Punkts auf dem Diagramm zu erhalten ist geklickt?Auswählen bestimmter Werte in einem Diagramm

Grundsätzlich besteht die Idee darin, in der Lage zu sein, auf einen Teil des Graphen zu klicken und einen Bereich zu ziehen, den ich dann entsprechend bearbeiten werde.

Also muss ich in der Lage sein herauszufinden, wo in der Grafik der Benutzer geklickt hat, um zu bestimmen, was der erste Punkt des ausgewählten Bereichs sein wird.

ich durch die Grafik-API sah, aber ich konnte nichts nützlich für diese Art von Problem zu finden scheinen ..

+0

Textblock versuchen, es zu ändern C# -Codeblock. – mybirthname

+0

Wenn Sie mit der Antwort zufrieden sind, beachten Sie bitte [akzeptieren] (http://stackoverflow.com/help/accepted-answer) it ..! - Ich sehe, dass Sie das nie getan haben: Gehen Sie das (unsichtbare) Häkchen oben links unter die Stimmen der Antwort und klicken Sie darauf! Es wird grün und bringt uns beide einen kleinen Ruf. – TaW

Antwort

1

Für direkt Anklicken eines DataPoint können Sie eine HitTest tun. Aber für kleine Punkte oder für eine Auswahl eines Bereichs wird dies nicht gut funktionieren.

Die notwendigen Funktionen sind in den Axes Methoden versteckt.

Diese Lösung verwendet eine regelmäßige Gummiband Rechteck um die Punkte zu wählen gefangen:

enter image description here

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)); 
} 

Beachten Sie, dass dies für Line, FastLine and Point Charts arbeiten. Für andere Typen müssten Sie das Auswahlkriterium anpassen!

+0

Danke! Die ValueToPixelPosition-Funktion ist genau das, was ich gesucht habe. – user3713569

+0

Noch eine kurze Frage. Kennen Sie einfache Möglichkeiten, die Farbe der Linie zwischen den Punkten zu ändern, anstatt die Farbe der Punkte selbst zu ändern, da ich ein FastLine-Diagramm verwende? – user3713569

+0

Nicht möglich für 'FastLine'. Verwenden Sie "Line", wenn Sie diese und andere Extras möchten, dann können Sie die 'Farbe' jedes' DataPoint' einstellen. - Wenn Sie mit einer Antwort zufrieden sind, beachten Sie bitte [akzeptieren] (http://stackoverflow.com/ Hilfe/akzeptiert-Antwort) es ..! – TaW

Verwandte Themen