Más información Xceed DataGrid para WPF
La última vez que vimos el DataGrid para WPF habíamos visto Agrupación y Ordenación. Hoy vamos a ver las opciones de Filtrado que ofrece el datagrid.
Opciones de filtrado
El DataGrid para WPF ofrece 3 formas de establecer un filtro:
- Filtrado nativo de CollectionView (utilizando el parámetro Filter en CollectionViewSource)
- Filtrado automático (mediante AutoFilterControl)
- Filtrado avanzado (mediante FilterRow)
Filtrado nativo CollectionView
Los elementos de datos que se muestran en una cuadrícula pueden filtrarse mediante la función Filtro propiedad del DataGridCollectionViewBase o el Filtro evento del DataGridCollectionViewSourceBase al que está vinculado.
<Grid xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid">
<Grid.Resources>
<xcdg:DataGridCollectionViewSource x:Key="cvs_orders"
Source="{Binding Source={x:Static Application.Current},Path=Orders}"
Filter="ShipViaFilter"/>
</Grid.Resources>
<xcdg:DataGridControl x:Name="OrdersGrid"
ItemsSource="{Binding Source={StaticResource cvs_orders}}"/>
</Grid>
private void ShipViaFilter( object sender, FilterEventArgs e )
{
object value = ( ( System.Data.DataRow )e.Item )[ "ShipVia" ];
if( ( value != null ) && ( value != DBNull.Value ) )
{
if( ( int )value == 3 )
{
e.Accepted = true;
}
else
{
e.Accepted = false;
}
}
}
Para volver a filtrar los elementos de datos mostrados en una vista, el botón Se puede llamar al método Refresh en el ItemsSource.
( ( DataGridCollectionView )this.OrdersGrid.ItemsSource ).Refresh();
Filtrado automático
En DataGridCollectionView y DataGridDetailDescription admiten el filtrado automático, que proporciona al usuario final un filtrado similar al de Excel según los distintos valores de cada columna. El filtrado automático puede activarse estableciendo el parámetro AutoFilterMode propiedad a Y o O (Ninguno por defecto), que indica si los elementos de datos se filtrarán según todos o al menos una de los criterios de filtrado definidos por el control de autofiltrado de cada columna. La dirección DistinctValuesConstraint también puede establecerse para determinar si los valores distintos deben filtrarse según el resultado de operaciones previas de autofiltrado.
Opción1 : establecer en XAML
<Grid xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid">
<Grid.Resources>
<xcdg:DataGridCollectionViewSource x:Key="cvs_orders"
Source="{Binding Source={x:Static Application.Current},Path=Orders}"
AutoFilterMode="And"
DistinctValuesConstraint="Filtered"
AutoCreateItemProperties="False">
<xcdg:DataGridCollectionViewSource.ItemProperties>
<xcdg:DataGridItemProperty Name="ShipCountry"
Title="Country"/>
<xcdg:DataGridItemProperty Name="ShipCity"
Title="City"/>
<xcdg:DataGridItemProperty Name="ShipAddress"
Title="Address"/>
<xcdg:DataGridItemProperty Name="ShipPostalCode"
Title="Postal Code"/>
<xcdg:DataGridItemProperty Name="ShipName"
Title="Name"
CalculateDistinctValues="False"/>
<xcdg:DataGridItemProperty Name="OrderDate"
Title="Order Date"
CalculateDistinctValues="False"/>
<xcdg:DataGridItemProperty Name="Freight"
CalculateDistinctValues="False"/>
</xcdg:DataGridCollectionViewSource.ItemProperties>
</xcdg:DataGridCollectionViewSource>
</Grid.Resources>
<xcdg:DataGridControl x:Name="OrdersGrid"
ItemsSource="{Binding Source={StaticResource cvs_orders}}"/>
</Grid>
Opción 2: establecer en code-behind
DataGridCollectionView view = new DataGridCollectionView( Orders, typeof( System.Data.DataRow ), false, false );
view.AutoFilterMode = AutoFilterMode.And;
view.DistinctValuesConstraint = DistinctValuesConstraint.Filtered;
view.ItemProperties.Add( new DataGridItemProperty( "ShipCountry", typeof( string ) ) );
view.ItemProperties.Add( new DataGridItemProperty( "ShipCity", typeof( string ) ) );
view.ItemProperties.Add( new DataGridItemProperty( "ShipAddress", typeof( string ) ) );
view.ItemProperties.Add( new DataGridItemProperty( "ShipPostalCode", typeof( string ) ) );
DataGridItemProperty shipName = new DataGridItemProperty( "ShipName", typeof( string ) );
shipName.CalculateDistinctValues = false;
view.ItemProperties.Add( shipName );
DataGridItemProperty orderDate = new DataGridItemProperty( "OrderDate", typeof( DateTime ) );
orderDate.CalculateDistinctValues = false;
view.ItemProperties.Add( orderDate );
DataGridItemProperty freight = new DataGridItemProperty( "Freight", typeof( double ) );
freight.CalculateDistinctValues = false;
view.ItemProperties.Add( freight );
dataGridControl.ItemsSource = view;
Filtrado avanzado
Además del filtrado automático, la parrilla ofrece un FiltrarFila que permite a los usuarios especificar una expresión de filtro utilizada por la función DataGridCollectionView para filtrar elementos de datos. Las expresiones de filtrado introducidas en FilterCell siguen una sintaxis y unas reglas específicas. Esto puede ser engorroso de aprender para los usuarios, y aquí es donde el filtrado avanzado viene al rescate. El filtrado avanzado ofrece una interfaz de usuario que ayuda a los usuarios a crear expresiones de filtrado sin necesidad de aprender otra sintaxis.
El filtrado avanzado puede activarse configurando la opción AdvancedFilterMode a un valor distinto de Ningunoque es el valor por defecto. El modo elegido indica cómo se activa el control de filtrado avanzado. Tenga en cuenta que es posible desactivar el filtrado avanzado por columna configurando el parámetro Permitir filtro avanzado propiedad a falso (verdadero por defecto), esto impedirá que se muestre el control de filtro avanzado para esa columna.
<Grid xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid">
<Grid.Resources>
<xcdg:DataGridCollectionViewSource x:Key="cvs_orders"
Source="{Binding Source={x:Static Application.Current}, Path=Orders}" />
</Grid.Resources/>
<xcdg:DataGridControl x:Name="OrdersGrid"
ItemsSource="{Binding Source={StaticResource cvs_orders}}">
<xcdg:DataGridControl.Columns>
<xcdg:Column FieldName="ShipCountry"
AllowAdvancedFilter="False" />
</xcdg:DataGridControl.Columns>
<xcdg:DataGridControl.View>
<xcdg:TableflowView AdvancedFilterMode="Always" />
</xcdg:DataGridControl.View>
</xcdg:DataGridControl>
</Grid>
Valores distintivos personalizados
Por defecto, los valores que se muestran en el desplegable del autofiltro representan los valores distintivos tal y como se extraen de la fuente de datos subyacente; sin embargo, se pueden proporcionar valores distintivos personalizados para una o más propiedades de elemento en lugar de los valores distintivos extraídos originalmente manejando su ConsultaValorDistinto y devolviendo el valor personalizado.
<Grid xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid">
<Grid.Resources>
<xcdg:DataGridCollectionViewSource x:Key="cvs_orders"
Source="{Binding Source={x:Static Application.Current}, Path=Orders}"
AutoFilterMode="And"
DefaultCalculateDistinctValues="False">
<xcdg:DataGridCollectionViewSource.ItemProperties>
<xcdg:DataGridItemProperty Name="OrderDate"
QueryDistinctValue="DataGridItemProperty_QueryDistinctValue_Date"
CalculateDistinctValues="True"/>
<xcdg:DataGridItemProperty Name="RequiredDate"
QueryDistinctValue="DataGridItemProperty_QueryDistinctValue_Date"
CalculateDistinctValues="True" />
<xcdg:DataGridItemProperty Name="ShippedDate"
QueryDistinctValue="DataGridItemProperty_QueryDistinctValue_Date"
CalculateDistinctValues="True" />
<xcdg:DataGridItemProperty Name="Freight"
QueryDistinctValue="DataGridItemProperty_QueryDistinctValue_Range"
CalculateDistinctValues="True" />
</xcdg:DataGridCollectionViewSource.ItemProperties>
</xcdg:DataGridCollectionViewSource>
</Grid.Resources>
<xcdg:DataGridControl x:Name="OrdersGrid"
ItemsSource="{Binding Source={StaticResource cvs_orders}}"/>
</Grid>
private void DataGridItemProperty_QueryDistinctValue_Date( object sender, QueryDistinctValueEventArgs e )
{
if( e.DataSourceValue is DateTime )
{
e.DistinctValue = ( ( DateTime )e.DataSourceValue ).ToString( "MMMM" );
}
}
private void DataGridItemProperty_QueryDistinctValue_Range( object sender, QueryDistinctValueEventArgs e )
{
if( e.DataSourceValue is decimal )
{
decimal value = ( decimal )e.DataSourceValue;
if( value <= 100 )
{
e.DistinctValue = "0 - 100";
}
else if( value > 100 && value <= 500 )
{
e.DistinctValue = "101 - 500";
}
else
{
e.DistinctValue = "500+";
}
}
}
Para más información, consulte el documentación.