Filtrer dynamiquement les propriétés affichées

using System;

using System.ComponentModel;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

/// <summary>

/// Code exemple illustrant comment fitrer les propriétés affichées dans la grille

/// de propriétés en utilisant un identifiant.

/// </summary>

public Form1()

{

InitializeComponent();

propertyGrid.SelectedObject = new Proprietes();

//Cacher les propriétés non utilisées

//Calculer la valeur de l'identifiant à afficher en réalisant

//l'opération de bits OR sur les opérandes

//On affiche ici uniquement les propriétes "ProprieteUne" et "ProprieteTrois" : 0x1 | 0x4 = 0x5

propertyGrid.BrowsableAttributes =

new AttributeCollection(new CleAttribut(ClePropriete.ProprieteUne | ClePropriete.ProprieteTrois));

//La surcharge de la méthode de comparaison de la classe Cle permet

//d'afficher les propriétés spécifiés par leur identifiant

}

}

/// <summary>

/// Classe décrivant les propriétés à afficher dans la grille de propriétés.

/// </summary>

public class Proprietes

{

[CleAttribut(ClePropriete.ProprieteUne)]

public int ProprieteUne

{

get { return 1; }

set { }

}

[CleAttribut(ClePropriete.ProprieteDeux)]

public int ProprieteDeux

{

get { return 2; }

set { }

}

[CleAttribut(ClePropriete.ProprieteTrois)]

public int ProprieteTrois

{

get { return 3; }

set { }

}

}

/// <summary>

/// Identifiant des propriétes affichées dans le panneau de propriétés.

/// </summary>

public enum ClePropriete

{

ProprieteUne = 0x1,

ProprieteDeux = 0x2,

ProprieteTrois = 0x4

}

/// <summary>

/// Classe définissant l'identifiant d'une propriété.

/// </summary>

[AttributeUsage(AttributeTargets.Property)]

public class CleAttribut : Attribute

{

private ClePropriete clePropriete;

public CleAttribut(ClePropriete clePropriete)

{

this.clePropriete = clePropriete;

}

public override bool Match(object obj)

{

// Surcharge de la méthode de comparaison de l'attribut afin de supporter les comparaisons

//bits à bits.

return ((CleAttribut)obj).clePropriete == (((CleAttribut)obj).clePropriete & this.clePropriete);

}

}

}