C# 如何在winforms中制作具有重叠点的gannt图表

C# 如何在winforms中制作具有重叠点的gannt图表,c#,winforms,mschart,C#,Winforms,Mschart,有一个时间间隔,如8:00-17:00。在此时间间隔内,任务会发生多次,例如9:00-9:20、11:00-12:00、13:00-13:20。我想在winforms中制作一个图表,以显示任务何时发生。我能用DEV gannt图表做这个吗?或者我可以使用任何控制来实现它吗 我想在winforms中实现这一点。使用MSChart和ChartType RangeBar非常简单 以下是一个例子: 要得到这个结果,你需要 从数据工具箱添加MSChart控件 添加using子句:using System.

有一个时间间隔,如8:00-17:00。在此时间间隔内,任务会发生多次,例如9:00-9:20、11:00-12:00、13:00-13:20。我想在winforms中制作一个图表,以显示任务何时发生。我能用DEV gannt图表做这个吗?或者我可以使用任何控制来实现它吗


我想在winforms中实现这一点。

使用MSChart和ChartType RangeBar非常简单

以下是一个例子:

要得到这个结果,你需要

从数据工具箱添加MSChart控件 添加using子句:using System.Windows.Forms.DataVisualization.Charting; 然后你可以设计图表的样式。。 …也许会设定一个尺寸限制 以下是设置它的代码:

void setUpGantt(Chart chart)
{
    chart.Series.Clear();
    Series s = chart.Series.Add("gantt");
    s.ChartType = SeriesChartType.RangeBar;
    s.YValueType = ChartValueType.DateTime;
    s.AxisLabel = "";
    s.IsVisibleInLegend = false;
    Axis ax = chart.ChartAreas[0].AxisX;
    Axis ay = chart.ChartAreas[0].AxisY;
    ax.MajorGrid.Enabled = false;
    ax.MajorTickMark.Enabled = false;
    ax.LabelStyle.Format = " ";
    ax.Enabled = AxisEnabled.False;
    ay.LabelStyle.Format = "HH:mm";
    ay.MajorGrid.Enabled = false;
    ay.MajorTickMark.Enabled = false;
    ay.LineColor = chart.BackColor;
    limitGantt(chart, "8:00", "17:00");
}

void limitGantt(Chart chart, string start, string end)
{
    Axis ax = chart.ChartAreas[0].AxisX;
    ax.Minimum = 0.5;  // we have only one slot
    ax.Maximum = 1.5;  // the bar is centered on its value (1)

    Axis ay = chart.ChartAreas[0].AxisY;
    ay.Minimum = fromTimeString(start).ToOADate();  // we exclude all times..
    ay.Maximum = fromTimeString(end).ToOADate();    // ..outside a given range
}
注意,为了方便起见,我使用了时间字符串。当然,您可以直接更改为使用DateTimes。要将时间字符串转换为当天的日期时间,使用此函数:

DateTime fromTimeString(string time)
{
    var p = time.Split(':');
    int sec = p.Length == 3 ? Convert.ToInt16(p[2]) : 0;
    TimeSpan t = new TimeSpan(Convert.ToInt16(p[0]), Convert.ToInt16(p[1]), sec);
    return DateTime.Today.Add(t);
}
请注意,所有代码都缺少任何检查

要添加任务,请使用此方法:

void addGanttTask(Series s, string start, string end, Color c, int slot )
{
    DateTime start_ = fromTimeString(start);
    DateTime end_ = fromTimeString(end);
    int pt = s.Points.AddXY(slot, start_, end_);
    s.Points[pt].Color = c;
}
请注意,它同时包含一个系列和一个“插槽”。插槽用于x值,在您的情况下,x值都是相同的。但是你可以很容易地想象一个更为复杂的规划师,他有几个酒吧来存放不同的资源,比如不同的房间或团队

Series参数允许覆盖第二个系列,如MSDN中的示例所示

下面是我如何填写图表的:

setUpGantt(chart1);

Series s = chart1.Series[0];
addGanttTask(s, "8:00", "17:00", Color.LimeGreen, 1);
addGanttTask(s, "9:00", "9:20", Color.DarkSlateBlue, 1);
addGanttTask(s, "11:00", "12:00", Color.DarkSlateBlue, 1);
addGanttTask(s, "13:00", "13:20", Color.DarkSlateBlue, 1);
请注意,不同的范围可能重叠,并且可能相互隐藏。在我们的示例中,首先添加绿色条,其他条位于顶部。在MSDN示例中,您可以看到黄色条是如何变窄以保持其下方的条可见的。它们属于第二个系列

要更改钢筋的宽度,请使用

series.SetCustomProperty("PixelPointWidth",  "15");

使用MSChart和ChartType RangeBar,这非常简单

以下是一个例子:

要得到这个结果,你需要

从数据工具箱添加MSChart控件 添加using子句:using System.Windows.Forms.DataVisualization.Charting; 然后你可以设计图表的样式。。 …也许会设定一个尺寸限制 以下是设置它的代码:

void setUpGantt(Chart chart)
{
    chart.Series.Clear();
    Series s = chart.Series.Add("gantt");
    s.ChartType = SeriesChartType.RangeBar;
    s.YValueType = ChartValueType.DateTime;
    s.AxisLabel = "";
    s.IsVisibleInLegend = false;
    Axis ax = chart.ChartAreas[0].AxisX;
    Axis ay = chart.ChartAreas[0].AxisY;
    ax.MajorGrid.Enabled = false;
    ax.MajorTickMark.Enabled = false;
    ax.LabelStyle.Format = " ";
    ax.Enabled = AxisEnabled.False;
    ay.LabelStyle.Format = "HH:mm";
    ay.MajorGrid.Enabled = false;
    ay.MajorTickMark.Enabled = false;
    ay.LineColor = chart.BackColor;
    limitGantt(chart, "8:00", "17:00");
}

