Frage

Mit

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

auf der Deklaration einer Klasse (die eine Eigenschaft einer anderen Klasse ist), die aus mehreren Eigenschaften bestehen.

Ich lade eine Instanz dieser Klasse mit einfach ...

PropertyGrid1.SelectedObject = oColumn

Natürlich will ich nicht manuell den Property in Code bauen, ich weiß, wie das zu tun.

Aber hier ist das Problem. Je nach Wert einer Immobilie sollten bestimmte andere Eigenschaften nicht sichtbar sein, als ob ich benutzt hatte, die

<System.ComponentModel.Browsable(False)> _

Attribut auf der Eigenschaftsdeklaration.

Gibt es trotzdem, dies programmatisch zu tun, ohne alle Gebäude des Anwesens Gitter manuell zu handhaben, die>

War es hilfreich?

Lösung

Wenn Sie für einen gridItem.Hide erhofften (), dann ist die Antwort nein. Der einzige Weg, zu erreichen, dass in der MS Property ist dynamisch Ihre Eigenschaften durch die GetProperties Methode eines Typeconverter oder benutzerdefinierten Typdeskriptor zu veröffentlichen (das implementiert ICustomTypeDescriptor). Ich würde versuchen, zuerst mit dem Typeconverter (besonders, wenn die Eigenschaftswerte Sie sind auf der gleichen Ebene überprüfen mögen), gibt es weniger Codierung zu tun.

Andere Tipps

Eigentlich ist dies durchaus möglich. Die erste und einfachste Art und Weise ist das Netz der BrowsableAttributes Eigenschaft festlegen:

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

Damit werden alle Eigenschaften herauszufiltern, die die Attributtypen nicht übereinstimmen Sie liefern. Leider ist dies ein positiver Filter eher als ein negativer Filter, der es weniger nützlich IMHO macht.

Zweitens, und ebenso leicht, können Sie eine einfache Wrapper um das Objekt erstellen Sie im Property angezeigt werden sollen und neu definieren, was Eigenschaften, die Sie / etc ausblenden mögen. als Pass-Through-Eigenschaften:

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

Pop, dass in ein Eigenschaftenraster und die Enabled-Eigenschaft wird ausgeblendet werden.

Drittens können Sie die Property selbst anpassen und in die Welt der Typdeskriptoren bekommen und so weiter, aber wenn alles, was Sie tun wollen, ein paar Eigenschaften ist verstecken, das ist übertrieben.

Hope, das hilft.

Wie für die C ++, hier ist eine einfache Lösung der ausgewählte Kategorie in einem propertyGrid zu zeigen.

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

Dies wird nur ‚Aussehen‘ Kategorie in der Property zeigen und alle anderen Kategorien verstecken. Vorausgesetzt, dass Sie den Code in C # übersetzen kann sich selbst.

Diese Frage ist ähnlich, aber die Antworten sind vollständiger. Einige Leute auf Querverweis wünschen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top