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.


Completed
Last Updated: 12 Dec 2017 14:33 by ADMIN
Unplanned
Last Updated: 20 Nov 2017 15:34 by ADMIN
How to reproduce:

1. Run the project 
2. Press the radButton1 
3. Edit description of the first line (Line whose Identifier is TestProject1) 
4. Clicking some other line to end the edit causes the ASSERT to come up 
Unplanned
Last Updated: 11 Oct 2017 07:53 by Longnd
ADMIN
Created by: Dess | Tech Support Engineer, Principal
Comments: 1
Category: GanttView
Type: Feature Request
2
Add possibility to specify the start and end hours when you display hours in the applied time scale. 
Completed
Last Updated: 27 Sep 2017 10:52 by ADMIN
How to reproduce: 
public partial class RadForm1 : Telerik.WinControls.UI.RadForm
    {
        public RadForm1()
        {
            InitializeComponent();

            this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineStart = new DateTime(2010, 10, 9);
            this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineEnd = new DateTime(2010, 12, 10);

            //setup data items
            GanttViewDataItem item1 = new GanttViewDataItem();
            item1.Start = new DateTime(2010, 10, 10);
            item1.End = new DateTime(2010, 10, 15);
            item1.Progress = 30m;
            item1.Title = "Summary task.1. title";

            GanttViewDataItem subitem11 = new GanttViewDataItem();
            subitem11.Start = new DateTime(2010, 10, 10);
            subitem11.End = new DateTime(2010, 10, 12);
            subitem11.Progress = 10m;
            subitem11.Title = "Sub-task.1.1 title";

            GanttViewDataItem subitem12 = new GanttViewDataItem();
            subitem12.Start = new DateTime(2010, 10, 12);
            subitem12.End = new DateTime(2010, 10, 15);
            subitem12.Progress = 20m;
            subitem12.Title = "Sub-task.1.2 title";

            //add subitems
            item1.Items.Add(subitem11);
            item1.Items.Add(subitem12);

            this.radGanttView1.Items.Add(item1);

            GanttViewDataItem item2 = new GanttViewDataItem();
            item2.Start = new DateTime(2010, 10, 12);
            item2.End = new DateTime(2010, 10, 18);
            item2.Progress = 40m;
            item2.Title = "Summary task.2. title";

            GanttViewDataItem subitem21 = new GanttViewDataItem();
            subitem21.Start = new DateTime(2010, 10, 12);
            subitem21.End = new DateTime(2010, 10, 13);
            subitem21.Progress = 10m;
            subitem21.Title = "Sub-task.2.1 title";

            GanttViewDataItem subitem22 = new GanttViewDataItem();
            subitem22.Start = new DateTime(2010, 10, 13);
            subitem22.End = new DateTime(2010, 10, 18);
            subitem22.Progress = 30m;
            subitem22.Title = "Sub-task.2.2 title";

            GanttViewDataItem subitem23 = new GanttViewDataItem();
            subitem23.Start = new DateTime(2010, 10, 18);
            subitem23.End = new DateTime(2010, 10, 18);
            subitem23.Title = "Sub-task.2.3 title";

            //add subitems
            item2.Items.Add(subitem21);
            item2.Items.Add(subitem22);
            item2.Items.Add(subitem23);

            this.radGanttView1.Items.Add(item2);

            //add links between items
            GanttViewLinkDataItem link1 = new GanttViewLinkDataItem();
            link1.StartItem = subitem11;
            link1.EndItem = subitem12;
            link1.LinkType = TasksLinkType.FinishToStart;
            this.radGanttView1.Links.Add(link1);

            GanttViewLinkDataItem link2 = new GanttViewLinkDataItem();
            link2.StartItem = subitem21;
            link2.EndItem = subitem22;
            link2.LinkType = TasksLinkType.StartToStart;
            this.radGanttView1.Links.Add(link2);

            GanttViewLinkDataItem link3 = new GanttViewLinkDataItem();
            link3.StartItem = subitem22;
            link3.EndItem = subitem23;
            link3.LinkType = TasksLinkType.FinishToStart;
            this.radGanttView1.Links.Add(link3);

            GanttViewTextViewColumn titleColumn = new GanttViewTextViewColumn("Title");
            GanttViewTextViewColumn startColumn = new GanttViewTextViewColumn("Start");
            GanttViewTextViewColumn endColumn = new GanttViewTextViewColumn("End");

            this.radGanttView1.GanttViewElement.Columns.Add(titleColumn);
            this.radGanttView1.GanttViewElement.Columns.Add(startColumn);
            this.radGanttView1.GanttViewElement.Columns.Add(endColumn);

            this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineStart = new DateTime(2010, 10, 13);
        }

        private void radButton1_Click(object sender, EventArgs e)
        {
            RadPrintDocument doc = new RadPrintDocument();
            doc.Landscape = true;
            RadPrintPreviewDialog dialog = new RadPrintPreviewDialog();
            doc.AssociatedObject = this.radGanttView1;
            dialog.Document = doc;
            dialog.ShowDialog();
        }
    }

