使用Dev Chart内的Gantt样式进行甘特图的处理。
Schedule控件比较困难,个人水平有限。
甘特图与一般图表的XY轴不同,在甘特图中,X轴为竖向轴,Y轴为横向轴。
X轴可显示类别或者类型。Y轴一般为时间。
按我的方式,X轴通过数据库自定义,Y轴通过设置最大最小范围,进行自定义。
X轴:
typeList = DeviceAlarmItrop.GetAlarmTypeList();
if (typeList == null || typeList.Count <= 0)
{
return;
}
listLabel = new CustomAxisLabel[typeList.Count];
for (int i = 0; i < typeList.Count; i++)
{
CustomAxisLabel label = new CustomAxisLabel();
label.AxisValue = typeList[i].AlarmCode;
label.Name = typeList[i].AlarmTypeDesc;
listLabel[i] = label;
}
准备了一个List,来对应X轴。
GanttDiagram diagram = (GanttDiagram)chartControl1.Diagram;
diagram.AxisX.Title.Visible = true;
diagram.AxisX.Title.Alignment = StringAlignment.Center;
diagram.AxisX.Title.Text = "报警类型";
diagram.AxisX.Title.Antialiasing = true;
diagram.AxisX.CustomLabels.AddRange(listLabel); 加入X轴的数据。AddRange
务必使用GanttDiagram
Y轴
diagram.AxisY.Title.Visible = true;
diagram.AxisY.Title.Alignment = StringAlignment.Center;
diagram.AxisY.Title.Text = "小时";
diagram.AxisY.Title.Antialiasing = true;
diagram.AxisY.WholeRange.MaxValue = Convert.ToDateTime(dateDay.DateTime.Date.AddDays(1).AddSeconds(1).ToString("yyyy-MM-dd HH:MM:ss"));最大值
diagram.AxisY.WholeRange.MinValue = dateDay.DateTime.Date;最小值
我需要是显示一天的内容。
添加图内容
foreach (DeviceAlarmLine item in alarmList)
{
Series newSeries = new Series("Gantt", ViewType.Gantt);
//newSeries.ArgumentScaleType = ScaleType.DateTime;
newSeries.ValueScaleType = ScaleType.DateTime;
//newSeries.ValueScaleType = ScaleType.Numerical;
newSeries.LegendText = item.EventType + "";
newSeries.Label.PointOptions.ArgumentDateTimeOptions.FormatString = "HH:MM:SS";格式
newSeries.CrosshairLabelPattern = item.FromStart2EndString;鼠标悬停时,提示的文本
newSeries.CrosshairLabelVisibility = DevExpress.Utils.DefaultBoolean.True;
GanttSeriesView gsv1 = (GanttSeriesView)newSeries.View;
gsv1.FillStyle.FillMode = FillMode.Solid;
//newSeries.ToolTipPointPattern = "HH:mm";
if (item.EventType == 0)
{
newSeries.View.Color = Color.Green;
}
else
{
newSeries.View.Color = Color.Red;
}
newSeries.Points.Add(new SeriesPoint(item.EventType, new DateTime[] { item.operateTime, item.EndTime.HasValue ? item.EndTime.Value : dateDay.DateTime.AddDays(1).AddSeconds(-1) }));
这个地方我们以系列的形式进行添加,系列的点(对应X轴的编号,起始时间,结束时间)
多个系列,以循环的形式进行处理。
chartControl1.Series.Add(newSeries);
}
((GanttDiagram)chartControl1.Diagram).EnableAxisXZooming = true;
((GanttDiagram)chartControl1.Diagram).EnableAxisYZooming = true;
chartControl1.Titles.Add(new ChartTitle());
chartControl1.Titles[0].Text = "单日报警时段分布";标题
chartControl1.Titles[0].Font = new Font("Tahoma", 14, FontStyle.Bold);
chartControl1.Dock = DockStyle.Fill;
有关画面的任何Enable数据尽量以代码处理,因为是采用添加系列的形式实现的。所以每次呈现新的图表前,对现有内容进行清空。
this.chartControl1.Series.Clear();
this.chartControl1.Titles.Clear();
this.chartControl1.Controls.Clear();