Probleme mit Properties bei abgeleiteten Controls

26/06/2008 - 15:49 von Christian Weinert | Report spam
Hallo Zusammen,
ich kàmpfe momentan mit einem Problem bei der Ableitung von WinForm Controls.

Ich habe in Visual Studio ein neues UserControl angelegt. Dieses habe ich
abgeleitet von DataGridView. Das neue "DataGridView"-Control soll als
"Vorlage" für weitere Controls dienen, d.h. ich möchte hier diverse
Einstellungen vornehmen. Von der neuen "DataGridView" abgeleitete Controls
sollen diese Einstellungen dann als Vorbelegung übernehmen.

Meine Basisklasse sieht wie folgt aus:

public partial class BaseDataGrid : System.Windows.Forms.DataGridView
{
private bool _Enabled;

public BaseDataGrid() : base()
{
InitializeComponent();
this.Enabled = false;
}

[DefaultValue(false)]
public new bool Enabled
{
get
{
return this._Enabled;
}
set
{
this._Enabled = value;
}
}
}

Zum Testen habe ich eine WinForm angelegt und auf dieser das BaseDataGrid
-Control aufgezogen. Im Property-Fenster wird mir die Enabled-Eigenschaft
zwar angezeigt. Diese steht aber auf "true" und nicht auf "false", was ich
eigentlich erwartet hàtte. Allerdings ist der Eintrag "true" fett
dargestellt, d.h. der Designer scheint mitbekommen zu haben, dass der
eigentliche Default-Wert "false" ist.

Das ganze làsst sich noch weiter ausbauen. Leite ich nun ein neues Control
von meinem BaseDataGrid ab, ziehe es auf der Form auf, so steht auch hier die
Eigenschaft Enabled auf "true" anstatt auf "false".

Es scheint so, dass der Designer die Bestimmung des Defaultwertes aus der
nàchsthöheren Ebene in der Hierarchie nimmt, die Vorbelegung im
Property-Fenster allerdings aus dem Default-Wert der obersten Klasse in der
Objekthierarchie bestimmt.

Mein zweiter Ansatz war, dass ich die Property Enabled nicht mit new
überschreibe, sondern vielmehr im Konstruktor der Basisklasse einfach nur
vorbelege.

public partial class BaseDataGrid : System.Windows.Forms.DataGridView
{
public BaseDataGrid() : base()
{
this.Enabled = false;
}
}

Ziehe ich nun dieses Control wieder auf die Form steht in der Property
Enabled der Wert "false". Ändere ich diesen nun auf "true" ab,w ird die
Änderung nciht in den Designer-Code geschrieben und beim Starten der Form hat
das Control Enabled auf false stehen.

Hoffe, jemand kann mir ein Lösungsansatz nennen, wie ich es schaffe, dass
abgeleitete Controls die Einstellungen der in der Klassenhierarchie direkt
über ihnen stehenden Controls übernehmen und sich nicht die komplette
Vererbungshierarchie "hocharbeiten".

Danke im Voraus!

Gruß
Christian Weinert
 

Lesen sie die antworten

#1 Frank Dzaebel
28/06/2008 - 16:38 | Warnen spam
Hallo Christian,

ich kàmpfe momentan mit einem Problem bei der Ableitung von WinForm
Controls.



Zunàchst zur Wiederholung einfach mal die Essenzen:

[Polymorphismus (C#)]
http://msdn.microsoft.com/de-de/lib...73152.aspx

[new-Modifizierer (C#-Referenz)]
http://msdn.microsoft.com/de-de/lib...f1dw2.aspx


Dann mal die interne Implementierung der
Basisklasse, woran Du siehst, wie das interne Handling ist:

// ...
public bool Enabled
{
get
{
// We are only enabled if our parent is enabled
if (!GetState(STATE_ENABLED))
return false;
else if (ParentInternal == null)
return true;
else
return ParentInternal.Enabled;
}

set
{
bool oldValue = Enabled;
SetState(STATE_ENABLED, value);

if (oldValue != value)
{
if (!value)
{
SelectNextIfFocused();
}

OnEnabledChanged(EventArgs.Empty);
}
}
}

Du siehst, Du könntest "base.Enabled" soviel
auf false setzen, wie Du willst, der Getter holt
sich den Wert ggf. über den internen Parent.Enabled
und geht da über den State. Und die Designer-
Anzeige geht dann ja über den Getter. Im Grossen
und Ganzen hast Du das ja auch schon alles
selber erkannt.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen