2011-08-17 43 views
0

更新:從我看到的,這與日期本身沒有多大關係。這只是一個在圖表上有一個長條的情況,當重點關注它的一小段時間(日期/時間,短值範圍等)時,它會停止對該條進行着色。仍然不知道爲什麼或如何解決它,而不是視而不見。C#WinForms MSChart(StackedBar - 甘特圖)Y軸日期限制

我一直在試圖解決一個涉及堆棧圖和日期限制的奇怪的小錯誤。假設您將Y軸設置爲日期,X軸爲項目,並且您將這些柱用作項目完成,項目截止日期和項目逾期。

現在,如果您將Y軸上顯示的最小和最大日期設置爲相隔幾天,則預計在上個月的項目中,您會看到問題。酒吧失去了它的顏色,但如果你增加最小和最大之間的差距,那麼問題就會消失。

下面是代碼的涉及到SNIPPIT:

private void _Gantt_Load(object sender, EventArgs e) 
    { 
     chart1.MouseUp      += new MouseEventHandler(MouseHandler); 

     _dtpGraphStart.ValueChanged   += new EventHandler(DateTimeHandler); 
     _dtpGraphEnd.ValueChanged   += new EventHandler(DateTimeHandler); 

     string pOneName = "Project 1"; 
     string pTwoName = "Project 2"; 
     DateTime pOneStart = new DateTime(2011, 01, 01, 0, 0, 0); 
     DateTime pTwoStart = new DateTime(2011, 02, 01, 12, 0, 0); 
     DateTime pOneEnd = new DateTime(2011, 01, 01, 15, 0, 0); 
     DateTime pTwoEnd = new DateTime(2011, 07, 01, 7, 0, 0); 
     double pOneTotal = (pOneEnd - pOneStart).TotalDays; 
     double pTwoTotal = (pTwoEnd - pTwoStart).TotalDays; 
     double pOnePercent = 75; 
     double pTwoPercent = 50; 
     double pOneComplete = (pOnePercent/100.0f) * pOneTotal; 
     double pTwoComplete = (pTwoPercent/100.0f) * pTwoTotal; 

     chart1.Series["StartSeries"].Points.AddXY(pOneName, pOneStart); 
     chart1.Series["StartSeries"].Points.AddXY(pTwoName, pTwoStart); 
     chart1.Series["ProjectDurationSeries"].Points.AddXY(pOneName, pOneComplete); 
     chart1.Series["ProjectDurationSeries"].Points.AddXY(pTwoName, pTwoComplete); 
     chart1.Series["ProjectDurationSeries"].Points[0].Tag = "TestOne"; 
     chart1.Series["ProjectDurationSeries"].Points[1].Tag = "TestTwo"; 
     chart1.Series["ProjectRemainingSeries"].Points.AddXY(pOneName, pOneTotal - pOneComplete); 
     chart1.Series["ProjectRemainingSeries"].Points.AddXY(pTwoName, pTwoTotal - pTwoComplete); 
     chart1.Series["ProjectRemainingSeries"].Points[0].Tag = "TestCompleteOne"; 
     chart1.Series["ProjectRemainingSeries"].Points[1].Tag = "TestCompleteTwo"; 
     chart1.ChartAreas[0].AxisY.Minimum = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 0, 0, 0).ToOADate(); 
     chart1.ChartAreas[0].AxisY.Maximum = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 23, 59, 59).ToOADate(); 
     chart1.DataBind(); 

     _dtpGraphEnd.MinDate = _dtpGraphStart.Value; 
     _dtpGraphStart.MaxDate = _dtpGraphEnd.Value; 
    } 

    private void DateTimeHandler(object sender, EventArgs e) 
    { 
     DateTimePicker dtp = (DateTimePicker)sender; 

     switch (dtp.Name) 
     { 
      case "_dtpGraphStart": 
       chart1.ChartAreas[0].AxisY.Minimum = new DateTime(dtp.Value.Year, dtp.Value.Month, dtp.Value.Day, 0, 0, 0).ToOADate(); 
       _dtpGraphEnd.MinDate = dtp.Value; 
       break; 
      case "_dtpGraphEnd": 
       chart1.ChartAreas[0].AxisY.Maximum = new DateTime(dtp.Value.Year, dtp.Value.Month, dtp.Value.Day, 23, 59, 59).ToOADate(); 
       _dtpGraphStart.MaxDate = dtp.Value; 
       break; 
     } 

     if ((chart1.ChartAreas[0].AxisY.Maximum - chart1.ChartAreas[0].AxisY.Minimum) < 3) 
      chart1.ChartAreas[0].AxisY.LabelStyle.Format = "T"; 
     if (((chart1.ChartAreas[0].AxisY.Maximum - chart1.ChartAreas[0].AxisY.Minimum) > 3) 
      && ((chart1.ChartAreas[0].AxisY.Maximum - chart1.ChartAreas[0].AxisY.Minimum) < 30)) 
      chart1.ChartAreas[0].AxisY.LabelStyle.Format = "dd/MM"; 
     if ((chart1.ChartAreas[0].AxisY.Maximum - chart1.ChartAreas[0].AxisY.Minimum) > 30) 
      chart1.ChartAreas[0].AxisY.LabelStyle.Format = "MM/yyyy"; 
    } 

上面具有項目從01/01/2011 00:00:00跨越到01/01/2011 15:00:00,和01/02/2011 12:00:00至01/07/2011 07:00:00。

最初的日期限制是在今天的日期,無特殊原因。

