I am having issues with filtering out a SeriesMapping from the RadChart.
First of all, I have groups of data, which are stored in a:
List<ObservableCollection<OData>>
My T is a class called OData:
public
class
OData
{
public
string
PlantName {
get
;
set
; }
public
string
Quarter {
get
;
set
; }
public
double
IndicatorValue {
get
;
set
; }
}
Now, I fill this data and return a collection of multiple OData classes.
When I build the chart, I am building a series map for each OData in the collection:
ISeriesDefinition seriesDefinition = DetermineDefinition();
seriesDefinition.InteractivitySettings.HoverScope = InteractivityScope.Series;
seriesDefinition.InteractivitySettings.SelectionScope = InteractivityScope.Series;
var series =
new
SeriesMapping
{
SeriesDefinition = seriesDefinition,
LegendLabel = plant.PlantName,
};
series.ItemMappings.Add(
new
ItemMapping(
"IndicatorValue"
, DataPointMember.YValue));
series.ItemMappings.Add(
new
ItemMapping(
"Quarter"
, DataPointMember.XCategory));
series.CollectionIndex = counter;
radChart.SeriesMappings.Add(series);
private
void
CheckBox_Unchecked(
object
sender, RoutedEventArgs e)
{
var sourceCheckbox = e.OriginalSource
as
CheckBox;
radChart.FilterDescriptors.Add(
new
ChartFilterDescriptor(
"PlantName"
,
typeof
(
string
), FilterOperator.IsNotEqualTo, sourceCheckbox.Content));
}
What happens here is I get an error indicating PlantName does not exist in the ObservableCollection.
I am displaying the "Quarter" as the X-Axis labels, the "Indicator Value" as the Y-Axis and the Series should be identified as PlantName.
Any thought on how I can filter out each of my series?
Thanks,
Jason
5 Answers, 1 is accepted
FilterDescriptors are used to filter items within the series. If you need to filter out entire series you can do this easily by just removing the series mapping in your Unchecked event handler like this:
private
void
CheckBox_Unchecked(
object
sender, RoutedEventArgs e)
{
var sourceCheckbox = e.OriginalSource
as
CheckBox;
RadChart1.SeriesMappings.Remove(RadChart1.SeriesMappings.SingleOrDefault(c => c.LegendLabel == sourceCheckbox.Content
as
string
));
}
Yavor Ivanov
the Telerik team
Thanks for the response. The problem with your solution is you are just removing the series. If I want to add it back, I have to go through hoops to do so.
I think I have a different solution that works.
Here is my code (it may not be the most elegant, but it works):
private
void
CheckBox_Checked(
object
sender, RoutedEventArgs e)
{
var sourceCheckbox = e.OriginalSource
as
CheckBox;
if
(sourceCheckbox !=
null
)
{
foreach
(DataSeries series
in
radChart.DefaultView.ChartArea.DataSeries)
{
if
(sourceCheckbox.Content !=
null
)
{
if
(series.LegendLabel == sourceCheckbox.Content.ToString())
{
series.Definition.Visibility = SeriesVisibility.Visible;
}
}
}
}
}
private
void
CheckBox_Unchecked(
object
sender, RoutedEventArgs e)
{
var sourceCheckbox = e.OriginalSource
as
CheckBox;
foreach
(DataSeries series
in
radChart.DefaultView.ChartArea.DataSeries)
{
if
(series.LegendLabel == sourceCheckbox.Content.ToString())
{
series.Definition.Visibility = SeriesVisibility.Hidden;
}
}
}
If you know of a more elegant solution, by all means, let me know.
Thanks,
Jason
I am glad that you have found a solution to your problem. When you are hiding / showing the series they will appear instantly without animation compared to when you are adding / removing them. Showing / hiding also will visualize the series quicker, because the series is already created and no binding has to be made.
There is one optimization that you can apply for quicker visualization if you have multiple series with lots of data that have to be created when you start your application. To speed up the initial loading (of course if you need only a few series displayed initially) you can add only the series that are not added yet and change the visibility accordingly. This way your checked event handler can look like this:
private
void
CheckBox_Checked(
object
sender, RoutedEventArgs e)
{
CheckBox checkBox = (sender
as
CheckBox);
string
plant = checkBox.Content
as
string
;
bool
isChecked = checkBox.IsChecked.Value;
if
(!
this
.plantCollectionDict.ContainsKey(plant))
{
// this series is not added yet
this
.plantCollectionDict[plant] =
this
.RadChart1.SeriesMappings.Count;
data.Add(CreateData(plant));
RadChart1.SeriesMappings.Add(CreateMapping(plant));
}
plantVisibilityDict[plant] = (isChecked ? SeriesVisibility.Visible : SeriesVisibility.Hidden);
foreach
(KeyValuePair<
string
, SeriesVisibility> pair
in
plantVisibilityDict)
{
RadChart1.DefaultView.ChartArea.DataSeries.Single(c => c.LegendLabel == pair.Key).Definition.Visibility = pair.Value;
}
}
I have attached a sample application that demonstrates this approach. It has 10 plants, each with 1000 items.
I hope this helps.
Sincerely yours,
Yavor Ivanov
the Telerik team
We are glad that your issue is now resolved. Don't hesitate to contact us if you have other questions!
Best wishes,Yavor Ivanov
the Telerik team