我有一个来自SQL Server的数据表,其中日期时间字段为ScannedDateTime 我正在尝试在VB NET中使用2种线型系列制作图表:
X-应该是ScannedDateTime字段中的日期
Y-应该是来自ScannedDateTime的时间
我不知道该怎么做?要将时间转换为十进制数字并将其显示为y轴还是什么?
我想将y保留为时间格式“ hh:mm”,并限制最小值作为工作时间示例:从07:00到15:00
Devexpress?
我尝试了这个,但是为什么要重复一次??
感谢创意
答案 0 :(得分:0)
似乎您需要使用TimeSpan刻度显示每个数据源记录中的Time值。尽管DevExpress ChartControl不支持TimeSpan比例类型,但是您可以使用以下方法来生成所需的图表布局。
首先,定义一个额外的数字字段,该字段将用作ValueDataMember并包含与TimeSpan值相对应的刻度数。
要显示TimeSpan标签而不是数字值,请填充自定义轴标签元素的集合。
最后,通过处理 CustomDrawCrosshair 事件来自定义Crosshair Cursor标签文本。
请参考说明此方法的示例源代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
List<MyData> inputData = new List<MyData>();
inputData.Add(new MyData() { ID = 1, ScannedDateTime = new DateTime(2019, 4, 1, 11, 22, 33) });
inputData.Add(new MyData() { ID = 2, ScannedDateTime = new DateTime(2019, 4, 2, 15, 00, 12) });
inputData.Add(new MyData() { ID = 3, ScannedDateTime = new DateTime(2019, 4, 3, 09, 11, 03) });
Series lineSeries = new Series("Scanned Date", ViewType.Line);
lineSeries.ArgumentDataMember = "ScannedDateTime";
lineSeries.ValueScaleType = ScaleType.Numerical;
lineSeries.ValueDataMembers.AddRange(new string[] { "TimeTicks" });
lineSeries.DataSource = inputData;
chartControl1.Series.Add(lineSeries);
XYDiagram diagram = (XYDiagram)chartControl1.Diagram;
diagram.AxisX.DateTimeScaleOptions.MeasureUnit = DateTimeMeasureUnit.Day;
for (int i = 0; i < 24; i++)
{
TimeSpan ts = new TimeSpan(i, 0, 0); //display tickmarks for every hour
diagram.AxisY.CustomLabels.Add(new CustomAxisLabel() { AxisValue = ts.Ticks, Name = ts.ToString() });
}
chartControl1.CustomDrawCrosshair += ChartControl1_CustomDrawCrosshair; // optional - if you need to show TimeSpan values in the Crosshair Cursor
}
private void ChartControl1_CustomDrawCrosshair(object sender, CustomDrawCrosshairEventArgs e)
{
foreach(CrosshairElementGroup g in e.CrosshairElementGroups)
{
foreach(CrosshairElement el in g.CrosshairElements)
{
TimeSpan ts = TimeSpan.FromTicks((long)el.SeriesPoint.Values[0]);
el.LabelElement.Text = string.Format("{0} - {1}", el.SeriesPoint.Argument, ts);
}
}
}
}
public class MyData
{
public int ID { get; set; }
public DateTime ScannedDateTime { get; set; }
public double TimeTicks
{
get
{
return ScannedDateTime.TimeOfDay.Ticks;
}
}
}