VARCHART XGantt创建直方图教程
甘特图(Xgantt)从1998年的第一个商用版本开始就致力于计划编制和项目管理方面控件的研究和开发,经过20多年的积累和沉淀,目前可为软件开发商和最终用户提供最顶级的计划编制和项目管理的控件产品,帮助用户快速的整合项目管理软件所需的甘特图,网络图,资源柱状图,日程日历,资源调度等功能模块,并提供全方位的支持和服务。
VARCHART XGantt是一款功能强大的甘特图控件,其模块化的设计让您可以创建满足需要的应用程序。XGantt可用于.NET,ActiveX和ASP.NET应用程序,可以快速、简单地集成到您的应用程序中,帮助您识别性能瓶颈、避免延迟以及高效利用资源,使复杂数据变得更加容易理解。
VARCHART XGantt在市场上已有近30年的历史,它提供了最完善的C#Gantt图表控件,可用于构建现代而又可靠的行业资源调度应用程序。
下载VARCHART XGantt正式版【慧都网】
步骤5:在这一步骤中,创建了两个不同的过滤器,将选定和未选定的活动分开。请调用 "对象 "属性页,点击 "过滤器... "按钮,进入 "管理过滤器 "对话框。通过点击按钮创建两个新的过滤器,并将它们命名为 "已选择 "和 "未选择"。
![](https://image.evget.com/attachment/keditor/image/20210114/20210114094754_22709.png)
现在,请设置过滤条件。对于 "未选择 "过滤器,请指定条件 "选择不等于1"。由于这个条件,只有未选择的节点才会被过滤。现在请标记 "未选择 "过滤器,并点击对话框顶部右侧的按钮。它将调用编辑过滤器对话框。在 "字段名 "栏中选择 "选定 "字段,在 "操作者 "栏中选择 "不等于",在 "比较值 "栏中输入 "1"。通过 "确定 "退出对话框。
现在,用同样的方法将条件“Selected = 1”分配给“Selected”过滤器。
![](https://image.evget.com/attachment/keditor/image/20210114/20210114095040_11327.png)
步骤6:在这个步骤中,我们将为被选中和未选中的节点定义两种不同的外观,以与筛选器结合。
请选择属性页对象,然后点击对象图层....这将弹出指定栏外观的对话框。请直接输入新名称,将层“开始-结束”重命名为“未选择的节点”输入列名中的字段。请找到列滤镜,并将滤镜指定为“未被选中”。通过点击按钮复制图层并命名为“Selected Nodes”。为图层指定“Selected”滤镜。
两层看起来还是一样的。双击“层设计”列对应的字段,可以修改“已选节点”层的设计。对话框编辑层将弹出。请选择一个十字舱口图案,有黄色底色或图案颜色2和黑色图案颜色。
为了确保非工作间隔的周末显示为一行而不是条,需要在Nodes属性页上设置非工作间隔的选项层。
步骤7:在此步骤中,直方图将创建四条曲线:容量曲线、未标记活动曲线、已标记活动曲线和填充区域的辅助曲线。点击管理直方图…在属性页布局中调用相应的对话框。
几个直方图可以同时出现在甘特图中。每个直方图都有自己的数字刻度,并包含自己的曲线。
现在请定义数字刻度的起始值和结束值。单击“End value”列的“histogram gram_1”,输入“6”。
现在,请编辑柱状图。为此,请单击对话框顶部右侧的编辑按钮。
“曲线1”应代表容量曲线(红色)。“曲线2”对已标记节点进行总结,“曲线3”表示未标记节点。“曲线4”是辅助曲线,为短缺地区提供绿色背景。
一条曲线已经存在。请再创建三条曲线,并根据图示定义它们的属性。
一条曲线最多可指定两条参考曲线。一条曲线形成了有ist参考曲线的区域,可以指定颜色和图案(见下面的草图)。第一条参考曲线的所有部分曲线下面的加起来就是面积(上图)。在第二条参考曲线中,只有在曲线下方的面积上增加的部分,即y值小于原始曲线(下图)。此外,由第二条参考曲线形成的区域将以更高的优先级显示。我们将在下面的柱状图中看到结果。
容量曲线(曲线1)将从一个列表中接收它的值,我们稍后将通过编程代码提供这个列表。因此,请在source字段中将其数据源设置为via API。因此,一个额外的过滤器可以从中获取数据的节点不需要。
请将线条类型设置为粗红线。该曲线的值不得与其他曲线的值相加;因此,字段堆栈引用仍然为空。此外,容量曲线不打算形成一个面积与另一条曲线,因此两个填充引用和它们的填充模式仍然是空的。请按对话框中相应的字段创建曲线1。
曲线2表示未被选中的节点,由名为“未被选中节点”的层中的值组成。不需要筛选器进行进一步的选择。请为曲线选择一种蓝色的线颜色。曲线值不会添加到另一条曲线的值,因此堆栈引用保持为空。曲线应该与x轴形成一个区域,所以请在字段填充参考选择值Flatline。
这条曲线由未选择的节点组成,它还应该以一种特殊的方式表示超过容量曲线的位置,以便标记生产系统的瓶颈。因此,一旦它的y值超过曲线1的y值,就开始绘制曲线1下面的区域。所以请设置曲线1作为它的第二个参考曲线,并选择一个阴影填充模式。
“曲线3”表示所选节点。因此,请将层命名为“已选节点”作为其数据源。不需要过滤器。请分配一个浅灰色的线颜色。因为选择的节点将被显示在非选中节点之上,它们的值必须添加到非选中节点的值中。所以请选择曲线2作为堆栈参考。同一条曲线也作为第一条参考曲线,因为被选中的节点在视觉上与未被选中的节点不同。作为填充图案,请选择一个灰色十字图案在黄色背景上。
形成的区域将在曲线2的上方和下方可见。此外,还应出现在容量曲线以上;因此,请指定曲线1作为第二条参考曲线,用相同的颜色和图案填充该区域。如果
选中的节点高于容量曲线,它们将以与容量曲线下方相同的颜色和图案出现(您可以通过指定一个红色来区分容量曲线上方和下方的选中节点颜色)。
通过曲线4,我们将定义一个区域,代表容量曲线和下面的节点堆之间的浅绿色背景。表示生产系统的可用资源。它的底部受到了限制未选中的节点,因此请选择它们作为数据源。在顶部,面积受到容量曲线的限制,请设置为第一条参考曲线。
问:为什么曲线4的面积不隐藏所选的节点?答:因为在这个对话框所呈现的曲线列表中有一个优先级。列出在底部的曲线比列出在顶部的曲线优先级低。这就是为什么曲线3的区域显示在曲线区域的顶部
4. 您可以通过窗口顶部右侧的箭头修改优先级。
第八步:
在最后一步,我们将提供容量曲线的值。为此,请修改Load事件中的代码,如下所示:
示例代码VB.NET
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load VcGantt1.Width = ClientSize.Width - VcGantt1.Left VcGantt1.Height = ClientSize.Height - VcGantt1.Top VcGantt1.InsertNodeRecord("1;Node 1;07.05.2007;;5") VcGantt1.InsertNodeRecord("2;Node 2;09.05.2007;;5") VcGantt1.InsertNodeRecord("3;Node 3;10.05.2007;;6") VcGantt1.InsertNodeRecord("4;Node 4;17.05.2007;;10") VcGantt1.InsertNodeRecord("5;Node 5;22.05.2007;;3") VcGantt1.InsertNodeRecord("6;Node 6;23.05.2007;;1") VcGantt1.EndLoading() VcGantt1.OptimizeTimeScaleStartEnd(3) 'calculate end date Dim node As VcNode For Each node In VcGantt1.NodeCollection setNodeEndDate(node) Next Dim histogram As VcHistogram Dim curve As VcCurve histogram = VcGantt1.HistogramCollection.FirstHistogram curve = histogram.CurveCollection.CurveByName(" Curve1 ") curve.PointsEquidistant = False curve.SetValues("01.05.2007", "2") curve.SetValues("05.05.2007", "0") curve.SetValues("07.05.2007", "2") curve.SetValues("12.05.2007", "0") curve.SetValues("14.05.2007", "4") curve.SetValues("19.05.2007", "0") curve.SetValues("21.05.2007", "2") curve.SetValues("26.05.2007", "0") curve.SetValues("28.05.2007", "2") End Sub
c#示例代码
private void Form1_Load(object sender, System.EventArgs e) { vcGantt1.Width = ClientSize.Width - vcGantt1.Left; vcGantt1.Height = ClientSize.Height - vcGantt1.Top; vcGantt1.InsertNodeRecord("1;Node 1;07.05.2007;;5"); vcGantt1.InsertNodeRecord("2;Node 2;09.05.2007;;5"); vcGantt1.InsertNodeRecord("3;Node 3;10.05.2007;;6"); vcGantt1.InsertNodeRecord("4;Node 4;17.05.2007;;10"); vcGantt1.InsertNodeRecord("5;Node 5;22.05.2007;;3"); vcGantt1.InsertNodeRecord("6;Node 6;23.05.2007;;1"); vcGantt1.EndLoading(); vcGantt1.OptimizeTimeScaleStartEnd(3); // calculate end date foreach (VcNode node in vcGantt1.NodeCollection) { SetNodeEndDate(node); } VcHistogram histogram = vcGantt1.HistogramCollection.FirstHistogram(); VcCurve curve = histogram.CurveCollection.CurveByName("Curve 1"); curve.PointsEquidistant = false; curve.SetValues(Convert.ToDateTime("01.05.2007"),"2"); curve.SetValues(Convert.ToDateTime("05.05.2007"),"0"); curve.SetValues(Convert.ToDateTime("07.05.2007"),"2"); curve.SetValues(Convert.ToDateTime("12.05.2007"),"0"); curve.SetValues(Convert.ToDateTime("14.05.2007"),"4"); curve.SetValues(Convert.ToDateTime("19.05.2007"),"0"); curve.SetValues(Convert.ToDateTime("21.05.2007"),"2"); curve.SetValues(Convert.ToDateTime("26.05.2007"),"0"); curve.SetValues(Convert.ToDateTime("28.05.2007"),"2"); }
现在,请运行程序并标记一个活动。通过直方图中黄色背景上的灰色阴影部分,您可以立即识别出该活动在大部分工作负载中所占的部分显示出来。
如果您移动了活动,那么工作负载将会改变,并且您可以识别由您的交互引起的容量过载和不足。