Probleme mit Properties bei abgeleiteten Controls

27/06/2008 - 11:53 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()
{
InitializeComponent();
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, wird die
Änderung nicht 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 Peter Bucher [MVP]
30/06/2008 - 09:27 | Warnen spam
Hallo Christian

Ich habe in Visual Studio ein neues UserControl angelegt. Dieses habe ich
abgeleitet von DataGridView. Das neue "DataGridView"-Control soll als


Benutze dafür ein CustomControl, kein UserControl, da du von was bestehendem
erbst.

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".


Wird schwierig werden.

Ich denke die Attribute (DefaultValue) haben Vorrang.
Und ohne einen Grund ist die Eigenschft "Visible" auch nicht "virtual".

Was für einen Sinn sollte das dann haben?

Ich denke eines geht, entweder Designer oder Runtime, aber alles wirdst du
wohl
nicht hinkriegen, da es nicht dafür gedacht ist.

Gruss, Peter Bucher
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
http://www.aspnetzone.de/blogs/peterbucher/ - Auf den Spuren von .NET

Ähnliche fragen