DevExpress Winforms Controls 內置140多個UI控件和庫,完美構建流暢、美觀且易於使用的應用程序。不管是Office風格的界面,仍是分析處理大批量的業務數據,DevExpress WinForms都能輕鬆勝任。DevExpress普遍應用於ECM企業內容管理、 成本管控、進程監督、生產調度,在企業/政務信息化管理中佔據一席重要之地。express
【適用範圍】:各類桌面、Web應用程序開發,尤爲是WinForms應用程序開發。3d
點擊獲取DevExpress v19.2完整版試用下載orm
在日前正式發佈的DevExpress v19.2中,DevExpress WinForms Gantt Control已做爲社區技術預覽(CTP)正式發佈!今後版本到未來的v20.1版本,技術團隊將改進和擴展此控件,以便您無需編寫代碼便可提供出色的用戶體驗!本文將介紹如何利用甘特圖控件的CustomDraw事件來模擬與甘特圖相關的主要功能。blog
Custom Draw事件教程
DevExpress WinForms Gantt控件包含如下Custom Draw事件:進程
經過組合這些事件,您能夠引入還沒有集成到控件中的功能(繪製關鍵路徑、拆分任務、指定截止日期等)。事件
關鍵路徑ip
關鍵路徑是一系列很是重要的項目任務,它們之間的延遲爲零。 若是您準備好將WinForms Gantt集成到軟件項目中,而且等不及下一次重大更新,則能夠結合使用CustomDrawTask和CustomDrawDependency事件來手動突出顯示與關鍵路徑關聯的任務欄以及鏈接它們的箭頭。開發
注意:在此代碼示例和其餘代碼示例中,使用skin colors突出顯示元素,這些顏色會根據當前應用的皮膚略微改變色調。字符串
HashSet<int> criticalPathIds = new HashSet<int> { 1, 2, 3, 6, 7, 8, 10, 11, 13 };
ganttControl.CustomDrawTask += (sender, e) => {
int taskId = Convert.ToInt32(e.Node.GetValue("Id"));
if(criticalPathIds.Contains(taskId)) {
e.Appearance.BackColor = DXSkinColors.FillColors.Danger;
e.Appearance.ProgressColor = DXSkinColors.FillColors.Danger;
}
};
ganttControl.CustomDrawTaskDependency += (sender, e) => {
int predecessorId = Convert.ToInt32(e.PredecessorNode.GetValue("Id"));
int successorId = Convert.ToInt32(e.SuccessorNode.GetValue("Id"));
if(criticalPathIds.Contains(predecessorId) && criticalPathIds.Contains(successorId)) {
e.Appearance.BackColor = DXSkinColors.FillColors.Danger;
}
};
拆分任務
拆分任務是被中斷的任務(在給定的時間),該任務在稍後的時間點恢復。 在下圖中,「Develop Software」 是一個3個小時的任務,一分爲二,其中有2個小時的暫停。
使用custom draw事件時,您須要知道將拆分哪一個任務及其延遲。有了這些信息,您就能夠在數據源中編輯任務完成日期/持續時間。在此示例中,「Develop Software」被定義爲數據源中的一個5小時任務。
ganttControl.CustomDrawTask += (sender, e) => {
var splitInfo = e.Info.Node.GetValue("SplitInfo") as SplitInfo;
if(splitInfo != null) {
e.Appearance.BackColor = DXSkinColors.FillColors.Danger;
e.Appearance.ProgressColor = DXSkinColors.FillColors.Danger;
e.DrawShape(splitInfo.Start, splitInfo.Start + splitInfo.Duration);
e.DrawRightText();
e.Handled = true;
}
};
一種更有效的方法是將任務持續時間和開始/結束日期存儲在數據源中,並在須要的地方插入暫停。 爲了支持這種方法,甘特圖控件必須可以從新計算全部任務並相應地動態更新其TreeList和Diagram面板。
自定義任務文本
下一個示例說明如何使用自定義文本字符串(「High Priority」或「Normal Priority」)替換任務的標題,這些自定義標題經過使用CustomTaskDisplayText事件繪製在任務的左側或右側。
HashSet<int> criticalPathIds = new HashSet<int> { 1, 2, 3, 6, 7, 8, 10, 11, 13 };
ganttControl.CustomTaskDisplayText += (sender, e) => {
int taskId = Convert.ToInt32(e.Node.GetValue("Id"));
if(criticalPathIds.Contains(taskId)) {
e.RightText = "High priority";
}
else {
e.RightText = string.Empty;
e.LeftText = "Normal priority";
}
};
Striplines
Stripline是彩色的時間刻度列,突出顯示特定時間段(例如,週末)。 在下圖中,Stripline突出顯示了自定義的4小時間隔。
您能夠經過CustomDrawTimescaleColumn事件從新繪製時標列來實現Striplines。
DateTime striplineStart = DateTime.Now.AddHours(5);
DateTime striplineEnd = striplineStart.AddHours(4);
Color striplineColor = Color.FromArgb(128, 255, 224, 166);
ganttControl.CustomDrawTimescaleColumn += (sender, e) => {
GanttTimescaleColumn column = e.Column;
float stripLineStartPoint = (float) Math.Max(e.GetPosition(striplineStart), column.Bounds.Left);
float stripLineEndPoint = (float) Math.Min(e.GetPosition(striplineEnd), column.Bounds.Right);
e.DrawBackground();
RectangleF boundsToDraw = new RectangleF(
stripLineStartPoint, column.Bounds.Y,
stripLineEndPoint - stripLineStartPoint, column.Bounds.Height);
if(boundsToDraw.Width > 0)
e.Cache.FillRectangle(striplineColor, boundsToDraw);
e.DrawHeader();
e.Handled = true;
};
截止期限
在下圖中,「Deploy Beta」遵循固定的期限。
就像以前的代碼片斷同樣,截止日期是經過CustomDrawTimescaleColumn事件繪製的,可是在這種狀況下須要繪製一個細矩形,而不是用自定義顏色填充整個列。
DateTime deadLine = TaskStorage.GetFinishDateFromTask("Deploy Beta");
ganttControl.CustomDrawTimescaleColumn += (sender, e) => {
GanttTimescaleColumn column = e.Column;
if(column.StartDate <= deadLine && column.FinishDate >= deadLine) {
e.DrawBackground();
float x = (float) e.GetPosition(deadLine);
float width = 4;
RectangleF deadLineRect = new RectangleF(x, column.Bounds.Y, width, column.Bounds.Height);
e.Cache.FillRectangle(DXSkinColors.FillColors.Danger, deadLineRect);
e.DrawHeader();
e.Handled = true;
}
};
DevExpress v19.2全新發布,歡迎下載最新版體驗哦~
DevExpress中文網官網QQ羣:540330292 歡迎一塊兒進羣討論