2017-03-19 3 views
0

J'ai besoin de créer un simulateur d'oscilloscope en utilisant le contrôle ms-chart. Je stocke mes données dans un tableau. Mais je ne sais pas comment créer "l'effet de déplacement" - mise à jour continue du contrôle. (ajouter/supprimer des points du contrôle de graphique) et avoir une ligne verticale dessinée chaque seconde sur le contrôle.Simulateur d'oscilloscope C# (avec contrôle MS Chart)

Mon code est:

private void Form1_Load(object sender, EventArgs e) 
    { 

     chart1.Series["Series1"].ChartType = SeriesChartType.Line; 
     chart1.Series["Series1"].BorderWidth = 3; 

     // NO grids 
     chart1.ChartAreas[0].AxisX.MajorGrid.LineWidth = 0; 
     chart1.ChartAreas[0].AxisY.MajorGrid.LineWidth = 0; 

     chart1.PostPaint += new EventHandler<ChartPaintEventArgs>(chart1_PostPaint); 
    } 

    void chart1_PostPaint(object sender, ChartPaintEventArgs e) 
    { 

    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     string fileContent = File.ReadAllText("e:\\in.txt"); 
     string[] integerStrings = fileContent.Split(new char[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); 
     int[] integers = new int[integerStrings.Length]; 

     for (int n = 0; n < integerStrings.Length; n++) 
     { 
      integers[n] = int.Parse(integerStrings[n]); 
      chart1.Series["Series1"].Points.Add(integers[n]); 
     } 

    } 
+0

Tout ce que vous devez faire est de retirer des points de données dès le début, tout en ajoutant de nouvelles ..: 'si (chart1.Series ["Series1"]. Points.Count> nombre) chart1.Series ["Series1"]. Points.RemoveAt (0); ' – TaW

+0

Merci pour la réponse. J'ai un jeu de données fictif de 1200 valeurs. Et le mandrin que je montre, je l'ai mis à 100. J'ai intégré ton idée comme ça mais ça ne me donne pas "effet de défilement". Ai-je besoin de retarder? Qu'est-ce qui me manque ici? pour (int n = 0; n 100) chart1.Series ["Series1"]. Points.RemoveAt (0); chart1.Series ["Series1"]. Points.Add (entiers [n]); } – Fiara

+1

Oui pour les animations utilisez un minuteur! Voir la réponse de @ jstreet! – TaW

Répondre

2

Essayez ceci:

enter image description here

public partial class Form1 : Form 
{ 
    Timer timer; 
    double x; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     timer = new Timer(); 
     timer.Tick += Timer_Tick; 
     timer.Interval = 50; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (timer.Enabled) 
      timer.Stop(); 
     else timer.Start(); 
    } 

    private void Timer_Tick(object sender, EventArgs e) 
    { 
     chart1.Series[0].Points.AddXY(x, 3 * Math.Sin(5 * x) + 5 * Math.Cos(3 * x)); 

     if (chart1.Series[0].Points.Count > 100) 
      chart1.Series[0].Points.RemoveAt(0); 

     chart1.ChartAreas[0].AxisX.Minimum = chart1.Series[0].Points[0].XValue; 
     chart1.ChartAreas[0].AxisX.Maximum = x; 

     x += 0.1; 
    } 
}