Filtrage dans Xceed DataGrid pour WPF

La grille de données pour WPF offre trois façons de définir un filtre : Filtrage natif de CollectionView (en utilisant le paramètre Filter sur CollectionViewSource), Filtrage automatique (en utilisant le AutoFilterControl) et Filtrage avancé (en utilisant le FilterRow).

En savoir plus sur Xceed DataGrid pour WPF

La dernière fois que nous avons examiné la grille de données pour WPF, nous avons abordé le regroupement et le tri. Aujourd'hui, nous allons nous pencher sur les options de filtrage offertes par la grille de données.

Options de filtrage

La grille de données pour WPF offre trois façons de définir un filtre :

  • Filtrage natif des CollectionView (à l'aide du paramètre Filter de la CollectionViewSource)
  • Filtrage automatique (à l'aide de la commande AutoFilterControl)
  • Filtrage avancé (à l'aide de FilterRow)

Filtrage natif des CollectionViews

Les données affichées dans une grille peuvent être filtrées à l'aide de la fonction Filtre de la propriété DataGridCollectionViewBase ou le Filtre de l'événement DataGridCollectionViewSourceBase à laquelle il est lié.

<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;
		}
	}
}

Pour filtrer à nouveau les éléments de données affichés dans une vue, la fonction La méthode de rafraîchissement peut être appelée sur la source ItemsSource.

( ( DataGridCollectionView )this.OrdersGrid.ItemsSource ).Refresh();

Filtrage automatique

Le DataGridCollectionView et DataGridDetailDescription prennent en charge le filtrage automatique, qui permet à l'utilisateur final d'effectuer un filtrage similaire à celui d'Excel en fonction des valeurs distinctes de chaque colonne. Le filtrage automatique peut être activé en définissant la propriété AutoFilterMode à la propriété Et ou Ou (Aucun par défaut), indiquant si les éléments de données seront filtrés en fonction de tous ou au moins un des critères de filtrage définis par la commande de filtrage automatique de chaque colonne. Les critères de filtrage Contrainte de valeurs distinctes peut également être définie pour déterminer si les valeurs distinctes doivent être filtrées en fonction du résultat des opérations de filtrage automatique précédentes.

Option1 : définir dans 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>

Opion 2 : définir dans le 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;  

Filtrage avancé

En plus du filtrage automatique, la grille fournit une FilterRow qui permet aux utilisateurs de spécifier une expression de filtrage utilisée par la fonction DataGridCollectionView pour filtrer les éléments de données. Les expressions de filtrage saisies dans Cellule de filtrage suivent une syntaxe et des règles spécifiques. L'apprentissage de ces règles peut s'avérer fastidieux pour les utilisateurs, et c'est là que le filtrage avancé vient à la rescousse. Le filtrage avancé fournit une interface utilisateur qui aide les utilisateurs à construire des expressions de filtrage sans avoir à apprendre une autre syntaxe.

Le filtrage avancé peut être activé en définissant le paramètre AdvancedFilterMode à une valeur autre que Aucunqui est la valeur par défaut. Le mode choisi indique comment le contrôle du filtrage avancé est déclenché. Notez qu'il est possible de désactiver le filtrage avancé pour chaque colonne en définissant le paramètre AllowAdvancedFilter à la propriété faux (vrai par défaut), cela empêchera l'affichage du contrôle de filtre avancé pour cette colonne.

<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>

Valeurs distinctes personnalisées

Par défaut, les valeurs affichées dans le menu déroulant du filtre automatique représentent les valeurs distinctes telles qu'elles sont extraites de la source de données sous-jacente. Toutefois, des valeurs distinctes personnalisées peuvent être fournies pour une ou plusieurs propriétés d'élément plutôt que les valeurs distinctes extraites à l'origine, en gérant leurs propriétés QueryDistinctValue et renvoie la valeur personnalisée.

<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+";
		}
	}
}

Pour plus d'informations, veuillez vous référer à la la documentation.