数据网格过滤器性能wpf



我有一个DataGrid与文本框在过滤器的标题,但性能不是那么好。这是数据网格的代码:

<DataGrid x:Name="DGrdBuscar" ItemsSource="{Binding DGrdBuscarView,Mode=OneWay}" MaxWidth="1800" MaxHeight="850" MinRowHeight="26" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="6" HorizontalAlignment="Left" Height="Auto" VerticalAlignment="Top" Width="Auto" AlternatingRowBackground="LightCyan" AlternationCount="2" AutoGenerateColumns="False" IsReadOnly="True" SelectionMode="Single" ColumnWidth="SizeToCells" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible" FrozenColumnCount="1" Margin="0,0,0,10" BorderBrush="Black" VirtualizingStackPanel.VirtualizationMode="Recycling">
<DataGrid.Resources>
<local:BindingProxy x:Key="Proxy" Data="{Binding}"/>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="IdTrafo" Binding="{Binding IdTrafo,Mode=OneWay}" Width="Auto" MinWidth="130" CellStyle="{StaticResource DataGridCellStyleLeft}" HeaderStyle="{StaticResource DataGridColHeaderStyle}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}" HorizontalAlignment="Center"/>
<TextBox x:Name="TxtIdTrafo" TextChanged="Txt_TextChanged" Style="{StaticResource TextBoxSmallStyle}" FontWeight="Bold" MinWidth="150"/>
</StackPanel>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
<DataGridCheckBoxColumn Header="{x:Static lang:Resources.Buscar_Def}" Binding="{Binding Definitivo,Mode=OneWay}" Width="Auto" CellStyle="{StaticResource DataGridCellStyle}" HeaderStyle="{StaticResource DataGridColHeaderStyle}" CanUserResize="False"/>
<DataGridCheckBoxColumn Header="{x:Static lang:Resources.NroDiseno_Cot}" Binding="{Binding Cotizacion,Mode=OneWay}" Width="Auto" CellStyle="{StaticResource DataGridCellStyle}" HeaderStyle="{StaticResource DataGridColHeaderStyle}" CanUserResize="False"/>
<DataGridTextColumn Header="{x:Static lang:Resources.Buscar_UserName}" Binding="{Binding UserName,Mode=OneWay}" Width="Auto" CellStyle="{StaticResource DataGridCellStyle}" HeaderStyle="{StaticResource DataGridColHeaderStyle}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}" HorizontalAlignment="Center"/>
<TextBox x:Name="TxtUserName" TextChanged="Txt_TextChanged" Style="{StaticResource TextBoxSmallStyle}" FontWeight="Bold"/>
</StackPanel>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
<DataGridTextColumn x:Name="colPotReg1" Header="{x:Static lang:Resources.Buscar_PotReg1}" Binding="{Binding PotReg1,Mode=OneWay}" Width="Auto" CellStyle="{StaticResource DataGridCellStyle}" HeaderStyle="{StaticResource DataGridColHeaderStyle}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}" HorizontalAlignment="Center"/>
<TextBox x:Name="TxtPotReg1" TextChanged="Txt_TextChanged" Style="{StaticResource TextBoxSmallStyle}" FontWeight="Bold"/>
</StackPanel>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
<DataGridTextColumn Header="{x:Static lang:Resources.Buscar_UnomAT}" Binding="{Binding UnomAT,Mode=OneWay}" Width="Auto" CellStyle="{StaticResource DataGridCellStyle}" HeaderStyle="{StaticResource DataGridColHeaderStyle}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}" HorizontalAlignment="Center"/>
<TextBox x:Name="TxtUnomAT" TextChanged="Txt_TextChanged" Style="{StaticResource TextBoxSmallStyle}" FontWeight="Bold"/>
</StackPanel>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
<DataGridTextColumn Header="{x:Static lang:Resources.Buscar_UnomBT}" Binding="{Binding UnomBT,Mode=OneWay}" Width="Auto" CellStyle="{StaticResource DataGridCellStyle}" HeaderStyle="{StaticResource DataGridColHeaderStyle}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}" HorizontalAlignment="Center"/>
<TextBox x:Name="TxtUnomBT" TextChanged="Txt_TextChanged" Style="{StaticResource TextBoxSmallStyle}" FontWeight="Bold"/>
</StackPanel>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
<DataGridTextColumn Header="{x:Static lang:Resources.Buscar_Frec}" Binding="{Binding Frecuencia,Mode=OneWay}" Width="Auto" CellStyle="{StaticResource DataGridCellStyle}" HeaderStyle="{StaticResource DataGridColHeaderStyle}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}" HorizontalAlignment="Center"/>
<TextBox x:Name="TxtFrec" TextChanged="Txt_TextChanged" Style="{StaticResource TextBoxSmallStyle}" FontWeight="Bold"/>
</StackPanel>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
<DataGridTextColumn Header="{x:Static lang:Resources.Observaciones}" Binding="{Binding ObservacionesSearch,Mode=OneWay}" Width="Auto" CellStyle="{StaticResource DataGridCellStyle}" HeaderStyle="{StaticResource DataGridColHeaderStyle}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}" HorizontalAlignment="Center"/>
<TextBox x:Name="TxtObs" TextChanged="Txt_TextChanged" Style="{StaticResource TextBoxSmallStyle}" FontWeight="Bold"/>
</StackPanel>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
<DataGridTextColumn Header="{x:Static lang:Resources.Buscar_GrupoCon}" Binding="{Binding GrupoCon,Mode=OneWay}" Width="Auto" CellStyle="{StaticResource DataGridCellStyle}" HeaderStyle="{StaticResource DataGridColHeaderStyle}" Visibility="{Binding Data.GrupoCon_IsCollapsed, Converter={StaticResource BoolToVisConverter}, Source={StaticResource Proxy}}"/>
<DataGridTextColumn Header="{x:Static lang:Resources.Buscar_NroDiseno}" Binding="{Binding NroDiseno,Mode=OneWay}" Width="Auto" CellStyle="{StaticResource DataGridCellStyle}" HeaderStyle="{StaticResource DataGridColHeaderStyle}"/>
<DataGridTextColumn Header="{x:Static lang:Resources.Buscar_NroSerie}" Binding="{Binding NroSerie,Mode=OneWay}" Width="Auto" CellStyle="{StaticResource DataGridCellStyle}" HeaderStyle="{StaticResource DataGridColHeaderStyle}"/>                                                          
</DataGrid.Columns>
</DataGrid>

