Laden...

Default-Einstellung für 3rd Party Komponente applikationsweit ändern

Erstellt von Reinhardtinho vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.279 Views
Reinhardtinho Themenstarter:in
35 Beiträge seit 2008
vor 13 Jahren
Default-Einstellung für 3rd Party Komponente applikationsweit ändern

Hi,

ich verwende 3rd Party Komponenten (DevExpress) in meinem Programm.

Nun möchte ich ein bestimmtes Property einer Komponente immer mit einem Default-Wert belegen, wenn das Control erzeugt wird.

Kann man dies per Reflection oder auf eine andere Weise lösen, ich möchte allerdings nicht die Komponente durch eine eigene austauschen und auch nicht bei jeder Verwendung diesen Wert erst setzen.

Ich habe das Thema mal unter Basistechnologien gepostet, obwohl es sich in diesem Fall um eine WinForm-Komponente handelt, aber der Weg sollte generell für Komponenten gelten.

Ich habe viel von meinem Geld für Alkohol, Weiber und schnelle Autos ausgegeben ... Den Rest habe ich einfach verpraßt.

George Best - 22.05.1946 - 25.11.2005 - nordirischer Fußballspieler

731 Beiträge seit 2006
vor 13 Jahren

Hi,

ich würde an deiner Stelle einfach von dem Control erben. Dann habt ihr in Zukunft immer eine gute Möglichkeit eigene Standards zu definieren.

MfG
wax

Reinhardtinho Themenstarter:in
35 Beiträge seit 2008
vor 13 Jahren

Das hatte ich auch in Betracht gezogen, werde ich dann auch so machen müssen.

Ich wollte nur sichergehen, dass das Verhalten generell so ist und nicht jeder Entwickler immer daran denken muss, dass man hier nicht die Komponente CompoXY sondern MyCompoXY verwenden muss.

Ich habe viel von meinem Geld für Alkohol, Weiber und schnelle Autos ausgegeben ... Den Rest habe ich einfach verpraßt.

George Best - 22.05.1946 - 25.11.2005 - nordirischer Fußballspieler

2.298 Beiträge seit 2010
vor 13 Jahren

Müssen die Entwickler doch auch nicht dran denken.

Das geerbte Control kommt in eine eigene Assembly und diese haben die Entwickler dann einzubinden. -> Somit können sie keine direkte Instanz von CompoXY anlegen sondern müssen immer auf MyCompoXY zugreifen.

Und binden sie dann doch die original Assembly ein wird ihnen eben auf die Finger gehaun...

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

Reinhardtinho Themenstarter:in
35 Beiträge seit 2008
vor 13 Jahren

Ja, so werde ich es auch machen.

Danke euch.

Ich habe viel von meinem Geld für Alkohol, Weiber und schnelle Autos ausgegeben ... Den Rest habe ich einfach verpraßt.

George Best - 22.05.1946 - 25.11.2005 - nordirischer Fußballspieler

2.187 Beiträge seit 2005
vor 13 Jahren

Hallo Reinhardtinho,

Gib nicht so schnell auf, es geht tasächlich.
Es enthält zwar ein paar eklige Hacks hier aber die Lösung:

  1. Schritt: Application.OpenForms hacken um an jeder Instanz von System.Windows.Forms.Form zu kommen:
  public class Hack : System.Collections.ArrayList
  {
    public void DoHack()
    {
      try
      {
        typeof(System.Collections.ReadOnlyCollectionBase).GetField("list", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(Application.OpenForms, this);
      }
      catch
      {
      }
    }
    
    public override int Add(object value)
    {
      Form f = value as Form;
      if (f != null)
      {
        // Hier kommt dann teil 2
      }
      return base.Add(value);
    }
  }
  1. Schritt: Bei jeder Form rekursiv nach allen Instanzen des zu ändernden Controls suchen

    private static IEnumerable<C> Suchen<C>(Control.ControlCollection cc)
      where C : Control
    {
      if(cc!=null)
        foreach (Control c in cc)
        {
          C re = c as C;
          if (re != null)
            yield return re;
          foreach (C reN in Suchen<C>(c.Controls))
            yield return reN;
        }
    }

  1. Wenn man alle Instanzen hat, muss man "nur noch" das Property auslesen, prüfen ob es der Standard ist und ändern
    (Beispiel mit TextBox und BorderStyle)

        IEnumerable<TextBox> alle = Suchen<TextBox>(f.Controls);
        foreach (TextBox t in alle)
        {
          if (t.BorderStyle == BorderStyle.Fixed3D)
            t.BorderStyle = BorderStyle.None;
        }

Teil 1 ist ein "dreckiger" Hack, funktioniert aber.
Teil 2 ist ziemlich normal.
Bei Teil 3 wird es halt schwierig den Standardwert zu erkennen bzw. zu erkennen, dass der Wert zu ändern ist.

Gruß
Juy Juka

PS: Ach ja, der Quellcode ist nicht 100%ig getestet, in einem anderen Szenario hab ich es so (ähnlich) aber benutzt.

731 Beiträge seit 2006
vor 13 Jahren

Das ist in Verbindung mit DevExpress nicht ganz so einfach. "Die" erben nicht mit jedem GUI-Element von Control. Aber versuchen kann er es ja mal.

MfG
wax