I need better logic that would allow this search to perform quicker and more efficiently.
In XAML, I have a DataGrid and a TextBox. Both need to be present.
I'd prefer that as the user types in the TextBox, the Grid is filtered by one or more columns. Not that the user needs to click a "Submit" button (unless this is the only way).
My current logic takes many seconds to complete, likely because of the binding/rebinding of the UI.
Here is my logic:
private void TextBox_TextChanged(object sender, TextChangedEventArgs e) {
var textBox = sender as TextBox;
_filteredView = CollectionViewSource.GetDefaultView(MainGrid.DataContext);
_filteredView.Filter = x => ((QueueData)x).ImageCode.Contains(textBox.Text) || ((QueueData)x).Product.Contains(textBox.Text);
MainGrid.DataContext = ((System.Windows.Data.ListCollectionView)_filteredView).SourceCollection;
}
Below is my xaml - txtSearch is the TextBox:
<UserControl x:Class="Wip.Presentation.ManagerWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
TextElement.FontWeight="Medium"
TextElement.FontSize="14"
TextOptions.TextFormattingMode="Ideal"
TextOptions.TextRenderingMode="Auto"
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
Background="{DynamicResource MaterialDesignPaper}"
FontFamily="{StaticResource MaterialDesignFont}"
mc:Ignorable="d" Height="auto" Width="auto">
<UserControl.Resources>
<Style x:Key="LeftCellStyle" TargetType="{x:Type DataGridCell}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Left"
VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Auto" PreviewMouseWheel="ScrollViewer_PreviewMouseWheel">
<Grid Background="Transparent" FocusManager.FocusedElement="{Binding ElementName=txtSearch}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<!-- SEARCH -->
<Label HorizontalAlignment="Left" Grid.Row="0" Name="lblSearch" Height="30" Width="150" Margin="10,0,0,0" >SEARCH (F5 to clear)</Label>
<TextBox HorizontalAlignment="Left" Grid.Row="0" Name="txtSearch" Height="30" Width="200" Margin="160,0,0,0" TextChanged="TextBox_TextChanged" CharacterCasing="Upper"/>
<DataGrid Grid.Row="1" Grid.ColumnSpan="2" Name="MainGrid" ItemsSource="{Binding}"
Sorting="MainGrid_Sorting"
SelectionChanged="MainGrid_SelectionChanged"
MouseDoubleClick="MainGrid_MouseDoubleClick"
ColumnWidth="Auto"
AlternationCount="2"
AlternatingRowBackground="DimGray"
AutoGenerateColumns="False"
AreRowDetailsFrozen="True" Margin="0,0,0,0">
<DataGrid.Columns>
<DataGridTextColumn Header="CMP" Width="50" Binding="{Binding Company, Mode=OneWay}" CellStyle="{StaticResource LeftCellStyle}" SortMemberPath="(Company)" IsReadOnly="True">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#FF666666" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="DIV" Width="50" Binding="{Binding Division, Mode=OneWay}" CellStyle="{StaticResource LeftCellStyle}" SortMemberPath="(Division)" IsReadOnly="True">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#FF666666" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="CUS" Width="75" Binding="{Binding CustomerNumber, Mode=OneWay}" CellStyle="{StaticResource LeftCellStyle}" SortMemberPath="(CustomerNumber)" IsReadOnly="True">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#FF666666" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="FORMAT" Width="75" Binding="{Binding ImageCode, Mode=OneWay}" CellStyle="{StaticResource LeftCellStyle}" SortMemberPath="(ImageCode)" IsReadOnly="True">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#FF666666" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="SEQ" Width="50" Binding="{Binding Sequence, Mode=OneWay}" CellStyle="{StaticResource LeftCellStyle}" SortMemberPath="(Sequence)" IsReadOnly="True">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#FF666666" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="ORDER #" Width="75" Binding="{Binding OrderNumber, Mode=OneWay}" CellStyle="{StaticResource LeftCellStyle}" SortMemberPath="(OrderNumber)" IsReadOnly="True">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#FF666666" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="LOGO" Width="225" Binding="{Binding Logo, Mode=OneWay}" CellStyle="{StaticResource LeftCellStyle}" SortMemberPath="(Logo)" IsReadOnly="True">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#FF666666" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Hold Code" Width="100" Binding="{Binding HoldCode, Mode=OneWay}" CellStyle="{StaticResource LeftCellStyle}" SortMemberPath="(HoldCode)" IsReadOnly="True">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#FF666666" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Order Type" Width="85" Binding="{Binding Dhotp, Mode=OneWay}" CellStyle="{StaticResource LeftCellStyle}" SortMemberPath="(Dhotp)" IsReadOnly="True">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#FF666666" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Comments" Width="175" Binding="{Binding Comments, Mode=OneWay}" CellStyle="{StaticResource LeftCellStyle}" SortMemberPath="(Comments)" IsReadOnly="True">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#FF666666" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="IMPORT DATE" Width="160" Binding="{Binding ImportDate, Mode=OneWay}" CellStyle="{StaticResource LeftCellStyle}" SortMemberPath="(ImportDate)" IsReadOnly="True">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#FF666666" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="PRODUCT" Width="110" Binding="{Binding Product, Mode=OneWay}" CellStyle="{StaticResource LeftCellStyle}" SortMemberPath="(Product)" IsReadOnly="True">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#FF666666" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="WORKCNTR" Width="110" Binding="{Binding Product, Mode=OneWay}" CellStyle="{StaticResource LeftCellStyle}" SortMemberPath="(WorkCenter)" IsReadOnly="True">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#FF666666" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="PROCESS TYPE" Width="100" Binding="{Binding ProcessType, Mode=OneWay}" CellStyle="{StaticResource LeftCellStyle}" SortMemberPath="(ProcessType)" IsReadOnly="True">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#FF666666" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="PIM EMB JOB" Width="105" Binding="{Binding PimEmbJobDisplay, Mode=OneWay}" CellStyle="{StaticResource LeftCellStyle}" SortMemberPath="(PimEmbJob)" IsReadOnly="True">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#FF666666" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn x:Name="dgcThreadColor" Header="THREAD COLOR" Width="105" Binding="{Binding Ink, Mode=OneWay}" CellStyle="{StaticResource LeftCellStyle}" SortMemberPath="(Ink)" IsReadOnly="True">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#FF666666" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn x:Name="dgcStitchCnt" Header="STITCH CNT" Width="105" Binding="{Binding StitchCount, Mode=OneWay}" CellStyle="{StaticResource LeftCellStyle}" SortMemberPath="(StitchCount)" IsReadOnly="True">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#FF666666" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn x:Name="dgcPieces" Header="PIECES" Width="105" Binding="{Binding Pieces, Mode=OneWay}" CellStyle="{StaticResource LeftCellStyle}" SortMemberPath="(Pieces)" IsReadOnly="True">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#FF666666" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
</DataGrid.Columns>
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="Mark SLC" Name="mnuMarkSLC" Click="mnuMarkSLC_Click">
</MenuItem>
</ContextMenu>
</DataGrid.ContextMenu>
</DataGrid>
</Grid>
</ScrollViewer>
</UserControl>
Below is QueueData.cs:
using System;
namespace Wip.ViewModels {
public class QueueData {
#region Public Properties
public string Company { get; set; }
public string Division { get; set; }
public string CustomerNumber { get; set; }
public string ImageCode { get; set; }
public int Sequence { get; set; }
public string OrderNumber { get; set; }
public string Logo { get; set; }
public int LineNumber { get; set; }
public string HoldCode { get; set; }
public string Dhotp { get; set; }
public string Comments { get; set; }
public string WorkCenter { get; set; }
public DateTime ImportDate { get; set; }
// Due Date
public string Product { get; set; }
// Ink
public int ProcessType { get; set; }
public bool ProductionEdit { get; set; }
public bool PimEmbJob { get; set; }
public string PimEmbJobDisplay { get { return (PimEmbJob == true ? "Yes" : "No"); } }
public string Ink { get; set; }
public int StitchCount { get; set; }
public int Pieces { get; set; }
// Work Center
#endregion
}
}
filteredViewis bound implicitly? \$\endgroup\$CollectionViewSource.GetDefaultView(MainGrid.DataContext).Filter = x => ((QueueData)x).ImageCode.Contains(textBox.Text) || ((QueueData)x).Product.Contains(textBox.Text);It still lags. Is that to be expected? \$\endgroup\$