Problem with compositeFilter.LogicalOperator

4 posts, 0 answers
  1. Snype
    Snype avatar
    9 posts
    Member since:
    Jan 2012

    Posted 21 Mar 2012 Link to this post

    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

  2. Rossen Hristov
    Admin
    Rossen Hristov avatar
    2477 posts

    Posted 21 Mar 2012 Link to this post

    Hi,

    That sounds strange.

    Can you please send us a small runnable dummy project with this sample data and the composite filter that you are building. You don't have to do this in a custom filter control -- you can directly add the composite filter to RadGridView.FilterDescriptors from the code-behind of the page.

    You can hard-code everything that is not relevant.

    We are looking forward to hearing from you.

    Regards,

    Ross
    the Telerik team
    Sharpen your .NET Ninja skills! Attend Q1 webinar week and get a chance to win a license! Book your seat now >>
  3. Snype
    Snype avatar
    9 posts
    Member since:
    Jan 2012

    Posted 21 Mar 2012 Link to this post

    Hi,
    Please find the complete code for my dummy project as below. I am not able to find a convinient way to attach a zip file for my dummy project to this reply. 
    MainPage.xml
     
    <UserControl x:Class="DummyProject.MainPage"
        xmlns:local="clr-namespace:DummyProject"
        mc:Ignorable="d"
        xmlns:telerikQuickStart="clr-namespace:Telerik.Windows.Controls.QuickStart;assembly=Telerik.Windows.Controls"
        d:DesignHeight="300" d:DesignWidth="400">
     
        <Grid x:Name="LayoutRoot" Background="White">
            <telerik:RadGridView
                x:Name="m_oRadGridView"
                AutoGenerateColumns="False">
                <telerik:RadGridView.Columns>
                    <telerik:GridViewDataColumn
                        Header="Name"
                        DataMemberBinding="{Binding Name}" />
                    <telerik:GridViewDataColumn
                        Header="Disciplines"
                        ShowDistinctFilters="true"
                        DataMemberBinding="{Binding DisciplineDescription}">
                        <telerik:GridViewDataColumn.FilteringControl>
                            <local:DisciplineFilterCtrl />
                        </telerik:GridViewDataColumn.FilteringControl>
                    </telerik:GridViewDataColumn>
                </telerik:RadGridView.Columns>
            </telerik:RadGridView>
        </Grid>
    </UserControl>
     
     
     
    MainPage.xml.cs
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Collections.ObjectModel;
     
    namespace DummyProject
    {
        public partial class MainPage : UserControl
        {
            public MainPage()
            {
                InitializeComponent();
                ObservableCollection<MainType> list = new ObservableCollection<MainType>();
                list.Add(new MainType("Attr1", "Discipline1, Discipline2, Discipline3"));
                list.Add(new MainType("Attr2", "Discipline1, Discipline2, Discipline3"));
                list.Add(new MainType("Attr3", "Discipline1, Discipline2, Discipline3"));
                list.Add(new MainType("Attr4", "Discipline1, Discipline2, Discipline3"));
                list.Add(new MainType("Attr5", "Discipline1, Discipline2, Discipline3"));
                list.Add(new MainType("Attr6", "Discipline1, Discipline2, Discipline3"));
                list.Add(new MainType("Attr7", "Discipline1"));
                list.Add(new MainType("Attr8", "Discipline1"));
                list.Add(new MainType("Attr9", "Discipline1"));
                list.Add(new MainType("Attr10", "Discipline1"));
                list.Add(new MainType("Attr11", "Discipline2"));
                list.Add(new MainType("Attr12", "Discipline2"));
                list.Add(new MainType("Attr13", "Discipline2"));
                list.Add(new MainType("Attr14", "Discipline2"));
                list.Add(new MainType("Attr15", "Discipline3"));
                list.Add(new MainType("Attr16", "Discipline3"));
                list.Add(new MainType("Attr17", "Discipline3"));
                list.Add(new MainType("Attr18", "Discipline4"));
                list.Add(new MainType("Attr19", "Discipline4"));
                list.Add(new MainType("Attr20", "Discipline4"));
                list.Add(new MainType("Attr21", "Discipline4"));
                list.Add(new MainType("Attr22", "Discipline5"));
                list.Add(new MainType("Attr23", "Discipline5"));
                list.Add(new MainType("Attr24", "Discipline5"));
                list.Add(new MainType("Attr25", "Discipline6"));
                list.Add(new MainType("Attr26", "Discipline6"));
                list.Add(new MainType("Attr27", "Discipline5, Discipline6"));
                list.Add(new MainType("Attr28", "Discipline5, Discipline6"));
                list.Add(new MainType("Attr29", "Discipline5, Discipline6"));
     
                m_oRadGridView.ItemsSource = list;
            }
        }
        public class MainType
        {
            public MainType(string name, string desc)
            {
                DisciplineDescription = desc;
                Name = name;
            }
             
            public string DisciplineDescription { get; set; }
            public string Name { get; set; }
        }
    }
     
     
     
     
    DisciplineFilterCtrl.xml
     
    <UserControl
        x:Class="DummyProject.DisciplineFilterCtrl"
        mc:Ignorable="d"
        d:DesignHeight="300"
        d:DesignWidth="400">  
        <Border
            x:Name="LayoutRoot"
            BorderThickness="1"
            BorderBrush="#FF8A929E"
            Padding="5"
            Background="#FFDFE2E5">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition
                        Height="Auto" />
                    <RowDefinition
                        Height="Auto" />
                    <RowDefinition
                        Height="Auto" />
                </Grid.RowDefinitions>
                <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>
            </Grid>
        </Border>
    </UserControl>
     
     
     
    DisciplineFilterCtrl.xml.cs
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using Telerik.Windows.Controls.GridView;
    using System.Collections.ObjectModel;
    using Telerik.Windows.Data;
     
    namespace DummyProject
    {
        public partial class DisciplineFilterCtrl : UserControl, IFilteringControl
     
        {
     
            ObservableCollection<Discipline> list = new ObservableCollection<Discipline>();
            public DisciplineFilterCtrl()
            {
                InitializeComponent();
                 
                list.Add(new Discipline("Discipline1"));
                list.Add(new Discipline("Discipline2"));
                list.Add(new Discipline("Discipline3"));
                list.Add(new Discipline("Discipline4"));
                list.Add(new Discipline("Discipline5"));
                list.Add(new Discipline("Discipline6"));
                CreateListBoxWithCheckBox(list);
     
            }
            private void CreateListBoxWithCheckBox(ObservableCollection<Discipline> list)
            {
     
                List<ListBoxItem> listBoxItem = new List<ListBoxItem>();
                foreach (Discipline item in list)
                {
                     
                        ListBoxItem tempItem = new ListBoxItem();
                        CheckBox m_oCheckBox = new CheckBox();
                        m_oCheckBox.Checked += m_oCheckBox_Checked;
                        m_oCheckBox.Unchecked += m_oCheckBox_Unchecked;
                        m_oCheckBox.Content = item.Name;
                        m_oCheckBox.Tag = item;
                        tempItem.Content = m_oCheckBox;
                        listBoxItem.Add(tempItem);
                     
                }
                m_oDisciplines.ItemsSource = listBoxItem;
     
            }
     
            void m_oCheckBox_Unchecked(object sender, RoutedEventArgs e)
            {
                FilterRecord();
                this.IsActive = true;
            }
     
            void m_oCheckBox_Checked(object sender, RoutedEventArgs e)
            {
                FilterRecord();
                this.IsActive = true;
            }
            private CompositeFilterDescriptor compositeFilter;
            private Telerik.Windows.Controls.GridViewBoundColumnBase column;
            private Telerik.Windows.Data.FilterDescriptor[] DisciplineFilter;       
     
            
            public bool IsActive
            {
                get { return (bool)GetValue(IsActiveProperty); }
                set { SetValue(IsActiveProperty, value); }
            }
            public static readonly DependencyProperty IsActiveProperty =
                DependencyProperty.Register(
                    "IsActive",
                    typeof(bool),
                    typeof(DisciplineFilterCtrl),
                    new System.Windows.PropertyMetadata(false));
     
     
            private void CreateFilters()
            {
                compositeFilter = new CompositeFilterDescriptor();
                compositeFilter.LogicalOperator = FilterCompositionLogicalOperator.Or;
                int count = list.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);
                }
            }
     
            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 ClearFilter(object sender, RoutedEventArgs e)
            {
                this.compositeFilter.FilterDescriptors.Clear();
                this.column.DataControl.FilterDescriptors.Clear();           
            }
     
            private void m_oFilterButton_Click(object sender, RoutedEventArgs e)
            {
                FilterRecord();
                this.IsActive = true;
            }
     
            private void m_oClearButton_Click(object sender, RoutedEventArgs e)
            {
                List<ListBoxItem> listItems = this.m_oDisciplines.ItemsSource as List<ListBoxItem>;
                if (null != listItems)
                {
                    foreach (var item in listItems)
                    {
                        (item.Content as CheckBox).IsChecked = false;
                    }
                }
                this.IsActive = false;
            }
             
             
        }
        public class Discipline
        {
            public Discipline(string name)
            {
                this.Name = name;
            }
            public string Name { get; set; }
        }
    }
  4. Rossen Hristov
    Admin
    Rossen Hristov avatar
    2477 posts

    Posted 21 Mar 2012 Link to this post

    Hello,

    You have to open a support ticket in order to be able to attach files.

    In case your organization has purchased developer licenses, please contact the license holder and ask him to add you as licensed developer to his account. In this way you would be entitled to using our support system and receive guaranteed replies according to your license. You will be able to get access to our support services, the latest hotfixes and downloads from within your account. 

    Once we update our records we would be able to provide you with adequate support services and answer your questions. 

    Greetings,
    Ross
    the Telerik team
    Sharpen your .NET Ninja skills! Attend Q1 webinar week and get a chance to win a license! Book your seat now >>
Back to Top