Programaticamente Ocultar campo no PropertyGrid
-
06-07-2019 - |
Pergunta
Usando
<System.ComponentModel.TypeConverter(GetType(System.ComponentModel.ExpandableObjectConverter))> _
na declaração de uma classe (que é uma propriedade de outra classe), que consiste em propriedades numéricas.
eu carregar uma instância dessa classe com simplesmente ...
PropertyGrid1.SelectedObject = oColumn
Obviamente eu não quero construir manualmente o PropertyGrid em código, eu sei como fazer isso.
Mas aqui está o problema. Dependendo do valor de uma propriedade, algumas outras propriedades não devem ser visíveis, como se eu tivesse usado o
<System.ComponentModel.Browsable(False)> _
atributo na declaração de propriedade.
Existe uma maneira de fazer isso programaticamente, sem ter que lidar com todo o edifício da grade de propriedade manualmente>
Solução
Se você estava esperando para uma gridItem.Hide (), em seguida, a resposta é não. A única maneira de conseguir isso no MS PropertyGrid é publicar dinamicamente suas propriedades através do método GetProperties de um descritor TypeConverter ou personalizado tipo (que implementa ICustomTypeDescriptor). Gostaria de tentar primeiro com o TypeConverter (especificamente se os valores de propriedade que pretende verificar estão no mesmo nível), há menos de codificação para fazer.
Outras dicas
Na verdade, isso é perfeitamente possível. O primeiro e mais fácil é para definir a propriedade BrowsableAttributes da grade:
propGraph.BrowsableAttributes = new AttributeCollection(
new Attribute[]
{
new CategoryAttribute("Appearance")
});
Este irá filtrar todas as propriedades que não coincidem com os atributos de tipos que você fornece. Infelizmente este é um filtro positivo, em vez de um filtro negativo que torna IMHO menos útil.
Em segundo lugar, e igualmente fácil, você pode criar um wrapper simples em volta do objeto que você deseja exibir no PropertyGrid e re-definir o que quer que propriedades deseja esconder / etc. como propriedades de passagem:
public class MyDerivedControl : public TextBox
{
[Browsable(false)]
[Category("MyCustomCategory")]
public new bool Enabled
{
get { return base.Enabled }
set { base.Enabled = value; }
}
}
Pop que em uma grade de propriedade e a propriedade Enabled serão ocultados.
Em terceiro lugar, você pode personalizar o PropertyGrid-se e entrar no mundo dos descritores de tipo e assim por diante, mas se tudo que você quer fazer é esconder algumas propriedades, este é um exagero.
Espero que isso ajude.
Quanto ao C ++, aqui é uma solução fácil para mostrar categoria selecionada em uma propertyGrid
.
cli::array<Attribute^,1>^ attrs = {gcnew CategoryAttribute("Appearance")};
this->PropertyGrid->BrowsableAttributes = gcnew AttributeCollection(attrs);
this->PropertyGrid->SelectedObject = this->SelectedControl;
Isto irá mostrar única categoria 'Appearance' na PropertyGrid e ocultar todas as outras categorias. Supondo que você pode traduzir o código em C # se.
Esta Pergunta é semelhante, mas as respostas são mais completo. Algumas pessoas podem querer referência cruzada.