C# 图表无法正确读取datetime变量c中的秒数#
下面是一段让我陷入困境的代码:C# 图表无法正确读取datetime变量c中的秒数#,c#,charts,C#,Charts,下面是一段让我陷入困境的代码: 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()); cha
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"]);
}
}
它从包含以下列的datatable中获取数据:
BAT_队列字符串、批处理名称字符串和两个日期时间开始和结束。通常,三个队列每天开始几个批次,每个批次需要几秒钟/分钟/小时。
我期望的结果类似于“甘特图”,因此它可以为我提供一个进行分析的工具。
据我所知,这个任务的最佳选择是RangeBar——不幸的是,这种类型的图表并不经常使用。
在我只画了三个系列中的一个(不知道是哪一个)之前,上面的代码是完美的。它在不同的级别上以不同的名称逐个绘制多个水平条。但当选择更多系列时,许多条连接的名称错误。图表似乎不从开始/结束字段读取秒数,因此,如果来自不同队列的两个批次在相同的小时和分钟但不同的秒数开始,它们将被错误地解释 。。。这很难解释,但我希望你们中的一些人理解我的意思,并给我一些提示什么是错误的,以及如何修复/解决我的问题 提前谢谢你的帮助 好的,下面是代码下面的Sinatr建议,可以显示我的问题。现在,经过一段时间的分析,我发现问题不在于datetime格式。看起来是更深层次的。 每个系列都从第一个系列创建的同一个对象开始,这是错误的。无论如何,看看代码。当然,它需要在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:(您没有看到“B”X值的原因是您没有正确使用AddPointXY方法 对于
RangeBar
,XValueType
不应为ChartValueType.DateTime
,而应为Int32
或Auto
通过这些设置,X值将按预期工作,并为每个不同的值创建一行新的数据点,间距按预期
将范围栏
图表类型基本上看作是一个专门用于任务管理的图表是非常有帮助的。请看:在这里,您可以看到只有两个系列,即任务
和进度
,但图表中有几个任务和子任务数据点可见:
因此,将XValueType
设置为ChartValueType.DateTime
毫无意义,即使您实际上要输入日期
注意:将其设置为ChartValueType.String
也不起作用,因为字符串不会计算到X轴上的某个位置;相反,与ChartValueType.DateTime
一样,每个系列都会将其点映射到已经存在的行上,而不会创建新标签,直到行用完为止。只有这样,它才会创建新的ro并在其上贴上标签。不推荐
而是为每行指定一个数字,并显式指定其标签:
要添加您编写的点,请执行以下操作:
chart1.Series["1"].Points.AddXY(1, a1, a2);
chart1.Series["1"].Points.AddXY(2, a12, a22);
chart1.Series["2"].Points.AddXY(3, b1, b2);
要添加标签(注意:所有系列共享相同的轴/标签!):
如果希望序列重叠(如示例所示),则需要设置PointWidth
和DrawSideBySide
参数:
chart1.Series["1"]["PointWidth"] = "0.7";
chart1.Series["2"]["PointWidth"] = "0.2";
chart1.Series["2"]["DrawSideBySide"] = "false";
其中一些是从明显有缺陷且不完整的……中回收的(即使在上图中也可以看到一个小指示:“任务5”可能应标记为“任务3”)
还请注意,对于所有条形图,x轴和y轴都是切换的,因此x轴是垂直的!首先
foreach
可以完全替换为for
。我认为您的代码不会编译(ser
定义了两次)。它可以编译,但事实上,我的错误是,我把serSimply edit问题定义的两部分放在了一起。您应该始终尝试提供示例,有些人擅长在头脑中编译,但有些人希望运行您的代码并在PC上修复它。
chart1.Series["1"]["PointWidth"] = "0.7";
chart1.Series["2"]["PointWidth"] = "0.2";
chart1.Series["2"]["DrawSideBySide"] = "false";