void limitGantt(Chart chart, string start, string end)
{
    Axis ax = chart.ChartAreas[0].AxisX;
    ax.Minimum = 0.5;  // we have only one slot
    ax.Maximum = 1.5;  // the bar is centered on its value (1)

    Axis ay = chart.ChartAreas[0].AxisY;
    ay.Minimum = fromTimeString(start).ToOADate();  // we exclude all times..
    ay.Maximum = fromTimeString(end).ToOADate();    // ..outside a given range
}
注意,为了方便起见,我使用了时间字符串。当然,您可以直接更改为使用DateTimes。要将时间字符串转换为当天的日期时间,使用此函数:

DateTime fromTimeString(string time)
{
    var p = time.Split(':');
    int sec = p.Length == 3 ? Convert.ToInt16(p[2]) : 0;
    TimeSpan t = new TimeSpan(Convert.ToInt16(p[0]), Convert.ToInt16(p[1]), sec);
    return DateTime.Today.Add(t);
}
请注意,所有代码都缺少任何检查

要添加任务,请使用此方法:

void addGanttTask(Series s, string start, string end, Color c, int slot )
{
    DateTime start_ = fromTimeString(start);
    DateTime end_ = fromTimeString(end);
    int pt = s.Points.AddXY(slot, start_, end_);
    s.Points[pt].Color = c;
}
请注意,它同时包含一个系列和一个“插槽”。插槽用于x值,在您的情况下,x值都是相同的。但是你可以很容易地想象一个更为复杂的规划师,他有几个酒吧来存放不同的资源,比如不同的房间或团队

Series参数允许覆盖第二个系列,如MSDN中的示例所示

下面是我如何填写图表的:

setUpGantt(chart1);

Series s = chart1.Series[0];
addGanttTask(s, "8:00", "17:00", Color.LimeGreen, 1);
addGanttTask(s, "9:00", "9:20", Color.DarkSlateBlue, 1);
addGanttTask(s, "11:00", "12:00", Color.DarkSlateBlue, 1);
addGanttTask(s, "13:00", "13:20", Color.DarkSlateBlue, 1);
请注意,不同的范围可能重叠,并且可能相互隐藏。在我们的示例中,首先添加绿色条,其他条位于顶部。在MSDN示例中,您可以看到黄色条是如何变窄以保持其下方的条可见的。它们属于第二个系列

要更改钢筋的宽度,请使用

series.SetCustomProperty("PixelPointWidth",  "15");

以下是DevExpress.XtraCharts.ChartControl和ViewType RangeBar的示例

首先将DevExpress.XtraCharts.chart控件添加到表单中。 下面是我如何填写表格的

        rangeBarChart.Series.Clear();

        // Create two range bar series.
        Series series1 = new Series("Task1", ViewType.RangeBar);
        Series series2 = new Series("Task2", ViewType.RangeBar);

        series1.CrosshairLabelPattern = "{S}:{V1:HH:mm}--{V2:HH:mm}";
        series2.CrosshairLabelPattern = "{S}:{V1:HH:mm}--{V2:HH:mm}";


        //Add values to series
        series1.ValueScaleType = ScaleType.DateTime;
        series2.ValueScaleType = ScaleType.DateTime;
        series1.Points.Add(new SeriesPoint("A", Convert.ToDateTime("2019-08-24 8:00"), Convert.ToDateTime("2019-08-24 17:00")));
        series2.Points.Add(new SeriesPoint("A", Convert.ToDateTime("2019-08-24 9:00"), Convert.ToDateTime("2019-08-24 10:00")));
        series2.Points.Add(new SeriesPoint("A", Convert.ToDateTime("2019-08-24 13:00"), Convert.ToDateTime("2019-08-24 14:00")));

        // Add both series to the chart.
        rangeBarChart.Series.AddRange(new Series[] { series1, series2 });

        ((XYDiagram)rangeBarChart.Diagram).Rotated = true;
结果如下:

这里是一个使用DevExpress.XtraCharts.ChartControl和ViewType RangeBar的示例

首先将DevExpress.XtraCharts.chart控件添加到表单中。 下面是我如何填写表格的

        rangeBarChart.Series.Clear();

        // Create two range bar series.
        Series series1 = new Series("Task1", ViewType.RangeBar);
        Series series2 = new Series("Task2", ViewType.RangeBar);

        series1.CrosshairLabelPattern = "{S}:{V1:HH:mm}--{V2:HH:mm}";
        series2.CrosshairLabelPattern = "{S}:{V1:HH:mm}--{V2:HH:mm}";


        //Add values to series
        series1.ValueScaleType = ScaleType.DateTime;
        series2.ValueScaleType = ScaleType.DateTime;
        series1.Points.Add(new SeriesPoint("A", Convert.ToDateTime("2019-08-24 8:00"), Convert.ToDateTime("2019-08-24 17:00")));
        series2.Points.Add(new SeriesPoint("A", Convert.ToDateTime("2019-08-24 9:00"), Convert.ToDateTime("2019-08-24 10:00")));
        series2.Points.Add(new SeriesPoint("A", Convert.ToDateTime("2019-08-24 13:00"), Convert.ToDateTime("2019-08-24 14:00")));

        // Add both series to the chart.
        rangeBarChart.Series.AddRange(new Series[] { series1, series2 });

        ((XYDiagram)rangeBarChart.Diagram).Rotated = true;
结果如下:

只需用a键选择MSChart即可。非常直截了当另外:什么是发展趋势图?简单地用一个。非常直截了当还有:什么是发展趋势图??