2013-05-13 2 views
0

У меня есть функция, которую мне нужно звонить время от времени. Но каждый раз, когда я это делаю, график (круговая диаграмма) меняет размеры и становится меньше, чем ранее полученный пихарт.График изменяется и уменьшается при каждом вызове функции.

void LoadPieChart(DateTime lower, DateTime higher) 
    { 
     splitContainer1.Panel1.Controls.Remove(pieChart); 
     pieChart.Series.Clear(); 
     pieChart.Palette = ChartColorPalette.Fire; 
     pieChart.BackColor = Color.Black; 
     pieChart.Titles.Add("LOST OPPORTUNITY"); 
     pieChart.ChartAreas[0].BackColor = Color.Transparent; 
     Series series1 = new Series 
     { 
      Name = "series1", 
      IsVisibleInLegend = true, 
      Color = System.Drawing.Color.White, 
      ChartType = SeriesChartType.Pie 
     }; 

     pieChart.Series.Add(series1); 
     int num = A.CountLO(); 
     List<string>[] lista = new List<string>[7]; 
     lista = A.SelectLO(); 
     float counter_manpower = 0; 
     float counter_spares = 0; 
     float counter_tools = 0; 
     float counter_other = 0; 

     string[] reason = lista[6].ToArray(); 
     string[] low = lista[4].ToArray();    
     string[] up = lista[5].ToArray(); 
     string[] collection = new string[366]; 

     for (int j = num-LO; j < num; j++) 
     { 
      DateTime x = DateTime.Parse(low[j]); 
      DateTime y = DateTime.Parse(up[j]); 
      if (x.Date>=lower.Date && y.Date<=higher.Date) 
      { 
       if (reason[j].Equals("LACK OF MANPOWER")) 
        counter_manpower++; 
       if (reason[j].Equals("LACK OF SPARES")) 
        counter_spares++; 
       if (reason[j].Equals("LACK OF TOOLS")) 
        counter_tools++; 
       if (!reason[j].Equals("LACK OF MANPOWER") && !reason[j].Equals("LACK OF SPARES") && !reason[j].Equals("LACK OF TOOLS")) 
       { 
        counter_other++; 
       } 
      } 

     } 

     float a = ((counter_manpower/(counter_manpower+counter_spares+counter_tools+counter_other))*100); 
     float b = ((counter_spares/(counter_manpower + counter_spares + counter_tools+counter_other)) * 100); 
     float c = ((counter_tools/(counter_manpower + counter_spares + counter_tools+counter_other)) * 100); 
     float d = ((counter_other/(counter_manpower + counter_spares + counter_tools + counter_other)) * 100); 
     double aa = Math.Truncate(100 * a)/100; 
     double bb = Math.Truncate(100 * b)/100; 
     double cc = Math.Truncate(100 * c)/100; 
     double dd = Math.Truncate(100 * d)/100; 

     series1.Points.Add(counter_manpower); 
     var p1 = series1.Points[0]; 
     Math.Round(a, 1); 
     Math.Round(b, 1); 
     Math.Round(c, 1); 
     if (counter_manpower!=0) 
      p1.AxisLabel = (aa.ToString() + "%"); 
     p1.LegendText = "LACK OF MANPOWER"; 
     p1.Color = Color.Red; 

     series1.Points.Add(counter_spares); 
     p1 = series1.Points[1]; 
     if (counter_spares!=0) 
      p1.AxisLabel = (bb.ToString() + "%"); 
     p1.LegendText = "LACK OF SPARES"; 
     p1.Color = Color.Yellow; 

     series1.Points.Add(counter_tools); 
     p1 = series1.Points[2]; 
     if(counter_tools!=0) 
      p1.AxisLabel = (cc.ToString() + "%"); 
     p1.LegendText = "LACK OF TOOLS"; 
     p1.Color = Color.Orange; 


     series1.Points.Add(counter_other); 
     p1 = series1.Points[3]; 

      p1.AxisLabel = (dd.ToString() + "%"); 
     p1.LegendText = "OTHER"; 
     p1.Color = Color.Maroon; 
     //pieChart.Invalidate(); 

     splitContainer1.Panel1.Controls.Add(pieChart); 
    } 

Я не могу понять, почему, какие-либо предложения? я использую следующую функцию, чтобы инициализировать граф:

private void InitializeChart() 
    { 
     this.components = new System.ComponentModel.Container(); 
     ChartArea chartArea1 = new ChartArea(); 
     Legend legend1 = new Legend() { BackColor = Color.White, ForeColor = Color.Black, Title = "CAUSE" }; 
     pieChart = new Chart(); 
     ((ISupportInitialize)(pieChart)).BeginInit(); 
     SuspendLayout(); 

     //===Pie chart 
     chartArea1.Name = "PieChartArea"; 
     pieChart.ChartAreas.Add(chartArea1); 
     pieChart.Dock = System.Windows.Forms.DockStyle.Fill; 
     legend1.Name = "Legend1"; 
     pieChart.Legends.Add(legend1); 
     pieChart.Location = new System.Drawing.Point(0, 50); 

     //====Bar Chart 


     AutoScaleDimensions = new System.Drawing.Size(284,262); 
     AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
     //this.ClientSize = new System.Drawing.Size(284, 262);   
     this.Load += new EventHandler(Form1_Load); 
     ((ISupportInitialize)(this.pieChart)).EndInit(); 

     this.ResumeLayout(false); 

    } 

ответ

0

я не уверен, где pieChart определен ... личное поле ?? Если да, то попробуйте создать новый PieChart после удаления предыдущего из контейнера:

splitContainer1.Panel1.Controls.Remove(pieChart); 
pieChart = new PieChart(); 
pieChart.Series.Clear(); 

Я угадывание где-то в коде, накапливает значение вместо назначения, поэтому она становится все меньше как вы вызываете функцию на том же PieChart. Очистка pieChart должна устранить эту проблему.

Смежные вопросы