XML file for the Cusom Filter Control
<
TextBlock
Grid.Row
=
"0"
Margin
=
"2"
Text
=
"Show Attributes of Discipline"
/>
<
ListBox
x:Name
=
"m_oDisciplines"
Grid.Row
=
"1"
>
</
ListBox
>
<
StackPanel
Orientation
=
"Horizontal"
Grid.Row
=
"2"
>
<
telerik:RadButton
Name
=
"m_oFilterButton"
Content
=
"Filter"
Click
=
"m_oFilterButton_Click"
Margin
=
"2"
Width
=
"80"
/>
<
telerik:RadButton
Name
=
"m_oClearButton"
Content
=
"Clear"
Click
=
"m_oClearButton_Click"
Margin
=
"2"
Width
=
"80"
/>
</
StackPanel
>
.CS file portion for the filter control is as below:
public DisciplineFilterCtrl()
{
InitializeComponent();
CreateListBoxWithCheckBox(MetaDataCache.Cache.Disciplines);
}
private void CreateListBoxWithCheckBox(ObservableCollection<
DisciplineWrapper
> list) {
List<
ListBoxItem
> listBoxItem = new List<
ListBoxItem
>();
foreach (DisciplineWrapper item in list)
{
if (item.Id != Guid.Empty && !item.Deleted)
{
ListBoxItem tempItem = new ListBoxItem();
CheckBox m_oCheckBox = new CheckBox();
m_oCheckBox.Content = item.Name;
m_oCheckBox.Tag = item;
tempItem.Content = m_oCheckBox;
listBoxItem.Add(tempItem);
}
}
m_oDisciplines.ItemsSource = listBoxItem;
}
private CompositeFilterDescriptor compositeFilter;
private Telerik.Windows.Controls.GridViewBoundColumnBase column;
private Telerik.Windows.Data.FilterDescriptor[] DisciplineFilter;
private void CreateFilters()
{
compositeFilter = new CompositeFilterDescriptor();
compositeFilter.LogicalOperator = FilterCompositionLogicalOperator.Or;
int count = MetaDataCache.Cache.Disciplines.Count;
string dataMember = this.column.DataMemberBinding.Path.Path;
DisciplineFilter = new FilterDescriptor[count];
for (int i = 0; i <
count
; i++)
{
this.DisciplineFilter[i] = new Telerik.Windows.Data.FilterDescriptor(dataMember , Telerik.Windows.Data.FilterOperator.Contains
, null);
compositeFilter.FilterDescriptors.Add(DisciplineFilter[i]);
}
compositeFilter.LogicalOperator
=
FilterCompositionLogicalOperator
.Or;
}
public void Prepare(Telerik.Windows.Controls.GridViewBoundColumnBase column) {
this.column
= column as Telerik.Windows.Controls.GridViewBoundColumnBase;
if (this.column == null)
{
return;
}
if (this.compositeFilter == null)
{
CreateFilters();
}
}
private void FilterRecord()
{
// this.compositeFilter.FilterDescriptors.Clear();
this.column.DataControl.FilterDescriptors.Clear();
int
i
=
0
;
List<ListBoxItem> listItems = this.m_oDisciplines.ItemsSource as List<
ListBoxItem
>;
if (null != listItems)
{
foreach (var item in listItems)
{
CheckBox m_oCheckBox = item.Content as CheckBox;
if (null != m_oCheckBox && m_oCheckBox.IsChecked.Value)
{
//this.compositeFilter.FilterDescriptors.Add(DisciplineFilter[i]);
this.DisciplineFilter[i].Value = m_oCheckBox.Content;
this.column.DataControl.FilterDescriptors.Add(DisciplineFilter[i]);
i++;
}
}
}
}
private void m_oFilterButton_Click(object sender, RoutedEventArgs e) {
FilterRecord();
this.IsActive = true;
}
Hi,
I have created a custom filter control. In The filter control I am displaying a list of available options for the associated column.
The column may have a values separated by comma or newline.
For Example a Column value is "Electrical, Mechanical". The filter control has options listed as "Electrical" "Mechanica", "HVAC"..etc. If I select "Electrical" and "Mechanical" in the custom filter screen and click Filter, It should display me all the rows that contains "Electrical" or "Mechanical".
To achive this I have used a composite filter and set the logical operator to FilterCompositionLogicalOperator.Or
But it stil gives me the resulting rows where the column contains "Electrical" AND "Mechanical". Is there any way I could make it to display rows contaings data as "Electrical" OR "Mechanical".
Data Type for the source column is string.
Please help.
Thanks in advance