Daten für Verwendung mit Propertygrid in Attribut speichern



  • Hallo Experten,

    ich weiß, dass crossposts (http://www.codeproject.com/Messages/3798403/Store-data-in-Attribute-for-use-in-PropertyGrid.aspx) nicht gern gesehen sind, aber nach einer Woche ohne Antwort dürfte das in Ordnung gehen.

    Ich habe also ein Objekt mit mehreren Eigenschaften, die der Benutzer in einem PropertyGrid ändern können soll. Mehrere dieser Eigenschaften hängen logisch zusammen.

    Es existieren Kombinationen von Einstellungen, die nicht zulässig sind. Stellt der Benutzer solch eine Kombination ein, so soll das im PropertyGrid sichtbar sein. Die Darstellung übernimmt

    public class ExclamationTypeEditor : System.Drawing.Design.UITypeEditor
        {
            public override bool GetPaintValueSupported(System.ComponentModel.ITypeDescriptorContext context)
            {
                return(PropertyEditor.CalmdownWarningAttribute.IsSet(context.PropertyDescriptor));
            }
    
            public override void PaintValue(System.Drawing.Design.PaintValueEventArgs e)
            {
                if (
                    PropertyEditor.CalmdownWarningAttribute.IsSet(e.Context.PropertyDescriptor)
                    // mark**
                    && !PropertyEditor.CalmdownWarningAttribute.GetValue(e.Context.PropertyDescriptor)
                )
                    e.Graphics.DrawImage(InterrollConfigurator.Properties.Resources.Exclamation, e.Bounds);
            }
        }
    

    Vorher muss die Information über betroffene Werte hinterlegt werden. Dafür dekoriere ich die Eigenschaften mit einem Attribut, das einen boolschen Wert enthält.

    PropertyEditor.CalmdownWarningAttribute.SetValue(typeof(Foo).GetProperty("Speed1"), true);
    
    public static void SetValue(System.Reflection.PropertyInfo property, bool value)
                {
                    //An array of all attributes of type CalmdownWarning that
                    // have been applied to this property.
                    object[] attributes = property.GetCustomAttributes(typeof(PropertyEditor.CalmdownWarningAttribute), true);
    
                    //If any CalmdownWarning attribute exists, return true.
                    if (attributes.Length <= 0)
                        throw new Exception("Attribute \"ShowWarning\" is not set for property \"" + property.Name + "\".");
    
                    // mark*
                    ((CalmdownWarningAttribute)(attributes[0]))._calmdownWarning = value;
                }
    

    Mein Problem im Augenblick ist, dass die Fehleranzeige immer gezeichnet wird.

    Beim Schrittweisen Ausführen sehe ich, dass an der Stelle mark* der boolsche Wert korrekt gesetzt wird, an der Stelle mark** aber wieder seinen Standardwert einnimmt.

    Bin ich auf dem völlig falschen Dampfer?
    Hat jemand einen Vorschlag, wie ich die Icons neben dem Wert in PropertyGrid zur Laufzeit verändern kann?

    Ciao,

    luker


  • Administrator

    luker schrieb:

    ich weiß, dass crossposts (http://www.codeproject.com/Messages/3798403/Store-data-in-Attribute-for-use-in-PropertyGrid.aspx) nicht gern gesehen sind, aber nach einer Woche ohne Antwort dürfte das in Ordnung gehen.

    Sehe ich kein Problem, vor allem auch wenn du darauf hinweist. Was noch praktisch wäre, wenn du statt code-Tags die cs-Tags verwendest, damit der Code in C# Syntax hervorgehoben wird. Macht es angenehmer zu lesen 😉

    Ansonsten ... tut mir leid, hab keinen Plan von PropertyGrid und dem was du sagst, müsste mich da also zuerst einarbeiten und dazu aktuell keine Zeit. Sorry.

    Grüssli



  • Wenn ich das richtig sehe wird der Code zur Designtime laufen, dann kannst auch versuchen bei einem iServiceProvider den IUIService herauszufinden und dann dort die ShowError Methode entsprechend aufzurufen, eine Fehlermeldung anzeigen und den Wert zurückzusetzen. sosnt kannst du auch verscuhen einen Eigenen Service zu erzeugen, der sich um sowas kümmert.



  • Rhombicosidodecahedron schrieb:

    Wenn ich das richtig sehe wird der Code zur Designtime laufen

    Nein, es geht um ein PropertyGrid, das zur Laufzeit in einem Programm verwendet wird.

    Rhombicosidodecahedron schrieb:

    eine Fehlermeldung anzeigen und den Wert zurückzusetzen.

    Die Anzeige ist nicht das Problem, die funktioniert schon. Ich benötige eine Möglichkeit, abhängig von irgendeiner Bedingung festzulegen, was die Anzeige anzeigen soll.

    Ich könnte natürlich zu jeder Eigenschaft noch eine bool'sche Variable einführen, aber das fordert Laufzeitfehler wegen vergessener Variabler ja geradezu heraus. Lieber wäre mir, den Bool-Wert per Attribut an die Eigenschaft zu knüpfen.


Anmelden zum Antworten