Domanda

con

<System.ComponentModel.TypeConverter(GetType(System.ComponentModel.ExpandableObjectConverter))> _

sulla dichiarazione di una classe (che è una proprietà di un'altra classe) che consiste in un numero di proprietà.

Carico un'istanza di questa classe con semplicemente ...

PropertyGrid1.SelectedObject = oColumn

Ovviamente non voglio costruire manualmente il propertygrid nel codice, so come farlo.

Ma ecco il problema. A seconda del valore di una proprietà, alcune altre proprietà non dovrebbero essere visibili, come se avessi usato

<System.ComponentModel.Browsable(False)> _

attributo sulla dichiarazione di proprietà.

Esiste un modo per farlo in modo programmatico, senza dover gestire manualmente tutta la costruzione della griglia delle proprietà >

È stato utile?

Soluzione

se speravi in ??gridItem.Hide (), allora la risposta è no. L'unico modo per raggiungere questo obiettivo nel PropertyGrid di MS è pubblicare dinamicamente le proprietà tramite il metodo GetProperties di un TypeConverter o un descrittore di tipo personalizzato (che implementa ICustomTypeDescriptor). Proverei prima con TypeConverter (specialmente se i valori delle proprietà che vuoi controllare sono allo stesso livello), c'è meno codice da fare.

Altri suggerimenti

In realtà questo è del tutto possibile. Il primo e il modo più semplice è impostare la proprietà BrowsableAttributes della griglia:

propGraph.BrowsableAttributes = new AttributeCollection(
    new Attribute[] 
    { 
        new CategoryAttribute("Appearance")
    });

Questo filtrerà tutte le proprietà che NON corrispondono ai tipi di attributo forniti. Purtroppo questo è un filtro positivo piuttosto che un filtro negativo che lo rende meno utile IMHO.

In secondo luogo, e altrettanto facile, è possibile creare un semplice wrapper attorno all'oggetto che si desidera visualizzare in PropertyGrid e ridefinire le proprietà che si desidera nascondere / ecc. come proprietà passthrough:

public class MyDerivedControl : public TextBox
{
    [Browsable(false)]
    [Category("MyCustomCategory")]
    public new bool Enabled
    {
         get { return base.Enabled }
         set { base.Enabled = value; }
    }
}

Inseriscilo in una griglia di proprietà e la proprietà Enabled verrà nascosta.

Terzo, puoi personalizzare PropertyGrid stesso ed entrare nel mondo dei descrittori di tipi e così via, ma se tutto ciò che vuoi fare è nascondere un paio di proprietà, questo è eccessivo.

Spero che questo aiuti.

Per quanto riguarda il C ++, ecco una soluzione semplice per mostrare la categoria selezionata in un propertyGrid .

cli::array<Attribute^,1>^ attrs = {gcnew CategoryAttribute("Appearance")};
this->PropertyGrid->BrowsableAttributes = gcnew AttributeCollection(attrs);
this->PropertyGrid->SelectedObject = this->SelectedControl;

Questo mostrerà solo la categoria 'Aspetto' nella proprietàGrid e nasconderà tutte le altre categorie. Supponendo che tu possa tradurre tu stesso il codice in C #.

Questa domanda è simile, ma le risposte sono più completo. Alcune persone potrebbero voler fare riferimenti incrociati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top