PropertyGrid / Converter / ConvertFrom -> selektives Schreiben



  • Morgen,

    lese ja idr nur still mit hier, aber nun habe ich mal wieder eine kleine frage. ich habe eine datencontainer klasse, die eine menge properties enthält. die klasse ist an ein propertygrid gebunden. um etwas überischt zu schaffen neben den kategorien, habe ich angefangen einige werte in internal structs zusammenzufassen und für diese typeconverter implementierungen erstellt, um die structs inline im propertygrid darstellen zu können.

    die grundlegende logik hinter den typeconvertern ist ja übelste stringschieberei, sofern ich da nicht etwas übersehen habe. nun habe ich zwei felder in meiner klasse, die jeweils 6 double werte enthalten, was zu einem hässlichen werteratttenschwanz im parent node des propertygrid führt. etwa nach folgendem (pseudo)muster in der propertygrid darstellung:

    container (500,6000,1000, ...)
        property A = 500
        property B = 600
        property C = 1000
        usw...
    

    ich möchte nun aber, dass der node container nur b liest/schreibt und nicht jedesmal einen string aus a,b , ..., f bastelt. das problem besteht nun darin, dass die zu überschreibende methode ConvertFrom immer ein vollständiges Object , bzw instanz meiner struct als rückgabe erwartet und ich andererseits aber nicht an die daten aus meinem container herankomme. ich kann also entweder alle 6 werte in form eines strings im containernode speichern beim auslesen, oder ich speichere nur selektiv beim lesen, verliere dann aber daten beim schreiben. ich habe versucht die adresse meiner struct, die von ConvertTo als Object übergeben wird, als struct in einen pointer zu casten, was aber natürlich an 'computer sagt nein (object).' scheiterte.

    da wahrscheinlich jemand direkt nach code schreit poste ich abschliessend die entsprechende ConvertFromMethode. da ich nich wüsste, welcher code sonst noch hilfreich sein sollte.

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    		{
    			if (value is string) 
    			{
    				string[] v = ((string)value).Split(new char[] {','});
    				return new ResistanceContainer(Double.Parse(v[0]), Double.Parse(v[1]), Double.Parse(v[2]),Double.Parse(v[3]), Double.Parse(v[4]), Double.Parse(v[5]));
    			}
    			return base.ConvertFrom(context, culture, value);
    		}
    

    ich freue mich über jede art von hilfe und bedanke mich fürs lesen.


  • Administrator

    Ich nehme mal an, dass es um das PropertyGrid aus WinForms geht?
    Zusätzlich nehme ich an, dass deine Daten ca. so aufgebaut sind?

    class MySubData
    {
      public double PropertyA { get; set; }
      public double PropertyB { get; set; }
      public double PropertyC { get; set; }
      public double PropertyD { get; set; }
      public double PropertyE { get; set; }
    }
    
    class MyData
    {
      [TypeConverter(typeof(MyConverter))]
      public MySubData Sub { get; set; }
    }
    

    Du willst nun trotzdem alle Elemente von Sub anzeigen, aber in der Zusammenfassung nur MySubData.PropertyB bearbeiten lassen? Empfinde ich als etwas seltsam, aber ok ...

    Kannst du die Werte aus MySubData auf ungültige Werte setzen? Zum Beispiel Double.NaN ? Ein relativ einfacher Hack wäre dies auszunützen und den Setter dies prüfen zu lassen:

    class MyData
    {
      private MySubData m_sub;
    
      [TypeConverter(typeof(MyConverter))]
      public MySubData Sub
      {
        get { return m_sub; }
        set
        {
          if(Double.IsNaN(value.PropertyA))
          {
            m_sub.PropertyB = value.PropertyB;
          }
          else
          {
            m_sub = value;
          }
        }
      }
    }
    

    Oder sowas in der Richtung ...

    Grüssli



  • ja alle annahmen stimmen und der vorschlag ist natürlich offensichtlich richtig.
    als erklärung für meine etwas eingentümliche fragestellung : propertyA stellt
    quasi eine schnelleinstellung für die anderen properties da, bzw der setter
    überschreibt die anderen anhand von Min/Max regeln. so kann man das werte
    bündel grob einstellen, ohne das feld ausklappen zu müssen, zerstört aber
    auch nicht eventuell vorhanden feineinstellungen dabei.

    vielen dank für die schnelle hilfe, hätte ich natürlich auch selbst drauf kommen
    können, aber naja 😉


Anmelden zum Antworten