4 Answers, 1 is accepted
Thank you for writing.
To achieve a functionality as described in your request, you would need to subscribe to the SelectedItemChanged event and in the handler scroll the timeline to the date of the selected item:
private
void
radGanttView1_SelectedItemChanged(
object
sender, GanttViewSelectedItemChangedEventArgs e)
{
var dateToScroll = e.Item.Start;
this
.radGanttView1.GanttViewElement.GraphicalViewElement.ScrollTo(dateToScroll);
}
Further looking into your case I encountered a bug which I logged into our feedback portal. You can track its progress, subscribe for status changes and add your vote/comment to it on the following link - feedback item.
This bug would make your application throw an ArgumentOutOfRangeException when you click on a data item and you want to scroll the timeline so that this item becomes visible. Please have in mind that this issue would only appear for data items with a starting date close to the TimelineStart date.
The possible workaround is to create a CustomGanttView, CustomGanttViewElement and CustomGanttViewGraphicalViewElement where you should override the ScrollTo method. Please find below a code snippet with a sample implementation:
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
;
}
}
public
class
CustomGanttViewElement : RadGanttViewElement
{
protected
override
GanttViewGraphicalViewElement CreateGraphicalViewElement(RadGanttViewElement ganttView)
{
return
new
CustomGanttViewGraphicalViewElement(
this
);
}
protected
override
Type ThemeEffectiveType
{
get
{
return
typeof
(RadGanttViewElement); }
}
}
public
class
CustomGanttView : RadGanttView
{
protected
override
RadGanttViewElement CreateGanttViewElement()
{
return
new
CustomGanttViewElement();
}
public
override
string
ThemeClassName
{
get
{
return
typeof
(RadGanttView).FullName; }
}
}
I hope that this information is useful. Should you have further questions please do not hesitate to write back.
Regards,
Hristo
Telerik
Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.
Hristo,
I have not been able to log into the foruns for several days so I will try replying by email….
Thanks Hristo,
I had actually tried ScrollTo()
before writing and was encountering the error - which your workaround
fixed Thanks!. One more questions – I only want to scroll if the Graphical
view element is not already completely visible. How can I test for this?
Currently it scrolls even when the
element is already fully visible.
Thanks ,
John
Thank you for writing back.
In order to scroll only to items which are not visible or not completely visible you should slightly modify the contents of the SelectedItemChanged event to which you subscribed last time. Please see my code snippet below:
private
void
radGanttView1_SelectedItemChanged(
object
sender, GanttViewSelectedItemChangedEventArgs e)
{
foreach
(GanttGraphicalViewBaseItemElement item
in
this
.radGanttView1.GanttViewElement.GraphicalViewElement.Children.First().Children)
{
if
(item !=
null
&& e.Item == item.Data)
{
Rectangle bounds = item.TaskElement.ControlBoundingRectangle;
if
(!
this
.radGanttView1.GanttViewElement.GraphicalViewElement.ControlBoundingRectangle.Contains(bounds))
{
var scrollBarValue =
this
.radGanttView1.GanttViewElement.GraphicalViewElement.HorizontalScrollBarElement.Value;
var dateToScroll = e.Item.Start;
this
.radGanttView1.GanttViewElement.GraphicalViewElement.ScrollTo(dateToScroll);
}
}
}
}
I am also sending you a .gif showing the behavior of the control on my side.
I hope this helps. Should you have further questions please do not hesitate to write back.
Regards,
Hristo
Telerik
Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.