Workaround: create a custom RadGanttView
public class MyRadGanttView : RadGanttView
{
    public override string ThemeClassName
    {
        get
        {
            return typeof(RadGanttView).FullName;
        }
    }

    protected override PointF[] GetElementShape(GanttViewPrintElementContext context, RectangleF rect)
    {
        if (shouldPaintStartCap)
        {
            return base.GetElementShape(context, rect);
        }

        switch (context)
        {
            case GanttViewPrintElementContext.SummaryTaskElement:
                PointF[] summaryPoints = new PointF[5];
                summaryPoints[0] = rect.Location;
                summaryPoints[1] = new PointF(rect.X, rect.Y + rect.Height / 4f);
                summaryPoints[2] = new PointF(rect.Right - 3, rect.Y + rect.Height / 4f);
                summaryPoints[3] = new PointF(rect.Right, rect.Y + rect.Height / 2f);
                summaryPoints[4] = new PointF(rect.Right, rect.Y);
                
                return summaryPoints;
            case GanttViewPrintElementContext.MilestoneElement:
                PointF[] milestonePoints = new PointF[4];
                milestonePoints[0] = new PointF(rect.X, rect.Y);
                milestonePoints[1] = new PointF(rect.X + rect.Height / 2f, rect.Y + rect.Height / 2f);
                milestonePoints[2] = new PointF(rect.X, rect.Y + rect.Height);
                milestonePoints[3] = new PointF(rect.X - rect.Height / 2f, rect.Y + rect.Height / 2f);

                return milestonePoints;
            default:
                return null;
        }
    }

    private bool shouldPaintStartCap;
    protected override RectangleF GetPrintRectangle(GanttViewDataItem item, int index)
    {
        if (index < 0)
        {
            return RectangleF.Empty;
        }
        
        float x = (float)((item.Start - this.GanttViewElement.GraphicalViewElement.TimelineBehavior.AdjustedTimelineStart).TotalSeconds / this.GanttViewElement.GraphicalViewElement.OnePixelTime.TotalSeconds);
        this.shouldPaintStartCap = x > 0 ? true : false;
        x = Math.Max(x, 0);

        float y = index * (this.GanttViewElement.ItemHeight + this.GanttViewElement.ItemSpacing) + this.GanttViewElement.HeaderHeight;
        float width = (float)((item.End - item.Start).TotalSeconds / (float)this.GanttViewElement.GraphicalViewElement.OnePixelTime.TotalSeconds);

        return new RectangleF(x, y, width, (this.GanttViewElement.ItemHeight + this.GanttViewElement.ItemSpacing));
    }
}

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();
}
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.  
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: 15 Aug 2017 10:02 by ADMIN
Add functionality to filter items in RadGanttView. 
Unplanned
Last Updated: 15 Aug 2017 10:02 by ADMIN
Unplanned
Last Updated: 15 Aug 2017 09:45 by ADMIN
ADMIN
Created by: Dess | Tech Support Engineer, Principal
Comments: 0
Category: GanttView
Type: Feature Request
1
Add functionality to perform grouping over the columns in the GanttViewTextViewElement . As a result the GraphicalViewElement should be refreshed accordingly.
Unplanned
Last Updated: 15 Aug 2017 09:45 by ADMIN
ADMIN
Created by: Dess | Tech Support Engineer, Principal
Comments: 5
Category: GanttView
Type: Feature Request
3

			
Unplanned
Last Updated: 15 Aug 2017 09:41 by ADMIN
ADMIN
Created by: Georgi I. Georgiev
Comments: 0
Category: GanttView
Type: Feature Request
2
Add a support for image column in RadGanttView
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();
    }
}
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();
        }
    }
}