数据网格是从数据库中填充的,它可以包含数千行。在后面的代码中:

Private Sub Txt_TextChanged(sender As Object, e As TextChangedEventArgs)
Try
Dim t As TextBox = CType(sender, TextBox)
Dim filter As String = t.Text
If filter = "" Then
'v_MainWindowVM.BuscarVM.DGrdBuscarView.Filter = Nothing
Select Case t.Name
Case "TxtPotReg1"
filterPotReg1 = ""
Case "TxtUnomAT"
filterUnomAT = ""
Case "TxtUnomBT"
filterUnomBT = ""
Case "TxtFrec"
filterFrec = ""
Case "TxtUserName"
filterUserName = ""
Case "TxtObs"
filterObs = ""
Case "TxtIdTrafo"
filterIdTrafo = ""
End Select
v_MainWindowVM.BuscarVM.DGrdBuscarView.Filter = New System.Predicate(Of [Object])(Function(o) TryCast(o, ClassDataBase.DataGridBuscar).PotReg1.ToString.StartsWith(filterPotReg1) AndAlso TryCast(o, ClassDataBase.DataGridBuscar).UnomAT.ToString.StartsWith(filterUnomAT) AndAlso TryCast(o, ClassDataBase.DataGridBuscar).UnomBT.ToString.StartsWith(filterUnomBT) AndAlso TryCast(o, ClassDataBase.DataGridBuscar).Frecuencia.ToString.StartsWith(filterFrec) AndAlso TryCast(o, ClassDataBase.DataGridBuscar).UserName.ToUpper.StartsWith(filterUserName.ToUpper) AndAlso TryCast(o, ClassDataBase.DataGridBuscar).ObservacionesSearch.Contains(filterObs) AndAlso TryCast(o, ClassDataBase.DataGridBuscar).IdTrafo.ToUpper.StartsWith(filterIdTrafo.ToUpper))
Else
Select Case t.Name
Case "TxtPotReg1"
filterPotReg1 = t.Text
Case "TxtUnomAT"
filterUnomAT = t.Text
Case "TxtUnomBT"
filterUnomBT = t.Text
Case "TxtFrec"
filterFrec = t.Text
Case "TxtUserName"
filterUserName = t.Text
Case "TxtObs"
filterObs = t.Text
Case "TxtIdTrafo"
filterIdTrafo = t.Text
End Select
v_MainWindowVM.BuscarVM.DGrdBuscarView.Filter = New System.Predicate(Of [Object])(Function(o) TryCast(o, ClassDataBase.DataGridBuscar).PotReg1.ToString.StartsWith(filterPotReg1) AndAlso TryCast(o, ClassDataBase.DataGridBuscar).UnomAT.ToString.StartsWith(filterUnomAT) AndAlso TryCast(o, ClassDataBase.DataGridBuscar).UnomBT.ToString.StartsWith(filterUnomBT) AndAlso TryCast(o, ClassDataBase.DataGridBuscar).Frecuencia.ToString.StartsWith(filterFrec) AndAlso TryCast(o, ClassDataBase.DataGridBuscar).UserName.ToUpper.StartsWith(filterUserName.ToUpper) AndAlso TryCast(o, ClassDataBase.DataGridBuscar).ObservacionesSearch.Contains(filterObs) AndAlso TryCast(o, ClassDataBase.DataGridBuscar).IdTrafo.ToUpper.StartsWith(filterIdTrafo.ToUpper))
End If
Catch ex As Exception
ErrorMsg("Subrutina ITD.Buscar.Txt_TextChanged", ex)
End Try
End Sub

