Work Breakdown Structure (WBS) Column in ASP.NET Core Gantt Chart
The Work Breakdown Structure (WBS) organizes project tasks hierarchically by assigning unique codes to each task. This improves task visibility and management, especially in large-scale construction or enterprise-level software projects.
Configuration and implementation
To enable WBS in the Gantt Chart component:
- Enable WBS Codes: Set enableWBS to true to automatically generate unique task codes and define their predecessors.
- Auto-Update Codes: Set enableAutoWbsUpdate to true to maintain accurate WBS codes during operations such as sorting, editing, or drag-and-drop.
@page
@model CoreSamples.Pages.IndexModel
<ejs-gantt id="Gantt" dataSource="@Model.GanttData" height="450px" treeColumnIndex="2" allowFiltering="true" allowSorting="true" allowSelection="true" allowUnscheduledTasks="true" enableWBS="true" enableAutoWbsUpdate="true" projectStartDate="new DateTime(2024, 3, 31)" projectEndDate="new DateTime(2024, 5, 30)" rowHeight="40" taskbarHeight="20" toolbar="@(new List<string>() { "Add", "Edit", "Update", "Delete", "Cancel", "ExpandAll", "CollapseAll" })">
<e-gantt-taskfields id="TaskId" name="TaskName" startDate="StartDate" duration="Duration" progress="Progress" dependency="Predecessor" parentID="ParentId"></e-gantt-taskfields>
<e-gantt-columns>
<e-gantt-column field="TaskId" headerText="Task ID" visible="false"></e-gantt-column>
<e-gantt-column field="WBSCode" headerText="WBS Code" width="150"></e-gantt-column>
<e-gantt-column field="TaskName" headerText="Task Name" allowReordering="false" width="260"></e-gantt-column>
<e-gantt-column field="StartDate" headerText="Start Date" width="140"></e-gantt-column>
<e-gantt-column field="WBSPredecessor" headerText="WBS Predecessor" width="190"></e-gantt-column>
<e-gantt-column field="Duration" headerText="Duration" allowEditing="false" width="130"></e-gantt-column>
<e-gantt-column field="Progress" headerText="Progress"></e-gantt-column>
</e-gantt-columns>
<e-gantt-eventmarkers>
<e-gantt-eventmarker day="new DateTime(2024, 4, 2)" label="Project Initiation"></e-gantt-eventmarker>
</e-gantt-eventmarkers>
<e-gantt-editsettings allowAdding="true" allowEditing="true" allowDeleting="true" allowTaskbarEditing="true" showDeleteConfirmDialog="true"></e-gantt-editsettings>
<e-gantt-splittersettings columnIndex="4"></e-gantt-splittersettings>
<e-gantt-selectionsettings mode="Row" type="Single" enableToggle="false"></e-gantt-selectionsettings>
<e-gantt-tooltipsettings showTooltip="true"></e-gantt-tooltipsettings>
<e-gantt-filtersettings type="Menu"></e-gantt-filtersettings>
<e-gantt-timelinesettings showTooltip="true">
<e-timelinesettings-toptier unit="Week" format="dd/MM/yyyy"></e-timelinesettings-toptier>
<e-timelinesettings-bottomtier unit="Day" count="1"></e-timelinesettings-bottomtier>
</e-gantt-timelinesettings>
<e-gantt-labelsettings taskLabel="${Progress}%"></e-gantt-labelsettings>
</ejs-gantt>using Microsoft.AspNetCore.Mvc.RazorPages;
using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace CoreSamples.Pages
{
public class IndexModel : PageModel
{
public List<GanttDataSource> GanttData { get; set; }
public void OnGet()
{
GanttData = new List<GanttDataSource>()
{
new GanttDataSource { TaskId = 1, TaskName = "Product concept", StartDate = new DateTime(2024, 4, 2), EndDate = new DateTime(2024, 4, 21) },
new GanttDataSource { TaskId = 2, TaskName = "Defining the product and its usage", StartDate = new DateTime(2024, 4, 2), Duration = 3, Progress = 30, ParentId = 1 },
new GanttDataSource { TaskId = 3, TaskName = "Defining target audience", StartDate = new DateTime(2024, 4, 2), Duration = 3, ParentId = 1 },
new GanttDataSource { TaskId = 4, TaskName = "Prepare product sketch and notes", StartDate = new DateTime(2024, 4, 2), Duration = 2, Progress = 30, Predecessor = "2FS+1", ParentId = 1 },
new GanttDataSource { TaskId = 5, TaskName = "Manufacturing cost", StartDate = new DateTime(2024, 4, 4), Duration = 2, Progress = 30, ParentId = 4 },
new GanttDataSource { TaskId = 6, TaskName = "Selling cost", StartDate = new DateTime(2024, 4, 4), Duration = 2, ParentId = 4 },
new GanttDataSource { TaskId = 7, TaskName = "Selling Items", StartDate = new DateTime(2024, 4, 4), Duration = 2, ParentId = 6 },
new GanttDataSource { TaskId = 8, TaskName = "Market research", StartDate = new DateTime(2024, 4, 2), EndDate = new DateTime(2024, 4, 21) },
new GanttDataSource { TaskId = 9, TaskName = "Demand analysis", StartDate = new DateTime(2024, 4, 4), EndDate = new DateTime(2024, 4, 21), ParentId = 8 },
new GanttDataSource { TaskId = 10, TaskName = "Customer strength", StartDate = new DateTime(2024, 4, 4), Duration = 4, Progress = 30, Predecessor = "5", ParentId = 9 },
new GanttDataSource { TaskId = 11, TaskName = "Market opportunity analysis", StartDate = new DateTime(2024, 4, 4), Duration = 4, Predecessor = "5", ParentId = 9 },
new GanttDataSource { TaskId = 12, TaskName = "Competitor analysis", StartDate = new DateTime(2024, 4, 4), Duration = 4, Progress = 30, Predecessor = "7, 8", ParentId = 8 },
new GanttDataSource { TaskId = 13, TaskName = "Product strength analsysis", StartDate = new DateTime(2024, 4, 4), Duration = 4, Predecessor = "9", ParentId = 8 },
new GanttDataSource { TaskId = 14, TaskName = "Research complete", StartDate = new DateTime(2024, 4, 4), Duration = 0, Predecessor = "10", ParentId = 8, Indicators = new List<IndicatorModel>() { new IndicatorModel { Date = new DateTime(2024, 4, 27), Name = "Research completed", Tooltip = "Research completed", IconClass = "description e-icons" } } },
new GanttDataSource { TaskId = 15, TaskName = "Product design and development", StartDate = new DateTime(2024, 4, 4), EndDate = new DateTime(2024, 4, 21) },
new GanttDataSource { TaskId = 16, TaskName = "Functionality design", StartDate = new DateTime(2024, 4, 4), Duration = 3, Progress = 30, Predecessor = "12", ParentId = 15 },
new GanttDataSource { TaskId = 17, TaskName = "Quality design", StartDate = new DateTime(2024, 4, 4), Duration = 3, Predecessor = "12", ParentId = 15 },
new GanttDataSource { TaskId = 18, TaskName = "Define reliability", StartDate = new DateTime(2024, 4, 4), Duration = 2, Progress = 30, Predecessor = "15", ParentId = 15 },
new GanttDataSource { TaskId = 19, TaskName = "Identifying raw materials", StartDate = new DateTime(2024, 4, 4), Duration = 2, Predecessor = "14", ParentId = 15 },
new GanttDataSource { TaskId = 20, TaskName = "Define cost plan", StartDate = new DateTime(2024, 4, 4), EndDate = new DateTime(2024, 4, 21), ParentId = 15 },
new GanttDataSource { TaskId = 21, TaskName = "Manufacturing cost", StartDate = new DateTime(2024, 4, 4), Duration = 2, Progress = 30, Predecessor = "17", ParentId = 20 },
new GanttDataSource { TaskId = 22, TaskName = "Selling cost", StartDate = new DateTime(2024, 4, 4), Duration = 2, Predecessor = "17", ParentId = 20 },
new GanttDataSource { TaskId = 23, TaskName = "Development of the final design", StartDate = new DateTime(2024, 4, 4), EndDate = new DateTime(2024, 4, 21), ParentId = 15 },
new GanttDataSource { TaskId = 24, TaskName = "Defining dimensions and package volume", StartDate = new DateTime(2024, 4, 4), Duration = 2, Progress = 30, Predecessor = "19, 20", ParentId = 23 },
new GanttDataSource { TaskId = 25, TaskName = "Develop design to meet industry standards", StartDate = new DateTime(2024, 4, 4), Duration = 2, Predecessor = "22", ParentId = 23 },
new GanttDataSource { TaskId = 26, TaskName = "Include all the details", StartDate = new DateTime(2024, 4, 4), Duration = 3, Predecessor = "23", ParentId = 23 },
new GanttDataSource { TaskId = 27, TaskName = "CAD computer-aided design", StartDate = new DateTime(2024, 4, 4), Duration = 3, Progress = 30, Predecessor = "24", ParentId = 15 },
new GanttDataSource { TaskId = 28, TaskName = "CAM computer-aided manufacturing", StartDate = new DateTime(2024, 4, 4), Duration = 3, Predecessor = "25", ParentId = 15 },
new GanttDataSource { TaskId = 29, TaskName = "Design complete", StartDate = new DateTime(2024, 4, 4), Duration = 0, Predecessor = "26", ParentId = 15 },
new GanttDataSource { TaskId = 30, TaskName = "Prototype testing", StartDate = new DateTime(2024, 4, 4), Duration = 4, Progress = 30, Predecessor = "27" },
new GanttDataSource { TaskId = 31, TaskName = "Include feedback", StartDate = new DateTime(2024, 4, 4), Duration = 4, Predecessor = "28", Indicators = new List<IndicatorModel>() { new IndicatorModel { Date = new DateTime(2024, 5, 31), Name = "Production phase", Tooltip = "Production phase completed", IconClass = "okIcon e-icons" } } },
new GanttDataSource { TaskId = 32, TaskName = "Manufacturing", StartDate = new DateTime(2024, 4, 4), Duration = 5, Progress = 30, Predecessor = "28,29" },
new GanttDataSource { TaskId = 33, TaskName = "Assembling materials to finsihed goods", StartDate = new DateTime(2024, 4, 4), Duration = 5, Predecessor = "30" },
new GanttDataSource { TaskId = 34, TaskName = "Feedback and testing", StartDate = new DateTime(2024, 4, 4), EndDate = new DateTime(2024, 4, 21) },
new GanttDataSource { TaskId = 35, TaskName = "Internal testing and feedback", StartDate = new DateTime(2024, 4, 4), Duration = 3, Progress = 45, Predecessor = "31", ParentId = 34 },
new GanttDataSource { TaskId = 36, TaskName = "Customer testing and feedback", StartDate = new DateTime(2024, 4, 4), Duration = 3, Progress = 50, Predecessor = "33", ParentId = 34 },
new GanttDataSource { TaskId = 37, TaskName = "Final product development", StartDate = new DateTime(2024, 4, 4), EndDate = new DateTime(2024, 4, 21) },
new GanttDataSource { TaskId = 38, TaskName = "Important improvements", StartDate = new DateTime(2024, 4, 4), Duration = 4, Progress = 30, Predecessor = "34", ParentId = 37 },
new GanttDataSource { TaskId = 39, TaskName = "Address any unforeseen issues", StartDate = new DateTime(2024, 4, 4), Duration = 4, Progress = 30, Predecessor = "36", ParentId = 37, Indicators = new List<IndicatorModel>() { new IndicatorModel { Date = new DateTime(2024, 6, 28), Name = "Sales and marketing", Tooltip = "Sales and marketing", IconClass = "description e-icons" } } },
};
}
}
public class IndicatorModel
{
[JsonPropertyName("date")]
public DateTime? Date { get; set; }
[JsonPropertyName("name")]
public string Name { get; set; }
[JsonPropertyName("tooltip")]
public string Tooltip { get; set; }
[JsonPropertyName("iconClass")]
public string IconClass { get; set; }
}
public class GanttDataSource
{
public int? TaskId { get; set; }
public string TaskName { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public int? Duration { get; set; }
public int? Progress { get; set; }
public string Predecessor { get; set; }
public int? ParentId { get; set; }
public List<IndicatorModel> Indicators { get; set; }
}
}
When the WBS column is enabled in the ASP.NET Core Gantt Chart using the enableWBS property set to true, the default ID and Predecessor columns are automatically disabled, as the WBS Code and WBS Predecessor columns already display the ID and predecessor values based on the task hierarchy. The WBS column fields must include both WBS Code and WBS Predecessor in the taskFields configuration.
Managing WBS code updates
To optimize performance, WBS code updates can be controlled using the actionBegin and dataBound events. This is especially useful during operations like row drag-and-drop, where auto-update is triggered only during that specific action to ensure efficient and accurate code handling.
In the following example, WBS auto-update is enabled only during the row drag and drop action using these events.
@page
@model CoreSamples.Pages.IndexModel
@{
ViewData["Title"] = "Home page";
}
<ejs-gantt id="Gantt" dataSource="@Model.GanttData" height="450px" treeColumnIndex="2" allowFiltering="true"
allowSorting="true" allowSelection="true" allowRowDragAndDrop="true" enableWBS="true" enableAutoWbsUpdate="false"
projectStartDate="03/31/2024" projectEndDate="05/30/2024" rowHeight="40" taskbarHeight="20" dataBound="dataBound"
toolbar="@(new List<string>() { "Add", "Edit", "Update", "Delete", "Cancel", "ExpandAll", "CollapseAll" })"
actionBegin="actionBegin">
<e-gantt-taskfields id="TaskId" name="TaskName" startDate="StartDate" endDate="EndDate" duration="Duration"
progress="Progress" dependency="Predecessor" parentID="ParentId">
</e-gantt-taskfields>
<e-gantt-editsettings allowAdding="true" allowEditing="true" allowDeleting="true" allowTaskbarEditing="true"
showDeleteConfirmDialog="true">
</e-gantt-editsettings>
<e-gantt-filtersettings type="Menu"></e-gantt-filtersettings>
<e-gantt-splittersettings columnIndex="4"></e-gantt-splittersettings>
<e-gantt-labelsettings taskLabel="${Progress}%"></e-gantt-labelsettings>
<e-gantt-timelinesettings showTooltip="true">
<e-timelinesettings-toptier unit="Week" format="dd/MM/yyyy"></e-timelinesettings-toptier>
<e-timelinesettings-bottomtier unit="Day" count="1"></e-timelinesettings-bottomtier>
</e-gantt-timelinesettings>
<e-gantt-eventmarkers>
<e-gantt-eventmarker day="04/02/2024" label="Project Initiation"></e-gantt-eventmarker>
</e-gantt-eventmarkers>
<e-gantt-columns>
<e-gantt-column field="TaskId" visible="false"></e-gantt-column>
<e-gantt-column field="WBSCode" headerText="WBS Code" width="150"></e-gantt-column>
<e-gantt-column field="TaskName" headerText="Task Name" allowReordering="false" width="260"></e-gantt-column>
<e-gantt-column field="StartDate" headerText="Start Date" width="140"></e-gantt-column>
<e-gantt-column field="WBSPredecessor" headerText="WBS Predecessor" width="190"></e-gantt-column>
<e-gantt-column field="Duration" headerText="Duration" allowEditing="false" width="130"></e-gantt-column>
<e-gantt-column field="Progress" headerText="Progress"></e-gantt-column>
</e-gantt-columns>
</ejs-gantt>
<script>
var isRowDropped = false;
function actionBegin(args) {
if (args.requestType === 'beforeDrop') {
isRowDropped = true;
var gantt = document.getElementById("Gantt").ej2_instances[0];
gantt.enableAutoWbsUpdate = true;
}
}
function dataBound() {
if (isRowDropped) {
var gantt = document.getElementById("Gantt").ej2_instances[0];
gantt.enableAutoWbsUpdate = false;
isRowDropped = false;
}
}
</script>using Microsoft.AspNetCore.Mvc.RazorPages;
using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace CoreSamples.Pages
{
public class IndexModel : PageModel
{
public List<GanttDataSource> GanttData { get; set; }
public void OnGet()
{
GanttData = new List<GanttDataSource>()
{
new GanttDataSource { TaskId = 1, TaskName = "Product concept", StartDate = new DateTime(2024, 4, 2), EndDate = new DateTime(2024, 4, 21) },
new GanttDataSource { TaskId = 2, TaskName = "Defining the product and its usage", StartDate = new DateTime(2024, 4, 2), Duration = 3, Progress = 30, ParentId = 1 },
new GanttDataSource { TaskId = 3, TaskName = "Defining target audience", StartDate = new DateTime(2024, 4, 2), Duration = 3, ParentId = 1 },
new GanttDataSource { TaskId = 4, TaskName = "Prepare product sketch and notes", StartDate = new DateTime(2024, 4, 2), Duration = 2, Progress = 30, Predecessor = "2FS+1", ParentId = 1 },
new GanttDataSource { TaskId = 5, TaskName = "Manufacturing cost", StartDate = new DateTime(2024, 4, 4), Duration = 2, Progress = 30, ParentId = 4 },
new GanttDataSource { TaskId = 6, TaskName = "Selling cost", StartDate = new DateTime(2024, 4, 4), Duration = 2, ParentId = 4 },
new GanttDataSource { TaskId = 7, TaskName = "Selling Items", StartDate = new DateTime(2024, 4, 4), Duration = 2, ParentId = 6 },
new GanttDataSource { TaskId = 8, TaskName = "Market research", StartDate = new DateTime(2024, 4, 2), EndDate = new DateTime(2024, 4, 21) },
new GanttDataSource { TaskId = 9, TaskName = "Demand analysis", StartDate = new DateTime(2024, 4, 4), EndDate = new DateTime(2024, 4, 21), ParentId = 8 },
new GanttDataSource { TaskId = 10, TaskName = "Customer strength", StartDate = new DateTime(2024, 4, 4), Duration = 4, Progress = 30, Predecessor = "5", ParentId = 9 },
new GanttDataSource { TaskId = 11, TaskName = "Market opportunity analysis", StartDate = new DateTime(2024, 4, 4), Duration = 4, Predecessor = "5", ParentId = 9 },
new GanttDataSource { TaskId = 12, TaskName = "Competitor analysis", StartDate = new DateTime(2024, 4, 4), Duration = 4, Progress = 30, Predecessor = "7, 8", ParentId = 8 },
new GanttDataSource { TaskId = 13, TaskName = "Product strength analsysis", StartDate = new DateTime(2024, 4, 4), Duration = 4, Predecessor = "9", ParentId = 8 },
new GanttDataSource { TaskId = 14, TaskName = "Research complete", StartDate = new DateTime(2024, 4, 4), Duration = 0, Predecessor = "10", ParentId = 8, Indicators = new List<IndicatorModel>() { new IndicatorModel { Date = new DateTime(2024, 4, 27), Name = "Research completed", Tooltip = "Research completed", IconClass = "description e-icons" } } },
new GanttDataSource { TaskId = 15, TaskName = "Product design and development", StartDate = new DateTime(2024, 4, 4), EndDate = new DateTime(2024, 4, 21) },
new GanttDataSource { TaskId = 16, TaskName = "Functionality design", StartDate = new DateTime(2024, 4, 4), Duration = 3, Progress = 30, Predecessor = "12", ParentId = 15 },
new GanttDataSource { TaskId = 17, TaskName = "Quality design", StartDate = new DateTime(2024, 4, 4), Duration = 3, Predecessor = "12", ParentId = 15 },
new GanttDataSource { TaskId = 18, TaskName = "Define reliability", StartDate = new DateTime(2024, 4, 4), Duration = 2, Progress = 30, Predecessor = "15", ParentId = 15 },
new GanttDataSource { TaskId = 19, TaskName = "Identifying raw materials", StartDate = new DateTime(2024, 4, 4), Duration = 2, Predecessor = "14", ParentId = 15 },
new GanttDataSource { TaskId = 20, TaskName = "Define cost plan", StartDate = new DateTime(2024, 4, 4), EndDate = new DateTime(2024, 4, 21), ParentId = 15 },
new GanttDataSource { TaskId = 21, TaskName = "Manufacturing cost", StartDate = new DateTime(2024, 4, 4), Duration = 2, Progress = 30, Predecessor = "17", ParentId = 20 },
new GanttDataSource { TaskId = 22, TaskName = "Selling cost", StartDate = new DateTime(2024, 4, 4), Duration = 2, Predecessor = "17", ParentId = 20 },
new GanttDataSource { TaskId = 23, TaskName = "Development of the final design", StartDate = new DateTime(2024, 4, 4), EndDate = new DateTime(2024, 4, 21), ParentId = 15 },
new GanttDataSource { TaskId = 24, TaskName = "Defining dimensions and package volume", StartDate = new DateTime(2024, 4, 4), Duration = 2, Progress = 30, Predecessor = "19, 20", ParentId = 23 },
new GanttDataSource { TaskId = 25, TaskName = "Develop design to meet industry standards", StartDate = new DateTime(2024, 4, 4), Duration = 2, Predecessor = "22", ParentId = 23 },
new GanttDataSource { TaskId = 26, TaskName = "Include all the details", StartDate = new DateTime(2024, 4, 4), Duration = 3, Predecessor = "23", ParentId = 23 },
new GanttDataSource { TaskId = 27, TaskName = "CAD computer-aided design", StartDate = new DateTime(2024, 4, 4), Duration = 3, Progress = 30, Predecessor = "24", ParentId = 15 },
new GanttDataSource { TaskId = 28, TaskName = "CAM computer-aided manufacturing", StartDate = new DateTime(2024, 4, 4), Duration = 3, Predecessor = "25", ParentId = 15 },
new GanttDataSource { TaskId = 29, TaskName = "Design complete", StartDate = new DateTime(2024, 4, 4), Duration = 0, Predecessor = "26", ParentId = 15 },
new GanttDataSource { TaskId = 30, TaskName = "Prototype testing", StartDate = new DateTime(2024, 4, 4), Duration = 4, Progress = 30, Predecessor = "27" },
new GanttDataSource { TaskId = 31, TaskName = "Include feedback", StartDate = new DateTime(2024, 4, 4), Duration = 4, Predecessor = "28", Indicators = new List<IndicatorModel>() { new IndicatorModel { Date = new DateTime(2024, 5, 31), Name = "Production phase", Tooltip = "Production phase completed", IconClass = "okIcon e-icons" } } },
new GanttDataSource { TaskId = 32, TaskName = "Manufacturing", StartDate = new DateTime(2024, 4, 4), Duration = 5, Progress = 30, Predecessor = "28,29" },
new GanttDataSource { TaskId = 33, TaskName = "Assembling materials to finsihed goods", StartDate = new DateTime(2024, 4, 4), Duration = 5, Predecessor = "30" },
new GanttDataSource { TaskId = 34, TaskName = "Feedback and testing", StartDate = new DateTime(2024, 4, 4), EndDate = new DateTime(2024, 4, 21) },
new GanttDataSource { TaskId = 35, TaskName = "Internal testing and feedback", StartDate = new DateTime(2024, 4, 4), Duration = 3, Progress = 45, Predecessor = "31", ParentId = 34 },
new GanttDataSource { TaskId = 36, TaskName = "Customer testing and feedback", StartDate = new DateTime(2024, 4, 4), Duration = 3, Progress = 50, Predecessor = "33", ParentId = 34 },
new GanttDataSource { TaskId = 37, TaskName = "Final product development", StartDate = new DateTime(2024, 4, 4), EndDate = new DateTime(2024, 4, 21) },
new GanttDataSource { TaskId = 38, TaskName = "Important improvements", StartDate = new DateTime(2024, 4, 4), Duration = 4, Progress = 30, Predecessor = "34", ParentId = 37 },
new GanttDataSource { TaskId = 39, TaskName = "Address any unforeseen issues", StartDate = new DateTime(2024, 4, 4), Duration = 4, Progress = 30, Predecessor = "36", ParentId = 37, Indicators = new List<IndicatorModel>() { new IndicatorModel { Date = new DateTime(2024, 6, 28), Name = "Sales and marketing", Tooltip = "Sales and marketing", IconClass = "description e-icons" } } },
};
}
}
public class IndicatorModel
{
[JsonPropertyName("date")]
public DateTime? Date { get; set; }
[JsonPropertyName("name")]
public string Name { get; set; }
[JsonPropertyName("tooltip")]
public string Tooltip { get; set; }
[JsonPropertyName("iconClass")]
public string IconClass { get; set; }
}
public class GanttDataSource
{
public int? TaskId { get; set; }
public string TaskName { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public int? Duration { get; set; }
public int? Progress { get; set; }
public string Predecessor { get; set; }
public int? ParentId { get; set; }
public List<IndicatorModel> Indicators { get; set; }
}
}
Limitations
The WBS feature has the following limitations in the Gantt Chart component:
-
No Inline Editing: Editing of the WBS Code and WBS Predecessor columns is not supported. These columns are read-only and are automatically calculated based on the task hierarchy.
-
No Load on Demand: Load on demand (virtual loading of data) is not supported with the WBS feature. You must load all tasks upfront to ensure the WBS hierarchy is properly calculated.
-
No Direct Field Mapping: WBS Code and WBS Predecessor fields cannot be mapped directly from the data source. These values are automatically generated by the Gantt Chart based on the parent-child task relationships defined in the data.
These limitations ensure the accuracy and consistency of the WBS hierarchy. If you need editable ID or predecessor columns, consider using custom ID and predecessor columns instead of the WBS feature.