Unplanned
Last Updated: 14 Aug 2017 11:53 by ADMIN
ADMIN
Created by: Dess | Tech Support Engineer, Principal
Comments: 0
Category: GanttView
Type: Bug Report
2
To reproduce: please refer to the attached sample project. Try to edit the title for one of the child tasks in the grid and click the 

Workaround:

private void radGanttView1_ItemChanged(object sender, Telerik.WinControls.UI.GanttViewItemChangedEventArgs e)
{
    IEditableObject editebleObejct = e.Item.DataBoundItem as IEditableObject;
    if (editebleObejct != null)
    {
         editebleObejct.EndEdit();
    }
}
Completed
Last Updated: 15 Aug 2017 10:20 by ADMIN
ADMIN
Created by: Dess | Tech Support Engineer, Principal
Comments: 0
Category: GanttView
Type: Bug Report
0
To reproduce: please refer to the attached sample project and follow the steps in the gif file.

Workaround: 

private void radGanttView1_ContextMenuOpening(object sender, Telerik.WinControls.UI.GanttViewContextMenuOpeningEventArgs e)
{
    foreach (RadMenuItem item in e.Menu.Items)
    {
        if (item.Text == "&Delete")
        {
            item.MouseDown -= item_MouseDown;
            item.MouseDown += item_MouseDown;
        }
    }
}

