Laden...

gridItem in PropertyGrid ein IsChanged-Attribut hinzufügen

Erstellt von antoschka vor 15 Jahren Letzter Beitrag vor 15 Jahren 879 Views
A
antoschka Themenstarter:in
371 Beiträge seit 2007
vor 15 Jahren
gridItem in PropertyGrid ein IsChanged-Attribut hinzufügen

Hallo,

ich würde gern feststellen, welches item eines PropertyGrids geändert wurde. Würde deshalb gern dem PropertyDescriptor von gridItem ein Attribut hinzufügen, welches per default false ist und wenn der Wert des Items geändert wird auf true gestellt wird.

Würde man das so machen? Wenn ja hat jemand eine hinreichend ausführliche Beschreibung, wie das gehen könnte. Besten Dank für Eure Mühe und Hilfe

Liebe Grüße antoschka

P
48 Beiträge seit 2008
vor 15 Jahren

Hi antoschka,

Erstmal ein Attribute anlegen:


   [AttributeUsage(AttributeTargets.Property)]
   public class ValueChangedAttribute : Attribute
   {
      private bool itsIsChanged = false;

      public bool IsChanged
      {
         get
         {
            return itsIsChanged;
         }
         set
         {
            itsIsChanged = value;
         }
      }


      public ValueChangedAttribute()
      {
      }
   }

Dann eine kleine Testklasse zur Demonstration

 
   public class TestClass
   {
      private int itsTestValue = 0;


      [ValueChangedAttribute()]
      public int TestValue
      {
         get
         {
            return itsTestValue;
         }
         set
         {
            itsTestValue = value;
         }
      }



      public TestClass()
      {
      }
   }

Und eine kleine Test-Anwendung


      // Anmelden
      private void button1_Click(object sender, System.EventArgs e)
      {
         propertyGrid1.SelectedObject = itsTestClass;

         propertyGrid1.PropertyValueChanged += new PropertyValueChangedEventHandler(propertyGrid1_PropertyValueChanged);
      }

      // Value Changed setzen
      private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
      {                  
         object aAttribute = e.ChangedItem.PropertyDescriptor.Attributes[typeof(ValueChangedAttribute)];
         if (aAttribute != null)
         {
            ((ValueChangedAttribute)aAttribute).IsChanged = true;
         }
      }

      // Abfrage
      private void button2_Click(object sender, System.EventArgs e)
      {
         string aText = "";

         PropertyDescriptorCollection aCol = TypeDescriptor.GetProperties(itsTestClass);
         foreach (PropertyDescriptor aProp in aCol)
         {
            object aAttribute = aProp.Attributes[typeof(ValueChangedAttribute)];
            if (aAttribute != null)
            {
               aText += aProp.Name + ", changed: " +  ((ValueChangedAttribute)aAttribute).IsChanged.ToString() + "\r\n";
            }
         }

         MessageBox.Show(aText);
      }

Zuerst mal das Objekt (eine TestClass) dem Grid übergeben, dabei (EINMAL) an den Event (PropertyValueChanged) anmelden.
Dann erscheint die Klasse im Grid.
Solltest du jetzt den Status abfragen, ist dieser "false" (also nix geändert).
Änderst du jetzt das TestValue im Grid (zb von 0 auf 1) und fragst wieder ab,
bekommst du die Information dass der Status "true" ist, das Property wurde also geändert.

Grüße,

psy

1.665 Beiträge seit 2006
vor 15 Jahren

Hallo,

das ist der gängige Weg um Veränderungen im Vergleich zum Standard-Wert festzustellen:

PropertyDescriptor propertyDescriptor;
Attribute attribute = propertyDescriptor.Attributes[typeof(DefaultValueAttribute)];
if (attribute != null)
{
    if (attribute.Match(<value>) == false)
    {
        // Property modified
    }
}

Deswegen solltest du bei jedem Property das von dir ist, ein DefaultValue-Attribut benutzen.

P
48 Beiträge seit 2008
vor 15 Jahren

Hi JunkyXL,

ich glaube er wollte auch Änderungen zum Momentan- und nicht Standardwert haben.
Zudem gibt es Properties die kein DefaultValue haben können (zumindest nicht über das Attribute).
Und da ist die Variante, die ich beschrieben habe, zwar kompliziert, aber wesentlich flexibler.

Grüße,

psy