图表无法正确读取日期时间变量c#秒

问题描述 投票:1回答:1

在一段代码下面让我陷入困境:

 private void ShowDatainChart()
    {
        Chart chart = this.chart1;
        chart.Series.Clear();
        int[] ser = { 1, 2, 3 };
        foreach (int s in ser)
        {
           chart.Series.Add(s.ToString());
           chart.Series[s - 1].XValueType = ChartValueType.Time;
           chart.Series[s - 1].YValueType = ChartValueType.Time;
           chart.Series[s - 1].ChartType = SeriesChartType.RangeBar;
        }
        string ser;
        foreach (DataRow row in dt.Rows)
        {
            ser = row["BAT_QUEUE"].ToString();
            chart1.ChartAreas[0].AxisY.LabelStyle.Format = "MMM:dd HH:mm:ss";
            chart.Series[ser].Points.AddXY(row["BATCH_NAME"],row["BEGIN"],row["END"]);
        }
    }

它从数据表中获取包含列的数据:BAT_QUEUE字符串,BATCH_NAME字符串和两个日期时间BEGIN和END。通常,三个队列每天开始几批,每批这样的批次需要几秒/分钟/小时。我期望的结果类似于“甘特图”,所以它可以给我一个工具来进行一些分析。据我搜索,这个任务的最佳选择是RangeBar - 遗憾的是,使用的图表类型并不常见。上面的代码完美无缺,直到我只绘制了三个系列中的一个(不会遇到哪一个)。它绘制了几个水平条,在不同的层次上以不同的名称逐个绘制。但是当选择更多系列时,许多条形码与错误的名称相关联。 看起来图表不会从BEGIN / END字段中读取秒数,因此如果来自不同队列的两个批次在相同的小时和分钟开始但不同的第二个批次将被错误地解释。

...这很难解释,但我希望你们中的一些人明白我的意思,并给我一些提示有什么不对,以及如何修复/解决我的问题

谢谢你提前帮助

好的,按照下面的Sinatr建议代码,可以显示我的问题。现在,经过一段时间的分析后,我发现问题不在于日期时间格式。它看起来更深一点。每个系列都是从第一个系列创建的同一个对象开始的 - 这是错误的。无论如何看代码。当然它需要在Windows窗体上创建图表对象

private void ShowDatainChart()
    {
        DateTime a1 = new DateTime(2014, 07, 01, 00, 03, 00);
        DateTime a2 = new DateTime(2014, 07, 01, 01, 17, 10);
        DateTime b1 = new DateTime(2014, 07, 01, 00, 02, 33);
        DateTime b2 = new DateTime(2014, 07, 01, 00, 44, 13);
        DateTime a12 = new DateTime(2014, 07, 01, 01, 18, 00);
        DateTime a22 = new DateTime(2014, 07, 01, 02, 22, 10);

        chart1.Series.Clear();
        string[] ser = { "1", "2" };
        foreach (string s in ser)
        {
            chart1.Series.Add(s);
            chart1.Series[s].ChartType = SeriesChartType.RangeBar;
            chart1.Series[s].XValueType = ChartValueType.DateTime;
            chart1.Series[s].YValueType = ChartValueType.DateTime;
        }
        chart1.Series["1"].Points.AddXY("A", a1, a2);
        chart1.Series["1"].Points.AddXY("A1", a12, a22);
        chart1.Series["2"].Points.AddXY("B", b1, b2);
    }

第一系列的批次A和A1显示正确,但第二系列的B显示为A :(

c# charts
1个回答
1
投票

您没有看到“B”X值的原因是您没有使用AddPointXY方法。

对于RangeBarXValueType不应该是ChartValueType.DateTime,而是Int32Auto

通过这些设置,X值将按预期工作,并为每个不同的值创建一个新的数据点行,按预期间隔。

RangeBar图表类型基本上视为用于任务管理的专用图表是非常有帮助的。看看example at MSDN:在这里你看到只有两个系列,即TaskProgress,但是在图表中可以看到几个任务和子任务数据点。:

所以将XValueType设置为ChartValueType.DateTime完全没有任何意义,即使你真的会在日期中输入..

注意:将其设置为ChartValueType.String也不起作用,因为字符串不会计算到X轴上的位置;相反,与ChartValueType.DateTime一样,每个系列将其点映射到已存在的行,而不会创建新标签,直到它用完行为止。只有这样它才会创建一个新行并将其标签放在其上。不建议!!

而是为每行分配一个数字,并明确指定其标签:

要添加你写的点数:

 chart1.Series["1"].Points.AddXY(1, a1, a2);
 chart1.Series["1"].Points.AddXY(2, a12, a22);
 chart1.Series["2"].Points.AddXY(3, b1, b2);

添加标签(注意:所有系列共享相同的轴/标签!):

 chart1.Series["1"].Points[0].AxisLabel = "A1";
 chart1.Series["1"].Points[1].AxisLabel = "A2";
 chart1.Series["2"].Points[2].AxisLabel = "B"; 

如果你想要系列重叠,如例子那么好,你需要设置PointWidthDrawSideBySide参数:

chart1.Series["1"]["PointWidth"] = "0.7";
chart1.Series["2"]["PointWidth"] = "0.2";
chart1.Series["2"]["DrawSideBySide"] = "false";

其中一些是从MSDN Chart Example code中拯救出来的,这是非常错误和不完整的..(即使在上面的图表中也可以看到一个小的迹象:'任务5'应该被标记为'任务3'......)

另请注意,所有条形图表都会切换x轴和y轴,因此x轴是垂直轴!

© www.soinside.com 2019 - 2024. All rights reserved.