繼承人圖像顯示問題。除了次要屬性更改之外,其他代碼與此圖表顯示的內容沒有任何關係,但爲了徹底起見,我將在設計器文件中添加下面的內容。

 chartArea1.AxisX.MajorGrid.Enabled = false; 
     chartArea1.AxisY.InterlacedColor = System.Drawing.Color.Lime; 
     chartArea1.AxisY.LabelStyle.Format = "T"; 
     chartArea1.AxisY.MajorGrid.Enabled = false; 
     chartArea1.Name = "ChartArea1"; 
     this.chart1.ChartAreas.Add(chartArea1); 
     this.chart1.Location = new System.Drawing.Point(0, 0); 
     this.chart1.Name = "chart1"; 
     series1.ChartArea = "ChartArea1"; 
     series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.StackedBar; 
     series1.Color = System.Drawing.Color.White; 
     series1.Name = "StartSeries"; 
     series2.BorderColor = System.Drawing.Color.Black; 
     series2.BorderWidth = 2; 
     series2.ChartArea = "ChartArea1"; 
     series2.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.StackedBar; 
     series2.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(192)))), ((int)(((byte)(0))))); 
     series2.EmptyPointStyle.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(192)))), ((int)(((byte)(0))))); 
     series2.Name = "ProjectDurationSeries"; 
     series3.BackHatchStyle = System.Windows.Forms.DataVisualization.Charting.ChartHatchStyle.ForwardDiagonal; 
     series3.BackSecondaryColor = System.Drawing.Color.White; 
     series3.BorderColor = System.Drawing.Color.Black; 
     series3.BorderWidth = 2; 
     series3.ChartArea = "ChartArea1"; 
     series3.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.StackedBar; 
     series3.Color = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(128)))), ((int)(((byte)(255))))); 
     series3.Name = "ProjectRemainingSeries"; 
     series4.BackHatchStyle = System.Windows.Forms.DataVisualization.Charting.ChartHatchStyle.ForwardDiagonal; 
     series4.BorderColor = System.Drawing.Color.Black; 
     series4.BorderWidth = 2; 
     series4.ChartArea = "ChartArea1"; 
     series4.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.StackedBar; 
     series4.Color = System.Drawing.Color.Red; 
     series4.Name = "Series4"; 
     this.chart1.Series.Add(series1); 
     this.chart1.Series.Add(series2); 
     this.chart1.Series.Add(series3); 
     this.chart1.Series.Add(series4); 
     this.chart1.Size = new System.Drawing.Size(727, 339); 
     this.chart1.TabIndex = 0; 
     this.chart1.Text = "chart1"; 

這裏有一個圖像顯示問題:http://i55.tinypic.com/27zkv0w.jpg

回答

0
chartArea1.AxisX.MajorGrid.Enabled = false; 
chartArea1.AxisY.InterlacedColor = System.Drawing.Color.Lime; 
chartArea1.AxisY.LabelStyle.Format = "T"; 
chartArea1.AxisY.MajorGrid.Enabled = false; 
chartArea1.Name = "ChartArea1"; 
this.chart1.ChartAreas.Add(chartArea1); 
this.chart1.Location = new System.Drawing.Point(0, 0); 
this.chart1.Name = "chart1"; 
series1.ChartArea = "ChartArea1"; 
series1.ChartType = 
System.Windows.Forms.DataVisualization.Charting.SeriesChartType.StackedBar; 
series1.Color = System.Drawing.Color.White; 
series1.Name = "StartSeries"; 
series2.BorderColor = System.Drawing.Color.Black; 
series2.BorderWidth = 2; 
series2.ChartArea = "ChartArea1"; 
series2.ChartType = 
System.Windows.Forms.DataVisualization.Charting.SeriesChartType.StackedBar; 
series2.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte) 
(192)))), ((int)(((byte)(0))))); 
series2.EmptyPointStyle.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), 
((int)(((byte)(192)))), ((int)(((byte)(0))))); 
series2.Name = "ProjectDurationSeries"; 
series3.BackHatchStyle = 
System.Windows.Forms.DataVisualization.Charting.ChartHatchStyle.ForwardDiagonal; 
series3.BackSecondaryColor = System.Drawing.Color.White; 
series3.BorderColor = System.Drawing.Color.Black; 
series3.BorderWidth = 2; 
series3.ChartArea = "ChartArea1"; 
series3.ChartType = 
System.Windows.Forms.DataVisualization.Charting.SeriesChartType.StackedBar; 
series3.Color = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int) 
(((byte)(128)))), ((int)(((byte)(255))))); 
series3.Name = "ProjectRemainingSeries"; 
series4.BackHatchStyle = 
System.Windows.Forms.DataVisualization.Charting.ChartHatchStyle.ForwardDiagonal; 
series4.BorderColor = System.Drawing.Color.Black; 
series4.BorderWidth = 2; 
series4.ChartArea = "ChartArea1"; 
series4.ChartType = 
System.Windows.Forms.DataVisualization.Charting.SeriesChartType.StackedBar; 
series4.Color = System.Drawing.Color.Red; 
series4.Name = "Series4"; 
this.chart1.Series.Add(series1); 
this.chart1.Series.Add(series2); 
this.chart1.Series.Add(series3); 
this.chart1.Series.Add(series4); 
this.chart1.Size = new System.Drawing.Size(727, 339); 
this.chart1.TabIndex = 0; 
this.chart1.Text = "chart1"; 
+1

你能提供一些解釋? – 2012-09-25 02:00:37