翻譯|使用教程|編輯:龔雪|2019-11-25 09:44:50.187|閱讀 2142 次
概述:在日前正式發(fā)布的DevExpress v19.2中,DevExpress WinForms Gantt Control已作為社區(qū)技術(shù)預(yù)覽(CTP)正式發(fā)布!本文將介紹如何利用甘特圖控件的CustomDraw事件來(lái)模擬與甘特圖相關(guān)的主要功能。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
相關(guān)鏈接:
DevExpress Winforms Controls 內(nèi)置140多個(gè)UI控件和庫(kù),完美構(gòu)建流暢、美觀且易于使用的應(yīng)用程序。無(wú)論是Office風(fēng)格的界面,還是分析處理大批量的業(yè)務(wù)數(shù)據(jù),DevExpress WinForms都能輕松勝任。DevExpress廣泛應(yīng)用于ECM企業(yè)內(nèi)容管理、 成本管控、進(jìn)程監(jiān)督、生產(chǎn)調(diào)度,在企業(yè)/政務(wù)信息化管理中占據(jù)一席重要之地。
【適用范圍】:各種桌面、Web應(yīng)用程序開(kāi)發(fā),尤其是WinForms應(yīng)用程序開(kāi)發(fā)。
點(diǎn)擊獲取DevExpress v19.2完整版試用下載
在日前正式發(fā)布的DevExpress v19.2中,DevExpress WinForms Gantt Control已作為社區(qū)技術(shù)預(yù)覽(CTP)正式發(fā)布!從此版本到將來(lái)的v20.1版本,技術(shù)團(tuán)隊(duì)將改進(jìn)和擴(kuò)展此控件,以便您無(wú)需編寫(xiě)代碼即可提供出色的用戶(hù)體驗(yàn)!本文將介紹如何利用甘特圖控件的CustomDraw事件來(lái)模擬與甘特圖相關(guān)的主要功能。
DevExpress WinForms Gantt控件包含以下Custom Draw事件:
通過(guò)組合這些事件,您可以引入尚未集成到控件中的功能(繪制關(guān)鍵路徑、拆分任務(wù)、指定截止日期等)。
關(guān)鍵路徑是一系列非常重要的項(xiàng)目任務(wù),它們之間的延遲為零。 如果您準(zhǔn)備好將WinForms Gantt集成到軟件項(xiàng)目中,并且等不及下一次重大更新,則可以結(jié)合使用CustomDrawTask和CustomDrawDependency事件來(lái)手動(dòng)突出顯示與關(guān)鍵路徑關(guān)聯(lián)的任務(wù)欄以及連接它們的箭頭。
注意:在此代碼示例和其他代碼示例中,使用突出顯示元素,這些顏色會(huì)根據(jù)當(dāng)前應(yīng)用的皮膚略微改變色調(diào)。
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; } };
拆分任務(wù)是被中斷的任務(wù)(在給定的時(shí)間),該任務(wù)在稍后的時(shí)間點(diǎn)恢復(fù)。 在下圖中,“Develop Software” 是一個(gè)3個(gè)小時(shí)的任務(wù),一分為二,其中有2個(gè)小時(shí)的暫停。
使用custom draw事件時(shí),您需要知道將拆分哪個(gè)任務(wù)及其延遲。有了這些信息,您就可以在數(shù)據(jù)源中編輯任務(wù)完成日期/持續(xù)時(shí)間。在此示例中,“Develop Software”被定義為數(shù)據(jù)源中的一個(gè)5小時(shí)任務(wù)。
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; } };
一種更有效的方法是將任務(wù)持續(xù)時(shí)間和開(kāi)始/結(jié)束日期存儲(chǔ)在數(shù)據(jù)源中,并在需要的地方插入暫停。 為了支持這種方法,甘特圖控件必須能夠重新計(jì)算所有任務(wù)并相應(yīng)地動(dòng)態(tài)更新其TreeList和Diagram面板。
下一個(gè)示例說(shuō)明如何使用自定義文本字符串(“High Priority”或“Normal Priority”)替換任務(wù)的標(biāo)題,這些自定義標(biāo)題通過(guò)使用CustomTaskDisplayText事件繪制在任務(wù)的左側(cè)或右側(cè)。
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"; } };
Stripline是彩色的時(shí)間刻度列,突出顯示特定時(shí)間段(例如,周末)。 在下圖中,Stripline突出顯示了自定義的4小時(shí)間隔。
您可以通過(guò)CustomDrawTimescaleColumn事件重新繪制時(shí)標(biāo)列來(lái)實(shí)現(xiàn)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”遵循固定的期限。
就像之前的代碼片段一樣,截止日期是通過(guò)CustomDrawTimescaleColumn事件繪制的,但是在這種情況下需要繪制一個(gè)細(xì)矩形,而不是用自定義顏色填充整個(gè)列。
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全新發(fā)布,歡迎下載最新版體驗(yàn)哦~
DevExpress中文網(wǎng)官網(wǎng)QQ群:540330292 歡迎一起進(jìn)群討論
掃描關(guān)注DevExpress中文網(wǎng)微信公眾號(hào),及時(shí)獲取最新動(dòng)態(tài)及最新資訊
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都網(wǎng)