Bonjour,

J'ai posé cette question sur le forum Windows Form mais je n'ai pas de réponse, alors je tente ma chance sur le forum C# qui, je pense, est plus adapté

J'affiche 2 graphiques, l'un grâce à un Chart, l'autre "manuellement" en dessinant dans un panel.
Or je dois aligner les axes X des deux graphiques.
Il faut donc que je connaisse les coordonnées de l'axe des X du Chart pour dessiner le second graphique.
Les coordonnées du chart ne sont accessibles que dans l'évènement _Paint :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
chartAreaXAxis.X = (int)neutronsChart.AxisX.ValueToPixelPosition(neutronsChart.AxisX.Minimum);
Malheureusement, l'évènement est appelé trop tard et donc les dimensions du graphique sont mesurées trop tard. Comment obtenir ces données à temps, en d'autres termes, comment forcer l'exécution de la fonction avant de dessiner le deuxième graphique ?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        private void Experiment_Load(object sender, EventArgs e)
        {   
            reactor = new Reactor(criticalityVariations, precursors);
            UpdateDataGridViewPrecursors(precursors);
            chartPopulation.Paint += new PaintEventHandler(this.chartPopulation_Paint);
            Display(); // je dessine ici mon premier graphique
            criticalityPanel1.LoadCriticality(criticalityVariations, chartAreaXAxis); //je dessine ici mon deuxième graphique
                                                                                                          //en espérant avoir récupéré les dimensions du premier graphique ...
            criticalityPanel1.OnCriticalityChange += criticalityPanel1_OnCriticalityChange;
       }
 
        void chartPopulation_Paint(object sender, PaintEventArgs e) // je mesure ici les dimensions de mon premier graphique
                      //comment forcer l'exécution de cette fonction ?
        {
            ChartArea neutronsChart = chartPopulation.ChartAreas[0];
            chartAreaXAxis.X = (int)neutronsChart.AxisX.ValueToPixelPosition(neutronsChart.AxisX.Minimum);
            chartAreaXAxis.Y = (int)neutronsChart.AxisX.ValueToPixelPosition(neutronsChart.AxisX.Maximum);
 
        }
        private void Display() //J'affiche mon premier graphique
        {
            foreach (DataPoint dp in reactor.populationAtEveryStep)
                chartPopulation.Series[0].Points.Add(dp);
        }
J'ai fait plusieurs tentatives, toutes infructueuses :

- appeler la fonction en créant un PaintEventArgs
- appeler chartPopulation.Invalidate();
- appeler splitContainer3.panel2.Refresh(); qui contient la chartPopulation
- appeler la méthode refresh de la form : this.refresh();

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void Experiment_Load(object sender, EventArgs e)
        {   
            reactor = new Reactor(criticalityVariations, precursors);
            UpdateDataGridViewPrecursors(precursors);
            chartPopulation.Paint += new PaintEventHandler(this.chartPopulation_Paint);
            Display();
 
            //Graphics g = chartPopulation.CreateGraphics();
            //Rectangle r = new Rectangle();
            //PaintEventArgs ev = new PaintEventArgs(g,r);
            //chartPopulation_Paint(this,ev);
 
            //chartPopulation.Invalidate();
            splitContainer3.Panel2.Refresh();
            this.Refresh();
            criticalityPanel1.LoadCriticality(criticalityVariations, chartAreaXAxis);
            criticalityPanel1.OnCriticalityChange += criticalityPanel1_OnCriticalityChange;
       }
Merci d'avance