I'm having some problems with the telerik:RadGanttView control. I believe this to be a problem specific to the Telerik toolkit UI for WPF, but I'll explain the issue as detailed as possible so others might be able to suggest a workaround if they can think of one.
TLDR;
The GanttView has the possibility to display recurring tasks by placing each recurrence as a child inside a single parent event. Now my project requires me to nest this recurring task series into another parent event container.
When selecting a recurring task event that is part of a nested hierarchy (of at least 2 levels deep), the application will throw a System.NullReferenceException
and crash.
More specifically, this error occurs only when all parent nodes are collapsed. If only the top node is collapsed and the other child-nodes are still expanded, the problem does not occur.
This is the StackTrace of the System.NullReferenceException
:
System.NullReferenceException was caught
at System.Collections.Generic.Dictionary'2.Add(TKey key, TValue value)
at Telerik.Windows.Rendering.VirtualizedGridPanel.Handler.SetArrangeRect(Int32 column, Int32 row, Rect rect) at Telerik.Windows.Rendering.Internal.GridRenderingHelper.MeasureItemsCore(Rect viewport, IGridContainersHandler handler)
at Telerik.Windows.Rendering.Internal.GridRenderingHelper.MeasureItems(Rect viewport, IGridContainersHandler handler)
at Telerik.Windows.Rendering.VirtualizedGridPanel.MeasureContainers(IContainerRecycler recycler, Size availableSize)
at Telerik.Windows.Rendering.Virtualization.VirtualizedPanel.MeasureOverrideCore(Size availableSize)
at Telerik.Windows.Rendering.ScrollablePanel.MeasureOverride(Size availableSize)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at Telerik.Windows.Controls.GanttPresenterPanel.MeasureContainer(UIElement container, Size measureSize)
at Telerik.Windows.Controls.GanttPresenterPanel.MeasureOverride(Size availableSize)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
Detailed description:
I've based my code on the RecurringTask_WPF example project.
I was able to get my desired visual result but I've stumbled upon an action that causes my application to crash.
This makes it pretty much unusable, so I need to find a solution or at least a way to catch the exception and prevent it from crashing.
I've been able to pinpoint the cause of my problem, but have been unable to solve this by myself.
Let me start by describing my current situation/environment.
In the default RecurringTask_WPF example project, if you collapse the "Recurrence Series" (the parent tree node) then you can see all the child recurring tasks next to each other.
When you click on one of the events, so for example: "Recurrence 1" block (in the TimeRuler Part of the RadGanttView), then this specific recurring task gets selected. This causes the tree node to be expanded automatically and the selected task/event becomes highlighted.
This behaviour works perfectly as intended and I wish to keep it like that exactly.
However once you nest recurring tasks into one extra level of hierarchy, which is on my requirements, an exception is thrown and the program stops working.
First I'll give you the code that changes the example project in order to recreate the problem. (This should also help with explaining the exact problem further)
You should replace the GetTasks()
method of the ViewModel.cs with the code below:
private ObservableCollection<IGanttTask> GetTasks()
{
var collection = new ObservableCollection<IGanttTask>();
var today = DateTime.Today.AddHours(8);
var child1 = new RecurrenceTask(today, today.AddHours(4), "Recurrence 1");
var child2 = new RecurrenceTask(today.AddHours(0), today.AddHours(12), "Recurrence 2");
var child3 = new RecurrenceTask(today.AddHours(13), today.AddHours(20), "Recurrence 3");
var task2 = new RecurrenceTask(today.AddHours(13), today.AddHours(20), "Recurrence Series2")
{
Children = { child3 }
};
var task1 = new RecurrenceTask(today, today.AddHours(20), "Recurrence Series1")
{
Children = { child1, child2, task2 }
};
collection.Add(task1);
var taskWithoutRecurrence = new GanttTask(today.AddHours(8), today.AddHours(13), "Task Without Recurrence");
taskWithoutRecurrence.Children.Add(new GanttTask(today.AddHours(9), today.AddHours(12), "Child Task"));
collection.Add(taskWithoutRecurrence);
return collection;
}
When you run this example with these code changes, you should see that the "Recurrence 3" task now is moved into a new "Recurrence Series2".
This new series is also a child of the original "Recurrence Series1".
So when then all the nodes become collapsed you can still see all child recurrences next to each other.
If you now click on the "Recurrence 3" event (in the TimeRuler Part of the RadGanttView) the application will throw the System.NullReferenceException
(StackTrace above).
Here are some other observations that might help you find the exact cause of this problem and a possible solution/workaround:
It would seem that the problem only occurs when nested nodes are collapsed and a child task of a hierarchy that is at least 2 levels deep gets selected.
I would just like to find a way to stop my program from crashing.
I've tried handling click events in order to prevent the user from clicking on events in the TimeRuler Part of the RadGanttView, but I wasn't able to figure out how to do this correctly and I would also still like to keep the behaviour of the automatic expanding and selecting the clicked task.
I've also tried to implement a click-command, this showed me that the expanding actually works correctly and the exception only occurs afterwards.
Any help/suggestions are greatly appreciated.
I've reported this issue on the official Telerik forum and received the following response:
I checked your description and I can confirm that there are two separate issues that can be reproduced with the provided steps. I logged two issues in our feedback portal and updated your Telerik points.
- GanttView: ArgumentNullException thrown when select an item in a scenario with nested items
- GanttView: NullReferenceException thrown when hover an item in a scenario with nested items
I am afraid currently, I cannot suggest a workaround for resolving this. That's why I would recommend you to follow the items in the portal.
Regards,
Martin Ivanov
Progress Telerik
I know answering your own question is frowned upon. However, I'll follow the development and will update this answer if anything changes.
If anyone else finds a workaround before this gets fixed, please do share.