We use the ScheduleView as a planning and scheduling tool.
We need to do some advanced filtering of the appointments.
Our appointments are also extended with some more properties that we want to filter on.
How would you suggest we do this filtering?
For example we need to filter out like 10 out of 200 employees (Resources) using something like the drop down with checkboxes in Excel.
Can we use the RadDataFilter component somehow?
Regards,
Håkan
8 Answers, 1 is accepted
You can use the predicate AppointmentFilter property of the view definition to implement the task. For more details please review our Appointment Filtering example here. Although this is an WPF application the code should works for Silverlight too.
Also for filtering of resources you can use our Grouping and Filtering feature as it is shown here.
Regards,
Rosi
the Telerik team
Thank you for being the most amazing .NET community! Your unfailing support is what helps us charge forward! We'd appreciate your vote for Telerik in this year's DevProConnections Awards. We are competing in mind-blowing 20 categories and every vote counts! VOTE for Telerik NOW >>
I have tried to implement the filtering as you pointed me to in the WPF example, but I can't get it to work.
I have a class (TimeScheduleShift) that extends Appointment with some extra properties, for example EmployeeId and ShiftTypeId.
I use employees as resources.
I also have my own filter control that will return a list of ID's which I the set in the SelectedEmployees property.
My view definition is defined with the property
AppointmentFilter="{Binding AppointmentsFilter}"
Here is my view model:
public
class
TimeSchedulePlanningViewModel : ViewModelBase
{
#region Public properties
private
ObservableCollection<TimeScheduleShift> appointments;
public
ObservableCollection<TimeScheduleShift> Appointments
{
get
{
return
this
.appointments; }
set
{
this
.appointments = value;
this
.OnPropertyChanged(
"Appointments"
);
}
}
private
ObservableCollection<Resource> employeeResources =
new
ObservableCollection<Resource>();
public
ObservableCollection<Resource> EmployeeResources
{
get
{
return
this
.employeeResources; }
set
{
this
.employeeResources = value; }
}
private
ResourceTypeCollection employeeResourceTypeCollection =
new
ResourceTypeCollection();
public
ResourceTypeCollection EmployeeResourceTypes
{
get
{
return
this
.employeeResourceTypeCollection; }
private
set
{
this
.employeeResourceTypeCollection = value; }
}
private
GroupDescriptionCollection employeeGroupDescriptionCollection =
new
GroupDescriptionCollection();
public
GroupDescriptionCollection EmployeeGroupDescriptionCollection
{
get
{
return
this
.employeeGroupDescriptionCollection; }
set
{
this
.employeeGroupDescriptionCollection = value; }
}
private
List<
int
> selectedEmployees =
new
List<
int
>();
public
List<
int
> SelectedEmployees
{
get
{
return
this
.selectedEmployees; }
set
{
this
.selectedEmployees = value;
this
.OnPropertyChanged(
"SelectedEmployees"
);
this
.OnPropertyChanged(
"AppointmentsFilter"
);
}
}
private
List<
int
> selectedShiftTypes =
new
List<
int
>();
public
List<
int
> SelectedShiftTypes
{
get
{
return
this
.selectedShiftTypes; }
set
{
this
.selectedShiftTypes = value;
this
.OnPropertyChanged(
"SelectedShiftTypes"
);
this
.OnPropertyChanged(
"AppointmentsFilter"
);
}
}
#endregion
#region Constructor
public
TimeSchedulePlanningViewModel()
{
this
.Appointments =
new
ObservableCollection<TimeScheduleShift>();
}
#endregion
#region Setup
public
void
SetupEmployeeResources()
{
ResourceType resourceType =
new
ResourceType(
"Employees"
);
resourceType.Resources.AddRange(
this
.EmployeeResources);
employeeResourceTypeCollection.Add(resourceType);
employeeGroupDescriptionCollection.Add(
new
ResourceGroupDescription() { ResourceType = resourceType.Name });
}
#endregion
#region Filters
public
Predicate<TimeScheduleShift> AppointmentsFilter
{
get
{
return
this
.Filter; }
}
private
bool
Filter(IAppointment appointment)
{
TimeScheduleShift shift = appointment
as
TimeScheduleShift;
return
shift !=
null
&&
this
.FilterByEmployee(shift) &&
this
.FilterByShiftType(shift);
}
private
bool
FilterByEmployee(TimeScheduleShift shift)
{
return
this
.SelectedEmployees.Count == 0 ||
this
.SelectedEmployees.Contains(shift.EmployeeId);
}
private
bool
FilterByShiftType(TimeScheduleShift shift)
{
return
this
.SelectedShiftTypes.Count == 0 ||
this
.SelectedShiftTypes.Contains(shift.ShiftTypeId);
}
#endregion
}
When I try to filter, this method is called:
public Predicate<TimeScheduleShift> AppointmentsFilter
but it never goes further than that, i.e. this method is not called:
private bool Filter(IAppointment appointment)
I can't figure out why.
Any ideas?
Regards,
Håkan
I suggest you try with our latest internal build as we introduced a bug that broke this functionality in one of our previous internal builds. The latest internal build should solve the issue. We are sorry for any inconvenience this causes to you.
Regards,
Rosi
the Telerik team
Thank you for being the most amazing .NET community! Your unfailing support is what helps us charge forward! We'd appreciate your vote for Telerik in this year's DevProConnections Awards. We are competing in mind-blowing 20 categories and every vote counts! VOTE for Telerik NOW >>
Does the bug exist there also?
Regards,
Håkan
I suggest you open a support thread and send us your example to test it locally. We will debug it and give you with more detailed instructions how to solve the issue.
Greetings,
Rosi
the Telerik team
Thank you for being the most amazing .NET community! Your unfailing support is what helps us charge forward! We'd appreciate your vote for Telerik in this year's DevProConnections Awards. We are competing in mind-blowing 20 categories and every vote counts! VOTE for Telerik NOW >>
I thinkt it's quite impossible for me to send you a copy, since this is part of a large system with lots of dependant projects.
I did find an exception in Visual Studios Output window when I opened this control though, maybe it can give you some hints?
System.Windows.Data Error: 'MS.Internal.Data.DynamicValueConverter' converter failed to convert value 'System.Predicate`1[Soe.Silverlight.Time.TimeScheduleShift]' (type 'System.Predicate`1[Soe.Silverlight.Time.TimeScheduleShift]'); BindingExpression: Path='AppointmentsFilter' DataItem='Soe.Silverlight.Time.TimeSchedulePlanningViewModel' (HashCode=57263252); target element is 'Telerik.Windows.Controls.TimelineViewDefinition' (Name='null'); target property is 'AppointmentFilter' (type 'System.Predicate`1[Telerik.Windows.Controls.ScheduleView.IAppointment]').. System.InvalidOperationException: Can't convert type System.Predicate`1[Soe.Silverlight.Time.TimeScheduleShift] to type System.Predicate`1[Telerik.Windows.Controls.ScheduleView.IAppointment].
at MS.Internal.Data.DefaultValueConverter.Create(Type sourceType, Type targetType, Boolean targetToSource)
at MS.Internal.Data.DynamicValueConverter.EnsureConverter(Type sourceType, Type targetType)
at MS.Internal.Data.DynamicValueConverter.Convert(Object value, Type targetType, Object parameter, CultureInfo culture)
at System.Windows.Data.BindingExpression.ConvertToTarget(Object value).
'iexplore.exe' (Silverlight): Loaded 'Anonymously Hosted DynamicMethods Assembly'
TimeScheduleShift is our extended class, that extends Appointment.
Regards,
Håkan
It seems that the problem is related with the value of the property
AppointmentsFilter
. This property requires a predicate of type IAppointment only.(System.Predicate`1[Telerik.Windows.Controls.ScheduleView.IAppointment].
I suggest you check what is the type of the value that you set to this property as per the stack trace it is System.Predicate`1[Soe.Silverlight.Time.TimeScheduleShift]
Hope this helps.
Greetings,
Rosi
the Telerik team
Explore the entire Telerik portfolio by downloading the Ultimate Collection trial package. Get it now >>
Changing it from TimeScheduleShift to IAppointment did the trick, thanks!
- Håkan