Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6746477
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 26, 20262026-05-26T12:19:39+00:00 2026-05-26T12:19:39+00:00

I am trying to implement a search (Ctrl+F) feature on a XamDataGrid. How can

  • 0

I am trying to implement a search (Ctrl+F) feature on a XamDataGrid. How can I programmatically invoke record filtering on the grid that searches across content in multiple columns and displays only columns that match the search?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-26T12:19:40+00:00Added an answer on May 26, 2026 at 12:19 pm

    The record filtering in the DataPresenter is just that – a means of the filtering the records based on some specified criteria. Normally that criteria is provided via one of the built in ui’s – either using the LabelIcons which is just a drop down list of the filtered values or via the FilterRecord which is a dedicated special record that is displayed with cells for each column to allow choosing/entering an operator and value.

    That being said the record filtering can be manipulated in code if you wish. The FieldLayout exposes a RecordFilters collection where a RecordFilter provides the conditions (i.e. the match criteria) and the field for which the match should be performed. It is also exposed off the RecordManager but this is really to facilitate filtering in hierarchical situations where the filter criteria is different for each “island” of child records.

    Since you want to search multiple fields for the same criteria, you would need to create a RecordFilter for each Field in the FieldLayout’s Fields collection (or whatever subset of the Fields to which you want this to be applied). Since you want to do a text search you probably want to use a ComparisonCondition where the ComparisonOperator you use is Contains and the value would be the text to search for. Now since you want a record to match if the value is found in any of the fields (for which you have created a RecordFilter) you will also need to set the FieldLayoutSettings’ RecordFiltersLogicalOperator property to Or (by default this resolves to And since one typically wants to match a record when all the criteria matches the entered values).

    So to that end the following is a basic attached behavior (in this case a property named FilterText that you would set on the DataPresenter to be filtered). This behavior/property will manipulate the RecordFilters of the DefaultFieldLayout considering the text value of the FilterText property.

    public static class DataPresenterHelpers
    {
        #region FilterText
    
        /// <summary>
        /// FilterText Attached Dependency Property
        /// </summary>
        public static readonly DependencyProperty FilterTextProperty =
            DependencyProperty.RegisterAttached("FilterText", typeof(string), typeof(DataPresenterHelpers),
                new FrameworkPropertyMetadata((string)null,
                    new PropertyChangedCallback(OnFilterTextChanged)));
    
        /// <summary>
        /// Gets the text to be used to filter the DataPresenter on which the property was set.
        /// </summary>
        public static string GetFilterText(DependencyObject d)
        {
            return (string)d.GetValue(FilterTextProperty);
        }
    
        /// <summary>
        /// Sets the filter text on the DataPresenter that should be used to manipulate the RecordFilters of the specified DataPresenter
        /// </summary>
        public static void SetFilterText(DependencyObject d, string value)
        {
            d.SetValue(FilterTextProperty, value);
        }
    
        /// <summary>
        /// Handles changes to the FilterText property.
        /// </summary>
        private static void OnFilterTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var dp = d as DataPresenterBase;
    
            if (dp.DefaultFieldLayout != null)
            {
                dp.DefaultFieldLayout.RecordFilters.Clear();
                dp.DefaultFieldLayout.Settings.RecordFiltersLogicalOperator = LogicalOperator.Or;
    
                foreach (var field in dp.DefaultFieldLayout.Fields)
                {
                    var filter = new RecordFilter();
                    filter.Field = field;
                    filter.Conditions.Add(new ComparisonCondition(ComparisonOperator.Contains, e.NewValue));
                    dp.DefaultFieldLayout.RecordFilters.Add(filter);
                }
            }
        }
    
        #endregion //FilterText
    }
    

    You can then do something like the following to hook up the value of a TextBox to this attached property. Note, you would need to define an xmlns mapping for local to be whatever clr namespace you put the above class into.

        <TextBox DockPanel.Dock="Top" x:Name="txtFilter" />
        <igDP:XamDataGrid 
            x:Name="grid" 
            BindToSampleData="True" 
            local:DataPresenterHelpers.FilterText="{Binding ElementName=txtFilter, Path=Text}">
        </igDP:XamDataGrid>
    

    Now the other part of your question was about only showing the columns which contained matching values. This isn’t really possible as part of the record filters itself since record filtering is about filtering out records based on some specified criteria and has no relation to hiding/showing columns/fields. That being said perhaps one way to help the end user understand where the matching text resides would be to highlight that text within the cells.

    To provide such functionality I defined a derived TextBlock called HighlightTextBlock. It exposes several properties:

    • RawText – This is the source text that will be displayed. It cannot use the Text property because this element will manipulate the Inlines of the TextBlock and that will set the Text property which would break bindings in the case of one way bindings or push back values to the source in the case of two way bindings.
    • FilterText – This is used to indicate the text that is to be sought within the RawText.
    • FilterTextComparisonType – This is used to indicate the string comparison for the match (i.e. case sensitive, etc.).
    • FilterTextForeground – The foreground to be used to highlight the matching text.
    • FilterTextBackground – The background to be used to highlight the matching text.

    Here is the code for the class:

        public class HighlightTextBlock 
        : TextBlock
    {
        #region Member Variables
    
        private DispatcherOperation _pendingUpdate; 
    
        #endregion //Member Variables
    
        #region Constructor
        static HighlightTextBlock()
        {
        }
    
        /// <summary>
        /// Initializes a new <see cref="HighlightTextBlock"/>
        /// </summary>
        public HighlightTextBlock()
        {
    
        } 
        #endregion //Constructor
    
        #region Base class overrides
    
        #region OnInitialized
        protected override void OnInitialized(EventArgs e)
        {
            if (_pendingUpdate != null)
                this.UpdateInlines(null);
    
            base.OnInitialized(e);
        }
        #endregion //OnInitialized 
    
        #endregion //Base class overrides 
    
        #region Properties
    
        #region FilterText
    
        /// <summary>
        /// Identifies the <see cref="FilterText"/> dependency property
        /// </summary>
        public static readonly DependencyProperty FilterTextProperty = DependencyProperty.Register("FilterText",
            typeof(string), typeof(HighlightTextBlock), new FrameworkPropertyMetadata(null, new PropertyChangedCallback(OnCriteriaChanged)));
    
        /// <summary>
        /// Returns or sets the text that should be highlighted
        /// </summary>
        /// <seealso cref="FilterTextProperty"/>
        [Description("Returns or sets the text that should be highlighted")]
        [Category("Behavior")]
        [Bindable(true)]
        public string FilterText
        {
            get
            {
                return (string)this.GetValue(HighlightTextBlock.FilterTextProperty);
            }
            set
            {
                this.SetValue(HighlightTextBlock.FilterTextProperty, value);
            }
        }
    
        #endregion //FilterText
    
        #region FilterTextBackground
    
        /// <summary>
        /// Identifies the <see cref="FilterTextBackground"/> dependency property
        /// </summary>
        public static readonly DependencyProperty FilterTextBackgroundProperty = DependencyProperty.Register("FilterTextBackground",
            typeof(Brush), typeof(HighlightTextBlock), new FrameworkPropertyMetadata(Brushes.Yellow, new PropertyChangedCallback(OnCriteriaChanged)));
    
        /// <summary>
        /// Returns or sets the background of the matching text.
        /// </summary>
        /// <seealso cref="FilterTextBackgroundProperty"/>
        [Description("Returns or sets the background of the matching text.")]
        [Category("Behavior")]
        [Bindable(true)]
        public Brush FilterTextBackground
        {
            get
            {
                return (Brush)this.GetValue(HighlightTextBlock.FilterTextBackgroundProperty);
            }
            set
            {
                this.SetValue(HighlightTextBlock.FilterTextBackgroundProperty, value);
            }
        }
    
        #endregion //FilterTextBackground
    
        #region FilterTextComparisonType
    
        /// <summary>
        /// Identifies the <see cref="FilterTextComparisonType"/> dependency property
        /// </summary>
        public static readonly DependencyProperty FilterTextComparisonTypeProperty = DependencyProperty.Register("FilterTextComparisonType",
            typeof(StringComparison), typeof(HighlightTextBlock), new FrameworkPropertyMetadata(StringComparison.CurrentCultureIgnoreCase, new PropertyChangedCallback(OnCriteriaChanged)));
    
        /// <summary>
        /// Returns or sets the StringComparison when locating the FilterText within the RawText.
        /// </summary>
        /// <seealso cref="FilterTextComparisonTypeProperty"/>
        [Description("Returns or sets the StringComparison when locating the FilterText within the RawText.")]
        [Category("Behavior")]
        [Bindable(true)]
        public StringComparison FilterTextComparisonType
        {
            get
            {
                return (StringComparison)this.GetValue(HighlightTextBlock.FilterTextComparisonTypeProperty);
            }
            set
            {
                this.SetValue(HighlightTextBlock.FilterTextComparisonTypeProperty, value);
            }
        }
    
        #endregion //FilterTextComparisonType
    
        #region FilterTextForeground
    
        /// <summary>
        /// Identifies the <see cref="FilterTextForeground"/> dependency property
        /// </summary>
        public static readonly DependencyProperty FilterTextForegroundProperty = DependencyProperty.Register("FilterTextForeground",
            typeof(Brush), typeof(HighlightTextBlock), new FrameworkPropertyMetadata(Brushes.Black, new PropertyChangedCallback(OnCriteriaChanged)));
    
        /// <summary>
        /// Returns or sets the brushed used for the foreground of the matching text.
        /// </summary>
        /// <seealso cref="FilterTextForegroundProperty"/>
        [Description("Returns or sets the brushed used for the foreground of the matching text.")]
        [Category("Behavior")]
        [Bindable(true)]
        public Brush FilterTextForeground
        {
            get
            {
                return (Brush)this.GetValue(HighlightTextBlock.FilterTextForegroundProperty);
            }
            set
            {
                this.SetValue(HighlightTextBlock.FilterTextForegroundProperty, value);
            }
        }
    
        #endregion //FilterTextForeground
    
        #region RawText
    
        /// <summary>
        /// Identifies the <see cref="RawText"/> dependency property
        /// </summary>
        public static readonly DependencyProperty RawTextProperty = DependencyProperty.Register("RawText",
            typeof(string), typeof(HighlightTextBlock), new FrameworkPropertyMetadata(null, new PropertyChangedCallback(OnCriteriaChanged)));
    
        /// <summary>
        /// Returns or sets the base string that will be displayed by the element.
        /// </summary>
        /// <seealso cref="RawTextProperty"/>
        [Description("Returns or sets the base string that will be displayed by the element.")]
        [Category("Behavior")]
        [Bindable(true)]
        public string RawText
        {
            get
            {
                return (string)this.GetValue(HighlightTextBlock.RawTextProperty);
            }
            set
            {
                this.SetValue(HighlightTextBlock.RawTextProperty, value);
            }
        }
    
        #endregion //RawText
    
        #endregion //Properties
    
        #region Methods
    
        #region OnCriteriaChanged
        private static void OnCriteriaChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var instance = d as HighlightTextBlock;
    
            if (instance._pendingUpdate == null)
            {
                instance._pendingUpdate = instance.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new SendOrPostCallback(instance.UpdateInlines), new object[] { null });
            }
        }
        #endregion //OnCriteriaChanged
    
        #region UpdateInlines
        private void UpdateInlines(object param)
        {
            _pendingUpdate = null;
    
            string filterText = this.FilterText;
            string text = this.RawText;
            var inlines = this.Inlines;
    
            try
            {
                inlines.Clear();
    
                if (string.IsNullOrEmpty(filterText))
                {
                    inlines.Add(text);
                    return;
                }
    
                var foreground = this.FilterTextForeground;
                var background = this.FilterTextBackground;
                var comparison = this.FilterTextComparisonType;
                var newInlines = new List<Inline>();
                int filterTextLen = filterText.Length;
    
                int start = 0;
    
                do
                {
                    int end = text.IndexOf(filterText, start, comparison);
    
                    string substr = text.Substring(start, (end < 0 ? text.Length : end) - start);
                    newInlines.Add(new Run(substr));
    
                    if (end < 0)
                        break;
    
                    var run = new Run(text.Substring(end, filterTextLen));
    
                    // note we could bind and not rebuild when the background/foreground 
                    // changes but that doesn't seem likely to happen and would add more 
                    // overhead than just referencing the value directly
                    if (null != foreground)
                        run.Foreground = foreground;
    
                    if (null != background)
                        run.Background = background;
    
                    newInlines.Add(run);
    
                    start = end + filterTextLen;
                } while (true);
    
                inlines.AddRange(newInlines);
            }
            finally
            {
                if (_pendingUpdate != null)
                {
                    _pendingUpdate.Abort();
                    _pendingUpdate = null;
                }
            }
        }
        #endregion //UpdateInlines
    
        #endregion //Methods
    }
    

    So then you could change the templates for the editors you are using to use this in their render template. e.g.

    <Window x:Class="WpfApplication6.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:igDP="http://infragistics.com/DataPresenter"
        xmlns:igEditors="http://infragistics.com/Editors"
        xmlns:local="clr-namespace:WpfApplication6"
        Title="MainWindow" Height="350" Width="525">
    <DockPanel>
        <TextBox DockPanel.Dock="Top" x:Name="txtFilter" />
        <igDP:XamDataGrid 
            x:Name="grid" 
            BindToSampleData="True" 
            local:DataPresenterHelpers.FilterText="{Binding ElementName=txtFilter, Path=Text}">
            <igDP:XamDataGrid.Resources>
                <Style TargetType="igEditors:XamTextEditor">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="igEditors:XamTextEditor">
                                <Border x:Name="MainBorder"
                                    Background="{TemplateBinding Background}"
                                    BorderBrush="{TemplateBinding BorderBrush}"
                                    BorderThickness="{TemplateBinding BorderThickness}"
                                    SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                    >
                                    <local:HighlightTextBlock 
                                        Margin="{TemplateBinding Padding}"
                                        FilterText="{Binding Path=Host.DataPresenter.(local:DataPresenterHelpers.FilterText), RelativeSource={RelativeSource TemplatedParent}}"
                                        RawText="{TemplateBinding DisplayText}" 
                                        TextWrapping="{TemplateBinding TextWrapping}" 
                                        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                        TextAlignment="{TemplateBinding TextAlignmentResolved}"
                                      />
                                </Border>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </igDP:XamDataGrid.Resources>
        </igDP:XamDataGrid>
    </DockPanel>
    

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I am trying to implement an internal search for my website that can point
Im trying to implement the search feature in my website. when the search keyword
I'm trying to implement a search, where you can enter more than one searchterm
I'm trying to implement Search Engine. I have web application that displays list of
The Problem : I am trying to implement a search algorithm that shows the
I'm trying to implement a search for my project , but i can't figure
I'm trying to implement a live search for my website. One that identifies words,
I'm trying to implement search result highlighting for pdfs in a web app. I
I am trying to implement a djapian based full text search for searching user
I've been trying to implement a delete function for a Binary Search Tree but

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.