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
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
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
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 |
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
Hallo Reinhardtinho,
Gib nicht so schnell auf, es geht tasächlich.
Es enthält zwar ein paar eklige Hacks hier aber die Lösung:
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);
}
}
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;
}
}
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.
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