我能做些什么来提高性能?当我在第二个字母之后开始在过滤器中书写时,它花费的时间太长了。

我通过执行TextChanged方法Async来提高性能,如下所示:

Private mostRecentfilter As String = ">

Private Async Sub Txt_TextChanged(sender As Object, e As TextChangedEventArgs)
Try
Dim t As TextBox = CType(sender, TextBox)
Dim filter As String = t.Text       'get the entered text
mostRecentfilter = filter        'set the instance variable for entered text
Await Task.Delay(550)          'wait 0.55 second in case they keep typing
'if they didn't keep typing
If filter = mostRecentfilter Then
'do what you were going to do
If filter = "" Then
Select Case t.Name
Case "TxtPotReg1"
filterPotReg1 = ""
Case "TxtUnomAT"
filterUnomAT = ""
Case "TxtUnomBT"
filterUnomBT = ""
Case "TxtFrec"
filterFrec = ""
Case "TxtUserName"
filterUserName = ""
Case "TxtObs"
filterObs = ""
Case "TxtIdTrafo"
filterIdTrafo = ""
End Select
Else
Select Case t.Name
Case "TxtPotReg1"
filterPotReg1 = t.Text
Case "TxtUnomAT"
filterUnomAT = t.Text
Case "TxtUnomBT"
filterUnomBT = t.Text
Case "TxtFrec"
filterFrec = t.Text
Case "TxtUserName"
filterUserName = t.Text
Case "TxtObs"
filterObs = t.Text
Case "TxtIdTrafo"
filterIdTrafo = t.Text
End Select
End If
v_MainWindowVM.BuscarVM.DGrdBuscarView.Filter = New Predicate(Of Object)(Function(o As ClassDataBase.DataGridBuscar) o.IdTrafo.ToUpper.StartsWith(filterIdTrafo.ToUpper) AndAlso o.PotReg1.ToString.StartsWith(filterPotReg1) AndAlso o.UnomAT.ToString.StartsWith(filterUnomAT) AndAlso o.UnomBT.ToString.StartsWith(filterUnomBT) AndAlso o.Frecuencia.ToString.StartsWith(filterFrec) AndAlso o.UserName.ToUpper.StartsWith(filterUserName.ToUpper) AndAlso o.ObservacionesSearch.Contains(filterObs))
End If
Catch ex As Exception
ErrorMsg("Subrutina ITD.Buscar.Txt_TextChanged", ex)
End Try
End Sub

并删除trycast。

最新更新