簡體   English   中英

C# WinForms MSChart(StackedBar - 甘特圖)帶 Y 軸日期限制

[英]C# WinForms MSChart (StackedBar - Gantt Chart) With Y Axis Date Restrictions

更新:據我所知,這與日期本身無關。 這只是圖表上有一個長條的情況,當專注於它的一小段(日期/時間、短值范圍等)時,它會停止為條着色。 除了對它視而不見之外,仍然不知道為什么或如何解決它。

我一直在嘗試解決一個涉及堆疊圖表和日期限制的奇怪小錯誤。 假設您將 Y 軸設置為日期,X 軸是項目,您將條形用作項目完成、項目截止日期和項目逾期。

現在,如果您將 Y 軸上顯示的最小和最大日期設置為相隔幾天,在預計持續數月的項目中,您將看到問題。 該條失去了顏色,但如果您增加最小值和最大值之間的差距,那么問題就會消失。

以下是涉及的代碼片段:

    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

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";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM