# Gantt Chart

Display project schedules and plans by plotting project activities against time using WinForms Gantt chart. Learn more in ComponentOne FlexChart documentation.

## Content

**Gantt charts** are the charts which demonstrate the project schedules and plans by plotting the project activities against time. With activities listed on Y-axis and time scale along the X-axis, these charts indicate the duration of each activity through length of horizontal bars positioned to start at the start time of an activity.As primary purpose of a Gantt chart is planning and scheduling, gantt charts are used for a range of projects and in various industries, such as construction, engineering, manufacturing, infrastructure, IT and more.

![WinForms Gantt chart](https://cdn.mescius.io/document-site-files/images/13ef049a-dbc7-444f-94c2-9a9cd1c2f895/images/ganttchart.png)

In FlexChart, WinForms gantt chart can be implemented using the Series class. To begin with, create a new **Series** object and specify its properties. Then, use the SymbolRendering event provided by the Series class to plot activity bars on the chart and the LabelRendering event provided by the <span data-popup-content="This class is present both in \u003ca href=\u0022/componentone/docs/win/online-flexchart/\u0022\u003e.NET Framework\u003c/a\u003e and \u003ca href=\u0022/componentone/docs/win/online-flexchart/\u0022\u003e.NET\u003c/a\u003e assemblies." data-popup-title="FlexChart" data-popup-theme="ui-tooltip-green qtip-green">FlexChart</span> class to display the labels.

```csharp
private void Form1_Load(object sender, EventArgs e)
{
    this.flexChart1.ChartType = ChartType.Bar;
    this.flexChart1.BindingX = "Name";
    Series series = new GanttSeriesWithPointLegendItems() { Binding = "End" };
    series.SymbolRendering += Series_SymbolRendering;
    this.flexChart1.Series.Add(series);
    this.flexChart1.DataLabel.Content = "{DurationInWeeks} - Weeks";
    this.flexChart1.DataLabel.Position = LabelPosition.Left;
    this.flexChart1.DataSource = taskData = GetTasksData();
    this.flexChart1.AxisX.Min = taskData[taskData.Count - 1].Start.ToOADate();
    this.flexChart1.AxisX.MajorGrid = true;
    this.flexChart1.AxisX.MajorUnit = 14D;
    this.flexChart1.AxisX.Format = "MMM-dd";
    this.flexChart1.Header.Content = "Project Schedule";
}
public class GanttSeriesWithPointLegendItems : Series, ISeries
{
    string ISeries.GetLegendItemName(int index) { return taskData.ElementAt(taskData.Count - 1 - index).Name; }
    _Style ISeries.GetLegendItemStyle(int index)
    {
        return new _Style { Fill = new SolidBrush(colors[(index) % colors.Length]) };
    }
    int ISeries.GetLegendItemLength() { return taskData.Count; }
}
private void Series_SymbolRendering(object sender, RenderSymbolEventArgs e)
{
    e.Cancel = true;
    Task task = (Task)e.Item;
    var height = this.flexChart1.PlotRect.Height / ((List<Task>)this.flexChart1.DataSource).Count / 2;
    var start = this.flexChart1.AxisX.Convert(task.Start.ToOADate());
    e.Engine.SetFill(new SolidBrush(colors[(taskData.Count - 1 - e.Index) % colors.Length]));
    e.Engine.SetStroke(new SolidBrush(colors[(taskData.Count - 1 - e.Index) % colors.Length]));
    e.Engine.DrawRect(start, e.Point.Y - height / 2, e.Point.X - start, height);
}
```

```vbnet
Private Sub Form1_Load(sender As Object, e As EventArgs)
    Me.flexChart1.ChartType = ChartType.Bar
    Me.flexChart1.BindingX = "Name"
    Dim series As Series = New GanttSeriesWithPointLegendItems() With {
          .Binding = "End"
    }
    AddHandler series.SymbolRendering, AddressOf Series_SymbolRendering
    Me.flexChart1.Series.Add(series)
    Me.flexChart1.DataLabel.Content = "{DurationInWeeks} - Weeks"
    Me.flexChart1.DataLabel.Position = LabelPosition.Left
    Me.flexChart1.DataSource = InlineAssignHelper(taskData, GetTasksData())
    Me.flexChart1.AxisX.Min = taskData(taskData.Count - 1).Start.ToOADate()
    Me.flexChart1.AxisX.MajorGrid = True
    Me.flexChart1.AxisX.MajorUnit = 14.0
    Me.flexChart1.AxisX.Format = "MMM-dd"
    Me.flexChart1.Header.Content = "Project Schedule"
End Sub
Public Class GanttSeriesWithPointLegendItems
    Inherits Series
    Implements ISeries
    Private Function ISeries_GetLegendItemName(index As Integer) As String Implements ISeries.GetLegendItemName
        Return taskData.ElementAt(taskData.Count - 1 - index).Name
    End Function
    Private Function ISeries_GetLegendItemStyle(index As Integer) As _Style Implements ISeries.GetLegendItemStyle
        Return New _Style() With {
              .Fill = New SolidBrush(colors((index) Mod colors.Length))
        }
    End Function
    Private Function ISeries_GetLegendItemLength() As Integer Implements ISeries.GetLegendItemLength
        Return taskData.Count
    End Function
End Class
Private Sub Series_SymbolRendering(sender As Object, e As RenderSymbolEventArgs)
    e.Cancel = True
    Dim task As Task = DirectCast(e.Item, Task)
    Dim height As Single = Me.flexChart1.PlotRect.Height / DirectCast(Me.flexChart1.DataSource, List(Of Task)).Count / 2
    Dim start As Double = Me.flexChart1.AxisX.Convert(task.Start.ToOADate())
    e.Engine.SetFill(New SolidBrush(colors((taskData.Count - 1 - e.Index) Mod colors.Length)))
    e.Engine.SetStroke(New SolidBrush(colors((taskData.Count - 1 - e.Index) Mod colors.Length)))
    e.Engine.DrawRect(start, e.Point.Y - height / 2, e.Point.X - start, height)
End Sub
```

Note that the above sample code uses a custom method named GetTasksData to supply data to the chart. You can set up the data source as per your requirements.

```csharp
public static List<Task> GetTasksData()
{
    var taskList = new List<Task>();
    var year = DateTime.Now.Year;
    taskList.Add(new Task { Name = "Documentation", Start = new DateTime(year, 5, 5), End = new DateTime(year, 6, 15) });
    taskList.Add(new Task { Name = "Testing and QA", Start = new DateTime(year, 5, 11), End = new DateTime(year, 6, 15) });
    taskList.Add(new Task { Name = "Test Plan", Start = new DateTime(year, 4, 26), End = new DateTime(year, 5, 11) });
    taskList.Add(new Task { Name = "Development", Start = new DateTime(year, 4, 25), End = new DateTime(year, 6, 15) });
    taskList.Add(new Task { Name = "Detail Design", Start = new DateTime(year, 4, 18), End = new DateTime(year, 5, 2) });
    taskList.Add(new Task { Name = "Planning", Start = new DateTime(year, 4, 12), End = new DateTime(year, 4, 26) });
    taskList.Add(new Task { Name = "Architecture", Start = new DateTime(year, 3, 27), End = new DateTime(year, 4, 12) });
    taskList.Add(new Task { Name = "Specifications", Start = new DateTime(year, 3, 14), End = new DateTime(year, 3, 27) });
    taskList.Add(new Task { Name = "Preparation", Start = new DateTime(year, 3, 1), End = new DateTime(year, 3, 14) });
    return taskList;
}
```

```vbnet
Public Shared Function GetTasksData() As List(Of Task)
    Dim taskList As List(Of Task) = New List(Of Task)()
    Dim year As Integer = DateTime.Now.Year
    taskList.Add(New Task() With {
          .Name = "Documentation",
          .Start = New DateTime(year, 5, 5),
          .[End] = New DateTime(year, 6, 15)
    })
    taskList.Add(New Task() With {
          .Name = "Testing and QA",
          .Start = New DateTime(year, 5, 11),
          .[End] = New DateTime(year, 6, 15)
    })
    taskList.Add(New Task() With {
          .Name = "Test Plan",
          .Start = New DateTime(year, 4, 26),
          .[End] = New DateTime(year, 5, 11)
    })
    taskList.Add(New Task() With {
          .Name = "Development",
          .Start = New DateTime(year, 4, 25),
          .[End] = New DateTime(year, 6, 15)
    })
    taskList.Add(New Task() With {
          .Name = "Detail Design",
          .Start = New DateTime(year, 4, 18),
          .[End] = New DateTime(year, 5, 2)
    })
    taskList.Add(New Task() With {
          .Name = "Planning",
          .Start = New DateTime(year, 4, 12),
          .[End] = New DateTime(year, 4, 26)
    })
    taskList.Add(New Task() With {
          .Name = "Architecture",
          .Start = New DateTime(year, 3, 27),
          .[End] = New DateTime(year, 4, 12)
    })
    taskList.Add(New Task() With {
          .Name = "Specifications",
          .Start = New DateTime(year, 3, 14),
          .[End] = New DateTime(year, 3, 27)
    })
    taskList.Add(New Task() With {
          .Name = "Preparation",
          .Start = New DateTime(year, 3, 1),
         .[End] = New DateTime(year, 3, 14)
    })
    Return taskList
End Function
```