A livello di codice Nascondi campo in PropertyGrid
-
06-07-2019 - |
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à >
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.