private void item_MouseDown(object sender, MouseEventArgs e)
{
    this.radGanttView1.GanttViewElement.BeginUpdate();

    if (this.radGanttView1.SelectedItem.Parent == null)
    {
        while (this.radGanttView1.SelectedItem.Items.Count > 0)
        {
            this.radGanttView1.SelectedItem.Items.RemoveAt(0);
        }
    }
    this.radGanttView1.GanttViewElement.EndUpdate();
}
Completed
Last Updated: 13 Dec 2017 15:02 by ADMIN
Workaround: create custom GanttViewTimelineItemElement with special layout arranging the elements in depending on their parent`s final size. The attached project features a possible implementation.


Unplanned
Last Updated: 04 Jan 2017 09:32 by ADMIN
ADMIN
Created by: Dess | Tech Support Engineer, Principal
Comments: 2
Category: GanttView
Type: Bug Report
3
To reproduce:

public Form1()
{
    InitializeComponent();

    DataTable tasks = new DataTable("Tasks");
    tasks.Columns.Add("Id", typeof(int));
    tasks.Columns.Add("ParentId", typeof(int));
    tasks.Columns.Add("Title", typeof(string));
    tasks.Columns.Add("Start", typeof(DateTime));
    tasks.Columns.Add("End", typeof(DateTime));
    tasks.Columns.Add("Progress", typeof(decimal));
    DataTable links = new DataTable("Links");
    links.Columns.Add("StartId", typeof(int));
    links.Columns.Add("EndId", typeof(int));
    links.Columns.Add("LinkType", typeof(int));
    DataSet data = new DataSet();
    data.Tables.Add(tasks);
    data.Tables.Add(links);

    Random rand = new Random();
    int cnt = 3000;
    int cnt2 = 6000;
    for (int i = 1; i < cnt; i++)
    {
        tasks.Rows.Add(i, 0, "Summary task title", DateTime.Now.AddDays(i), DateTime.Now.AddDays(i + 5), 30m);
    }

    for (int i = cnt; i < cnt2; i++)
    {
        tasks.Rows.Add(i, rand.Next(1, cnt), "First child task title", new DateTime(2010, 10, 10), new DateTime(2010, 10, 12), 10);  
    }
    for (int i = 0; i < 2000; i++)
    {
        links.Rows.Add(rand.Next(cnt, cnt2), rand.Next(1, cnt), 1);
    } 
    
    
    this.radGanttView1.GanttViewElement.TaskDataMember = "Tasks";
    this.radGanttView1.GanttViewElement.ChildMember = "Id";
    this.radGanttView1.GanttViewElement.ParentMember = "ParentId";
    this.radGanttView1.GanttViewElement.TitleMember = "Title";
    this.radGanttView1.GanttViewElement.StartMember = "Start"; 
    this.radGanttView1.GanttViewElement.EndMember = "End";
    this.radGanttView1.GanttViewElement.ProgressMember = "Progress";
    this.radGanttView1.GanttViewElement.LinkDataMember = "Links";
    this.radGanttView1.GanttViewElement.LinkStartMember = "StartId";
    this.radGanttView1.GanttViewElement.LinkEndMember = "EndId";
    this.radGanttView1.GanttViewElement.LinkTypeMember = "LinkType";
    this.radGanttView1.GanttViewElement.DataSource = data;
    this.radGanttView1.Columns.Add("Start");
    this.radGanttView1.Columns.Add("End");
}

private void radButton1_Click(object sender, EventArgs e)
{
    this.radGanttView1.PrintPreview();
}

Completed
Last Updated: 16 Aug 2016 12:27 by ADMIN
Dim data As New DataSet()
Dim tasks As New DataTable("Tasks")
Dim links As New DataTable("Links")
Sub New()
    InitializeComponent()

    tasks.Columns.Add("Id", GetType(Integer))
    tasks.Columns.Add("ParentId", GetType(Integer))
    tasks.Columns.Add("Title", GetType(String))
    tasks.Columns.Add("Start", GetType(DateTime))
    tasks.Columns.Add("End", GetType(DateTime))
    tasks.Columns.Add("Progress", GetType(Decimal))

    links.Columns.Add("StartId", GetType(Integer))
    links.Columns.Add("EndId", GetType(Integer))
    links.Columns.Add("LinkType", GetType(Integer))

    data.Tables.Add(tasks)
    data.Tables.Add(links)
    tasks.Rows.Add(1, 0, "1. Summary task title", New DateTime(2010, 10, 10), New DateTime(2010, 10, 15), 30D)
    tasks.Rows.Add(2, 1, "1.1 Task", New DateTime(2010, 10, 10), New DateTime(2010, 10, 12), 10)
    tasks.Rows.Add(3, 1, "1.2 Task", New DateTime(2010, 10, 12), New DateTime(2010, 10, 15), 20D)
    tasks.Rows.Add(4, 1, "1.3 Task", New DateTime(2010, 10, 10), New DateTime(2010, 10, 11), 20D)
    tasks.Rows.Add(5, 1, "Milestone", New DateTime(2010, 10, 15), New DateTime(2010, 10, 15), 0D)
    tasks.Rows.Add(6, 0, "2. Summary task title", New DateTime(2010, 10, 10), New DateTime(2010, 10, 13), 30D)
    tasks.Rows.Add(7, 6, "2.1 Task", New DateTime(2010, 10, 10), New DateTime(2010, 10, 11), 10)
    links.Rows.Add(2, 3, 1)
    links.Rows.Add(3, 5, 1)

    Bind()
    Me.RadGanttView1.Columns.Add("Start")
    Me.RadGanttView1.Columns.Add("End")
    Me.RadGanttView1.Columns.Add("Id")
    Me.RadGanttView1.Columns.Add("ParentId")

    Me.RadGanttView1.GanttViewElement.GraphicalViewElement.TimelineStart = New DateTime(2010, 10, 9)
End Sub

Private Sub Bind()
    Me.RadGanttView1.GanttViewElement.DataSource = Nothing
    Me.RadGanttView1.GanttViewElement.TaskDataMember = "Tasks"
    Me.RadGanttView1.GanttViewElement.ChildMember = "Id"
    Me.RadGanttView1.GanttViewElement.ParentMember = "ParentId"
    Me.RadGanttView1.GanttViewElement.TitleMember = "Title"
    Me.RadGanttView1.GanttViewElement.StartMember = "Start"
    Me.RadGanttView1.GanttViewElement.EndMember = "End"
    Me.RadGanttView1.GanttViewElement.ProgressMember = "Progress"
    Me.RadGanttView1.GanttViewElement.LinkDataMember = "Links"
    Me.RadGanttView1.GanttViewElement.LinkStartMember = "StartId"
    Me.RadGanttView1.GanttViewElement.LinkEndMember = "EndId"
    Me.RadGanttView1.GanttViewElement.LinkTypeMember = "LinkType"
    Me.RadGanttView1.GanttViewElement.DataSource = data
End Sub

Private Sub RadButtonClick(sender As Object, e As EventArgs) Handles RadButton2.Click
    tasks(3)("ParentId") = 6
    Bind()
End Sub

Workaround: rebind the ganttview after changing the parent.
Completed
Last Updated: 18 May 2016 09:29 by ADMIN
ADMIN
Created by: Dess | Tech Support Engineer, Principal
Comments: 2
Category: GanttView
Type: Bug Report
0
To reproduce: use the following code snippet and try to drag an item or click over a task item:

private ViewModel viewModel;

public Form1()
{
    InitializeComponent();
    viewModel = new ViewModel();
    viewModel.Init();
    viewModel.DateChanged += ViewModelOnDateChanged;

    this.radGanttView1.Ratio = 0.3F;
    this.radGanttView1.SplitterWidth = 7;
    this.radGanttView1.TitleMember = "Name";
    this.radGanttView1.ChildMember = "Id";
    this.radGanttView1.EndMember = "End";
    this.radGanttView1.ParentMember = "ParentId";
    this.radGanttView1.ProgressMember = "Progress";
    this.radGanttView1.StartMember = "Start";
    this.radGanttView1.TaskDataMember = "TimingRows";
    this.radGanttView1.LinkDataMember = "LinkRows";
    this.radGanttView1.LinkStartMember = "StartId";
    this.radGanttView1.LinkEndMember = "EndId";
    this.radGanttView1.LinkTypeMember = "LinkType";

    this.radGanttView1.DataSource = viewModel;

    this.radGanttView1.Click += radGanttView1_Click;
}

private void radGanttView1_Click(object sender, EventArgs e)
{ 
    this.radGanttView1.DataSource = null;
    this.radGanttView1.DataSource = viewModel;
}

private void radGanttView1_MouseEnter(object sender, EventArgs e)
{
    this.radGanttView1.DataSource = null;
    this.radGanttView1.DataSource = viewModel;
}

private void ViewModelOnDateChanged(object sender, EventArgs eventArgs)
{
    BeginInvoke(new Action(() =>
    {
        this.radGanttView1.DataSource = null;
        this.radGanttView1.DataSource = viewModel;
    }));
}

public class ViewModel
{
    public event EventHandler DateChanged;

    public BindingList<TimingRow> TimingRows { get; set; }

    public BindingList<LinkRow> LinkRows { get; set; }

    public ViewModel()
    {
        TimingRows = new BindingList<TimingRow>();
        LinkRows = new BindingList<LinkRow>();
    }

    public void Init()
    {
        AddRow(1, 0, "group", 3, 12);
        AddRow(2, 1, "Test1", 3, 4);
        AddRow(3, 1, "Test2", 7, 8);
        AddLink(2, 3, 1);
    }

    private void AddLink(int p1, int p2, int p3)
    {
        var link = new LinkRow(p1, p2, p3);
        LinkRows.Add(link);
    }

    private void AddRow(int id, int parentId, string name, int addDays, int howLong)
    {
        var row = new TimingRow
        {
            Start = DateTime.Today.AddDays(addDays),
            End = DateTime.Today.AddDays(addDays + howLong),
            Id = id,
            ParentId = parentId,
            Name = name
        };
        row.DateChanged += RowOnDateChanged;
        TimingRows.Add(row);
    }

    private void RowOnDateChanged(object sender, EventArgs eventArgs)
    {
        if (DateChanged != null)
            DateChanged(this, EventArgs.Empty);
    }
}

public class TimingRow
{
    public event EventHandler DateChanged;

    private DateTime start;

    public string Name { get; set; }

    public int Id { get; set; }

    public int ParentId { get; set; }

    public decimal Progress
    {
        get
        {
            return 0;
        }
    }

    public virtual DateTime Start
    {
        get
        {
            return start;
        }
        set
        {
            if (start == value)
                return;
            if (DateChanged != null)
                DateChanged(this, EventArgs.Empty);
            start = value;
        }
    }

    public virtual DateTime End { get; set; }
}

public class LinkRow
{
    public int StartId { get; set; }

    public int EndId { get; set; }

    public int LinkType { get; set; }

    public LinkRow(int startId, int endId, int linkType)
    {
        this.StartId = startId;
        this.EndId = endId;
        this.LinkType = linkType;
    }
}
---------------------------------------------------------------------------------
WORKAROUND:

private void radGanttView1_CreateDataItem(object sender, Telerik.WinControls.UI.CreateGanttDataItemEventArgs e)
{
    e.Item = new CustomGanttViewDataItem();
}

public class CustomGanttViewDataItem : GanttViewDataItem
{
    protected override void OnNotifyPropertyChanged(PropertyChangedEventArgs e)
    {
        if (this.GanttViewElement != null)
        {
            base.OnNotifyPropertyChanged(e);
        }
    }
}

public class CustomGanttView : RadGanttView
{
    public override string ThemeClassName
    {
        get
        {
            return typeof(RadGanttView).FullName;
        }
    }

    protected override RadGanttViewElement CreateGanttViewElement()
    {
        return new CustomRadGanttViewElement();
    }
}

public class CustomRadGanttViewElement : RadGanttViewElement
{
    protected override Type ThemeEffectiveType
    {
        get
        {
            return typeof(RadGanttViewElement);
        }
    }

    protected override GanttViewGraphicalViewElement CreateGraphicalViewElement(RadGanttViewElement ganttView)
    {
        return new CustomGanttViewGraphicalViewElement(ganttView);
    }
}

public class CustomGanttViewGraphicalViewElement : GanttViewGraphicalViewElement
{
    protected override Type ThemeEffectiveType
    {
        get
        {
            return typeof(GanttViewGraphicalViewElement);
        }
    }

    public CustomGanttViewGraphicalViewElement(RadGanttViewElement ganttView) : base(ganttView)
    {
    }

    protected override IVirtualizedElementProvider<GanttViewDataItem> CreateElementProvider()
    {
        return new CustomGanttViewVirtualizedElementProvider(this);
    }
}

public class CustomGanttViewVirtualizedElementProvider : GanttViewVirtualizedElementProvider
{
    GanttViewBaseViewElement owner;

    public CustomGanttViewVirtualizedElementProvider(GanttViewBaseViewElement owner) : base(owner)
    {
        this.owner = owner;
    }

    public override IVirtualizedElement<GanttViewDataItem> CreateElement(GanttViewDataItem data, object context)
    {
        GanttViewBaseItemElement element = this.OnItemElementCreating(data);

        if (element != null)
        {
            return element;
        }

        if (owner is GanttViewTextViewElement)
        {
            return new GanttViewTextItemElement(owner as GanttViewTextViewElement);
        }
        else
        {
            if (data.Items.Count > 0)
            {
                return new GanttViewSummaryItemElement(this.owner as GanttViewGraphicalViewElement);
            }
            else if (data.Start == data.End)
            {
                return new GanttViewMilestoneItemElement(this.owner as GanttViewGraphicalViewElement);
            }

            return new CustomGanttViewTaskItemElement(this.owner as GanttViewGraphicalViewElement);
        }
    }
}

public class CustomGanttViewTaskItemElement : GanttViewTaskItemElement
{
    public CustomGanttViewTaskItemElement(GanttViewGraphicalViewElement owner) : base(owner)
    {
    }

    public override void Synchronize()
    {
        if (this.Data.GanttViewElement != null)
        {
            base.Synchronize();
        }
    }
}
Completed
Last Updated: 29 Apr 2016 07:31 by ADMIN
ADMIN
Created by: Hristo
Comments: 0
Category: GanttView
Type: Bug Report
0
How to reproduce:
1. Subscribe to radGanttView DoubleClick event.
2. Double click at any point on ragGanttView

Woraround:
1. Create a custom RadGanttView and override the OnMouseDoubleClick method
public class MyRadGanttView : RadGanttView
{

    protected override void OnMouseDoubleClick(MouseEventArgs e)
    {
        if (this.GanttViewElement.ProcessDoubleClick(e))
        {
            return;
        }

        MouseEventHandler item = (MouseEventHandler)base.Events[typeof(Control).GetField("EventMouseDoubleClick", BindingFlags.NonPublic | BindingFlags.Static).GetValue(this)];
        if (item != null)
        {
            item(this, e);
        }
    }
}

Completed
Last Updated: 12 Dec 2017 14:33 by ADMIN
Completed
Last Updated: 11 Jan 2016 10:48 by ADMIN
How to reproduce: refer to the attached project

Workaround: reset the data source
private void Button1_Click(object sender, EventArgs e)
{
	this.RadGanttView1.DataSource = null;

	//TODO: This line of code loads data into the 'WeddingPlannerDataSet.Tasks' table. You can move, or remove it, as needed.
	this.TasksTableAdapter.Fill(this.WeddingPlannerDataSet.Tasks);
	//TODO: This line of code loads data into the 'WeddingPlannerDataSet.Links' table. You can move, or remove it, as needed.
	this.LinksTableAdapter.Fill(this.WeddingPlannerDataSet.Links);

	this.RadGanttView1.GanttViewElement.DataSource = this.WeddingPlannerDataSet 
}
Unplanned
Last Updated: 29 Mar 2016 14:25 by ADMIN
ADMIN
Created by: Dess | Tech Support Engineer, Principal
Comments: 0
Category: GanttView
Type: Bug Report
1
To reproduce:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'TODO: This line of code loads data into the 'WeddingPlannerDataSet.Tasks' table. You can move, or remove it, as needed.
    Me.TasksTableAdapter.Fill(Me.WeddingPlannerDataSet.Tasks)
    'TODO: This line of code loads data into the 'WeddingPlannerDataSet.Links' table. You can move, or remove it, as needed.
    Me.LinksTableAdapter.Fill(Me.WeddingPlannerDataSet.Links)


    Me.RadGanttView1.GanttViewElement.TaskDataMember = "Tasks"
    Me.RadGanttView1.GanttViewElement.ChildMember = "Id"
    Me.RadGanttView1.GanttViewElement.ParentMember = "ParentId"
    Me.RadGanttView1.GanttViewElement.TitleMember = "Title"
    Me.RadGanttView1.GanttViewElement.StartMember = "Start"
    Me.RadGanttView1.GanttViewElement.EndMember = "End"
    Me.RadGanttView1.GanttViewElement.ProgressMember = "Progress"
    Me.RadGanttView1.GanttViewElement.LinkDataMember = "Links"
    Me.RadGanttView1.GanttViewElement.LinkStartMember = "StartId"
    Me.RadGanttView1.GanttViewElement.LinkEndMember = "EndId"
    Me.RadGanttView1.GanttViewElement.LinkTypeMember = "LinkType"

    Me.RadGanttView1.GanttViewElement.DataSource = Me.WeddingPlannerDataSet

    Me.RadGanttView1.Columns.Add("Start")
    Me.RadGanttView1.Columns.Add("End")

    Me.RadGanttView1.Ratio = 0.3
    Me.RadGanttView1.GanttViewElement.GraphicalViewElement.TimelineStart = New DateTime(2006, 8, 20)
    Me.RadGanttView1.GanttViewElement.GraphicalViewElement.TimelineEnd = New DateTime(2007, 4, 2)

    AddHandler Me.RadGanttView1.ItemChildIdNeeded, AddressOf ItemChildIdNeeded
    AddHandler Me.RadGanttView1.ItemAdding, AddressOf ItemAdding
    AddHandler Me.RadGanttView1.ItemAdded, AddressOf ItemAdded
End Sub
Dim integerIdCounter As Integer = 200
Private Sub ItemChildIdNeeded(sender As Object, e As Telerik.WinControls.UI.GanttViewItemChildIdNeededEventArgs)
    Me.integerIdCounter += 1
    e.ChildId = Me.integerIdCounter
End Sub

Workaround:
AddHandler Me.RadGanttView1.ContextMenuOpening, AddressOf RadGanttView1_ContextMenuOpening

 Private Sub RadGanttView1_ContextMenuOpening(sender As Object, e As Telerik.WinControls.UI.GanttViewContextMenuOpeningEventArgs)
     Dim item As RadMenuItem = DirectCast(e.Menu.Items(0), RadMenuItem)
     AddHandler item.Items(0).Click, AddressOf ItemClick
 End Sub

 Private Sub ItemClick(sender As Object, e As EventArgs)
     Me.RadGanttView1.GanttViewElement.GraphicalViewElement.Update(Telerik.WinControls.UI.RadGanttViewElement.UpdateActions.ExpandedChanged)
 End Sub
Unplanned
Last Updated: 15 Aug 2017 10:02 by ADMIN
ADMIN
Created by: Hristo
Comments: 2
Category: GanttView
Type: Feature Request
1

			
Unplanned
Last Updated: 15 Aug 2017 10:02 by pedro henrique
Currently when you set the TimelineRange property to TimeRange.Week displays two elements (the TopElement with weeks and the BottomElement with days). There are cases where users want to display single timeline - only weeks, days, quarters or years independent of the second timeline.  
Completed
Last Updated: 05 Aug 2015 11:35 by ADMIN
If one subscribes to the TimelineItemElementCreating and provides custom item elements for the timeline these elements are not used and default item elements are used instead.

WORKAROUND:

Create a custom element provider:

public class CustomGanttViewTimelineElementProvider : GanttViewTimelineElementProvider
{
    public CustomGanttViewTimelineElementProvider(GanttViewGraphicalViewElement owner)
        : base(owner)
        { }

    public override IVirtualizedElement<GanttViewTimelineDataItem> CreateElement(GanttViewTimelineDataItem data, object context)
        {
            GanttViewTimelineItemElement element = this.OnItemElementCreating(data);

            if (element != null)
            {
                return element;
            }

            return new GanttViewTimelineItemElement(data, this.Owner);
        }
}

and assign it to the timeline container element provider:

this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineContainer.ElementProvider = new CustomGanttViewTimelineElementProvider(this.radGanttView1.GanttViewElement.GraphicalViewElement);
Unplanned
Last Updated: 31 Mar 2016 12:44 by ADMIN
Workaround: 
 Sub New()

        InitializeComponent()

        Me.SetUpGantt()

        Me.RadGanttView1.GanttViewElement.TextViewElement.Scroller.AllowHiddenScrolling = True

        AddHandler Me.RadGanttView1.MouseUp, AddressOf Me.RadGanttView1_MouseUp
    End Sub

Private Sub RadGanttView1_MouseUp(sender As Object, e As MouseEventArgs)
        Dim location = e.Location

        Dim splitter As GanttViewViewsSplitterElement = TryCast(Me.RadGanttView1.ElementTree.GetElementAtPoint(e.Location), GanttViewViewsSplitterElement)
        If splitter IsNot Nothing Then
            Me.RadGanttView1.GanttViewElement.TextViewElement.Scroller.Scrollbar.Value = Me.RadGanttView1.GanttViewElement.GraphicalViewElement.VScrollBar.Value
        End If
    End Sub
Unplanned
Last Updated: 15 Aug 2017 10:02 by ADMIN
The position of splitter should allow to be fixed while resizing the control. Users want to be able to set the splitter next to the last column of TextViewElement when resizing. 
Unplanned
Last Updated: 29 Mar 2016 14:24 by ADMIN
Please look at the attached screenshot.

Workaround: you can replace the StackLayoutElement used in the GanttViewTimelineItemBottomStackElement with a DockLayoutPanel for example as follows:

Public Class CustomGanttViewTimelineItemElement
Inherits GanttViewTimelineItemElement
    Public Sub New(data As GanttViewTimelineDataItem, graphicalViewElement As GanttViewGraphicalViewElement)
        MyBase.New(data, graphicalViewElement)

    End Sub
    Dim dock As DockLayoutPanel
    Protected Overrides Sub CreateChildElements()
        MyBase.CreateChildElements()
        dock = New DockLayoutPanel()
        dock.StretchHorizontally = True
        dock.LastChildFill = False
        Me.Children.RemoveAt(Me.Children.Count - 1)
        Me.Children.Add(dock)
    End Sub

    Protected Overrides Sub CalculateItems()
        Me.SuspendLayout()

        Dim cellInfo As GanttTimelineCellsInfo = Me.GraphicalViewElement.TimelineBehavior.GetTimelineCellInfoForItem(Me.Data, Me.GraphicalViewElement.TimelineRange)

        While Me.dock.Children.Count > cellInfo.NumberOfcells
            Me.dock.Children.RemoveAt(0)
        End While

        While Me.dock.Children.Count < cellInfo.NumberOfcells
            Dim element As LightVisualElement = Me.GraphicalViewElement.TimelineBehavior.CreateElement()
            Me.dock.Children.Add(element)
        End While

        Me.TopElement.Text = Me.GraphicalViewElement.TimelineBehavior.GetTimelineTopElementText(Me.Data)

        For i As Integer = 0 To Me.dock.Children.Count - 1
            DirectCast(Me.dock.Children(i), LightVisualElement).Text = Me.GraphicalViewElement.TimelineBehavior.GetTimelineBottomElementText(Me.Data, i + cellInfo.StartIndex)
        Next

        Me.ResumeLayout(True)
    End Sub

    Protected Overrides Function MeasureOverride(availableSize As SizeF) As SizeF
        Dim clientRect As RectangleF = Me.GetClientRectangle(availableSize)
        Dim width As Single = Me.Data.Width - Me.GraphicalViewElement.TimelineContainer.ItemSpacing + availableSize.Width - clientRect.Width

        Me.TopElement.Measure(New SizeF(width, clientRect.Height / 2.0F))
        Me.dock.Measure(New SizeF(width, clientRect.Height / 2.0F))

        Return New SizeF(width, Me.TopElement.DesiredSize.Height + Me.dock.DesiredSize.Height)
    End Function

    Protected Overrides Function ArrangeOverride(finalSize As SizeF) As SizeF
        Dim clientRect As RectangleF = Me.GetClientRectangle(finalSize)

        Dim topRect As New RectangleF(clientRect.X, clientRect.Y, Me.DesiredSize.Width, clientRect.Height / 2.0F)
        Me.TopElement.Arrange(topRect)
        Dim bottomRect As New RectangleF(clientRect.X, topRect.Bottom, Me.DesiredSize.Width, clientRect.Height - topRect.Height)
        Me.dock.Arrange(bottomRect)

        Return clientRect.Size
    End Function
End Class

Public Class CustomGanttViewTimelineElementProvider
Inherits GanttViewTimelineElementProvider

    Public Sub New(owner As GanttViewGraphicalViewElement)
        MyBase.New(owner)

    End Sub
    Public Overrides Function CreateElement(data As GanttViewTimelineDataItem, context As Object) As IVirtualizedElement(Of GanttViewTimelineDataItem)
        Dim element As GanttViewTimelineItemElement = Me.OnItemElementCreating(data)

        Return New CustomGanttViewTimelineItemElement(data, Owner)
    End Function
End Class
Completed
Last Updated: 30 Jun 2015 13:31 by ADMIN
This event should be fired when a task is modified either by the graphical view or by the columns on the left side. In the arguments you should have access to the changed property.
Completed
Last Updated: 13 Apr 2016 13:18 by ADMIN
To reproduce: 
1. Drag and drop RadGanttView on the form
2. Populate with tasks and set the ReadOnly property to true. 
3. Run the application and you will see that you can add links

Workaround: 
Disable adding of links:
void radGanttView2_LinkAdding(object sender, GanttViewLinkAddingEventArgs e)
{
    e.Cancel = true;
}
Completed
Last Updated: 01 Jun 2015 10:34 by ADMIN
To reproduce:
public RadForm1()
{
    InitializeComponent();
    DataTable tasks = new DataTable("Tasks");
    tasks.Columns.Add("Id", typeof(int));
    tasks.Columns.Add("ParentId", typeof(int));
    tasks.Columns.Add("Title", typeof(string));
    tasks.Columns.Add("Start", typeof(DateTime));
    tasks.Columns.Add("End", typeof(DateTime));
    tasks.Columns.Add("Progress", typeof(decimal));

    DataTable links = new DataTable("Links");
    links.Columns.Add("StartId", typeof(int));
    links.Columns.Add("EndId", typeof(int));
    links.Columns.Add("LinkType", typeof(int));

    tasks.Rows.Add(1, 0, "Summary task title", new DateTime(2010, 10, 8), new DateTime(2010, 10, 18), 30m);
    tasks.Rows.Add(2, 1, "First child task title", new DateTime(2010, 10, 10), new DateTime(2010, 10, 12), 10);
    tasks.Rows.Add(3, 1, "Second child task title", new DateTime(2010, 10, 12), new DateTime(2010, 10, 15), 20m);
    tasks.Rows.Add(4, 1, "Milestone", new DateTime(2010, 10, 15), new DateTime(2010, 10, 15), 0m);

    links.Rows.Add(2, 3, 1);
    links.Rows.Add(3, 4, 1);

    DataSet data = new DataSet();
    data.Tables.Add(tasks.Copy());
    data.Tables.Add(links);

    this.radGridView1.DataSource = tasks;
    radGridView1.BestFitColumns();

    this.radGanttView1.CreateDataItem += radGanttView1_CreateDataItem;
    this.radGanttView1.AllowSummaryEditing = true;
    this.radGanttView1.GanttViewElement.TaskDataMember = "Tasks";
    this.radGanttView1.GanttViewElement.ChildMember = "Id";
    this.radGanttView1.GanttViewElement.ParentMember = "ParentId";
    this.radGanttView1.GanttViewElement.TitleMember = "Title";
    this.radGanttView1.GanttViewElement.StartMember = "Start";
    this.radGanttView1.GanttViewElement.EndMember = "End";
    this.radGanttView1.GanttViewElement.ProgressMember = "Progress";
    this.radGanttView1.GanttViewElement.LinkDataMember = "Links";
    this.radGanttView1.GanttViewElement.LinkStartMember = "StartId";
    this.radGanttView1.GanttViewElement.LinkEndMember = "EndId";
    this.radGanttView1.GanttViewElement.LinkTypeMember = "LinkType";

    this.radGanttView1.GanttViewElement.DataSource = data;

    this.radGanttView1.Columns.Add("Start");
    this.radGanttView1.Columns.Add("End");
    this.radGanttView1.Columns.Add("Progress");

    this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineStart = new DateTime(2010, 10, 7);
    this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineEnd = new DateTime(2010, 12, 10);
}
You will notice that the start and end of the summary task are changed in the gantt view.

Workaround:
void radGanttView1_CreateDataItem(object sender, CreateGanttDataItemEventArgs e)
{
    e.Item = new MyGanttViewDataItem();
}

public class MyGanttViewDataItem : GanttViewDataItem
{
    protected override void OnChildAdded(GanttViewDataItem child)
    {
        if (this.Parent != null && !this.GanttViewElement.AllowSummaryEditing)
        {
            base.OnChildAdded(child);
        }
    }

    protected override void OnChildRemoved(GanttViewDataItem child)
    {
        if (this.Parent != null && !this.GanttViewElement.AllowSummaryEditing)
        {
            base.OnChildRemoved(child);
        }
    }
}