Completed
Last Updated: 20 Jan 2015 14:49 by ADMIN
ADMIN
Hristo
Created on: 07 Jan 2015 16:17
Category: GanttView
Type: Bug Report
0
FIX. RadGanttView - ArgumentOutOfRange exception when scrolling the graphical view
To reproduce: 
 public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

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

        this.FillGanttViewWithData();
    }

    private void radGanttView1_SelectedItemChanged(object sender, GanttViewSelectedItemChangedEventArgs e)
    {
        var dateToFocus = e.Item.Start;
        this.radGanttView1.GanttViewElement.GraphicalViewElement.ScrollTo(dateToFocus);
    }

    private void FillGanttViewWithData()
    {
        //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);
    }
}

Workaround: 
public class CustomGanttView : RadGanttView
{
    protected override RadGanttViewElement CreateGanttViewElement()
    {
        return new CustomGanttViewElement();
    }

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

public class CustomGanttViewElement : RadGanttViewElement
{
    protected override GanttViewGraphicalViewElement CreateGraphicalViewElement(RadGanttViewElement ganttView)
    {
        return new CustomGanttViewGraphicalViewElement(this);
    }

    protected override Type ThemeEffectiveType
    {
        get { return typeof(RadGanttViewElement); }
    }
}

public class CustomGanttViewGraphicalViewElement : GanttViewGraphicalViewElement
{

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

    protected override Type ThemeEffectiveType
    {
        get { return typeof(GanttViewGraphicalViewElement); }
    }

    public override bool ScrollTo(DateTime dateTime)
    {
        if (dateTime < this.TimelineBehavior.AdjustedTimelineStart || dateTime > this.TimelineBehavior.AdjustedTimelineEnd)
        {
            return false;
        }

        float halfViewWidth = (float)this.ViewElement.Size.Width / 2f;
        float x = (float)((dateTime - this.TimelineBehavior.AdjustedTimelineStart).TotalSeconds / this.OnePixelTime.TotalSeconds);
        x -= halfViewWidth;

        if (x < 0)
        {
            this.TimelineScroller.Scrollbar.Value = this.TimelineScroller.Scrollbar.Minimum;
        }
        else if (x > this.TimelineScroller.Scrollbar.Maximum)
        {
            this.TimelineScroller.Scrollbar.Value = this.TimelineScroller.Scrollbar.Maximum - this.TimelineScroller.Scrollbar.LargeChange;
        }
        else
        {
            this.TimelineScroller.Scrollbar.Value = (int)x;
        }

        return true;
    }
}
0 comments