Laden...

Designer hat Probleme mit meinem Control

Erstellt von Sirox vor 17 Jahren Letzter Beitrag vor 17 Jahren 6.390 Views
S
Sirox Themenstarter:in
64 Beiträge seit 2006
vor 17 Jahren
Designer hat Probleme mit meinem Control

Hi,
ich bzw. mein Designer hat ein Problem mit meinem Control, besser gesagt mit dem Konstrukter des Controls. Mein Konstrukter hat einen Parameter und das mag der Designer nicht. Was kann ich da tun, es wäre nicht schlecht mein Control im Designer zu sehen.

lG

Sirox

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Sirox,

du musst für den Designer einen parameterlosen Konstruktor anbieten. Wohlgemerkt nur für den Designer. An sich braucht ein Form keinen parameterlosen Konstruktor.

herbivore

M
174 Beiträge seit 2006
vor 17 Jahren

Mach doch noch einen zweiten Konstruktor ohne Parameter indem du den anderen Konstruktor mit irgendeinem Standardwert aufrufst. Falls das bei dir geht, ich weiß ja nicht um was für einen Parameter es sich handelt!

mfg Muphin

S
Sirox Themenstarter:in
64 Beiträge seit 2006
vor 17 Jahren

Achso und gibts dann sowas in der Art wie #if DEBUG blos für den Designer also #if DESIGNER oder so, damit ich eine Exeption schmeissen kann wenn der Parameterlose Konstruktor im "richtigen" Programmstart nicht aufgerufen wird?

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Sirox,

du musst den parameterlosen Konstruktor schon so schreiben, dass er immer richtig funktioniert. Denn auch die über den Designer erzeugen Forms müssen ja richtig initialisiert sein.

herbivore

S
Sirox Themenstarter:in
64 Beiträge seit 2006
vor 17 Jahren

Das ist mir klar, also ich hab jetzt einen Konstruktor gemacht bei dem die ganzen Elemente auf dem Control inizialisiert werden.
Mein Eigentlicher Konstruktor macht dann aber einige andere Sachen die den Designer nicht jucken. Jetzt ist es aber so wenn ich das Element anderweitig benutzen will dann brauch ich den Konstruktor mit dem Parameter und wenn ich den Konstruktor ohne Parameter fälschlicherweise aufrufe macht das Control nichts und dann weis ich nicht ob ich mich gleich dran erinnere dass ich den Konstruktor gar nicht aufrufen darf.

lG

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Sirox,

du wirst dich erinnern müssen. Ich sehe keinen Weg zu erkennen, ob der Konstruktor durch den Designer oder von dir verwendet wird.

herbivore

S
Sirox Themenstarter:in
64 Beiträge seit 2006
vor 17 Jahren

schade, naja ok ... danke für die Hilfe!

4.221 Beiträge seit 2005
vor 17 Jahren

Original von herbivore
Hallo Sirox,

du wirst dich erinnern müssen. Ich sehe keinen Weg zu erkennen, ob der Konstruktor durch den Designer oder von dir verwendet wird.

herbivore

Juhuu ich kann mal herbivore korrigieren 🙂

Im DefaultConstructor


public Form1()
		{
			if (!this.DesignMode)
			{
				throw new Exception("Du nix aufrufen diesen Constructor !! Ist nur für Designer zu verwenden");
			}
			//
			// Erforderlich für die Windows Form-Designerunterstützung
			//
			InitializeComponent();

			//
			// TODO: Fügen Sie den Konstruktorcode nach dem Aufruf von InitializeComponent hinzu
			//
		}

		public Form1(string pFormTitle)
		{
			//
			// Erforderlich für die Windows Form-Designerunterstützung
			//
			InitializeComponent();

			//
			// TODO: Fügen Sie den Konstruktorcode nach dem Aufruf von InitializeComponent hinzu
			//
			this.Text=pFormTitle;
		}

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

S
Sirox Themenstarter:in
64 Beiträge seit 2006
vor 17 Jahren

COOOL danke danke , muss ich gleich ausprobieren!

4.221 Beiträge seit 2005
vor 17 Jahren

Musste aber aufpassen... wenn du von diesem Form erbst, dann ist DesignMode false !!

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

S
Sirox Themenstarter:in
64 Beiträge seit 2006
vor 17 Jahren

aber am allercoolsten wäre wenn mir einer sagen würde ob/wie man einem Designer kann welchen Wert er für den Parameter mitgeben soll

M
174 Beiträge seit 2006
vor 17 Jahren

Du kannst für einen Member deiner Klasse eine get/set Methode schreiben und auf diese kannst du dann in den Properties im Designer zugreifen!

S
Sirox Themenstarter:in
64 Beiträge seit 2006
vor 17 Jahren

Das Problem ist ich brauch den Wert umbedingt im Konstruktor

4.221 Beiträge seit 2005
vor 17 Jahren

Original von Muphin
Du kannst für einen Member deiner Klasse eine get/set Methode schreiben und auf diese kannst du dann in den Properties im Designer zugreifen!

Grundsätzlich richtig... aber trotzdem falsch...

Wenn die Properties gesetzt werden ist der Constructor schon durchgelaufen... also zu spät um den parametrisierten Constructor aufzurufen..

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

S
Sirox Themenstarter:in
64 Beiträge seit 2006
vor 17 Jahren

Irgendwas muss es da geben, ich hab mir die .Designer.cs angesehen , da gibts bereits Controls die von Hausaus mit einem Parameter gestartet werden ( z.B. System.ComponentModel.ComponentResourceManager ) aber wenn ich den Konstruktor mit Parameter da händisch eingebe, dann ist da nach der nächsten Änderung im Designer wieder der Konstruktor ohne Parameter drinnen

M
174 Beiträge seit 2006
vor 17 Jahren

Ja dann gehts nich, das is klar!
Dann würde er die Propertie nur nach dem Constructor auf den gewünschten wert ändern!

Vielleicht lässt sich das Problem ja auch irgendwie anders beheben, wofür brauchst du den Parameter denn unbedingt im Construktor?

mfg Muphin

S
Sirox Themenstarter:in
64 Beiträge seit 2006
vor 17 Jahren

Das ist eine Referenz auf ein anderes Control, mit dieses Control zusammenspielt, nein ich brauch den Wert definitiv im Konstruktor und da muss es auch irgendwas geben. Bei den eingebetteten Controls von M$ gibts auch einige, die im designer mit einem Parameter aufgerufen werden!

S
Sirox Themenstarter:in
64 Beiträge seit 2006
vor 17 Jahren

Jetzt hab ich versucht das Objekt nicht über die Methode InitializeComponent() zu Erzeugen sondern direkt im Konstruktor ( da hat ja dann der Designer keinen einfluss ) aber Anzeigen tut er mein Control dafür leider auch nicht

R
494 Beiträge seit 2006
vor 17 Jahren

Schau dir halt den Code des Controls mal an wo das funktioniert?!

S
Sirox Themenstarter:in
64 Beiträge seit 2006
vor 17 Jahren

Wo kann ich mir den Quelltext von z.B. vom Timer ansehen ?

R
494 Beiträge seit 2006
vor 17 Jahren

.NET Reflector von Lutz Roeder

4.221 Beiträge seit 2005
vor 17 Jahren

Original von regen
.NET Reflector von Lutz Roeder

Wird aber sein Problem nicht lösen.... da der Timer eine Component ist.... und Components haben ja defaultmässig immer 2 Constructors

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

S
Sirox Themenstarter:in
64 Beiträge seit 2006
vor 17 Jahren

Ich kann nichts auffälliges finden... ihr ? Wenn man den Timer in die Form zieht wird der konstruktor in der InizializeComponet() mit einem Parameter aufgerufen... wie schafft man sowas ?

4.506 Beiträge seit 2004
vor 17 Jahren

Hallo zusammen,

zunächst, wie bringe ich den Designer dazu einen Parameterkonstruktor zu erstellen:

siehe Design-Time Integration (Addison Wesley)
runterscrollen bis Custom Type Code Serialization with TypeConverters!

Ich hoffe das hilft weiter?

Dann hätte ich mal eine Frage zu folgender Aussage:

Musste aber aufpassen... wenn du von diesem Form erbst, dann ist DesignMode false !!

Das ist mir auch aufgefallen, wie löse ich hier das Problem, wenn ich mit Vererbung arbeiten will, und trotzdem DesignMode im Child verwenden will?

Gruß
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

4.221 Beiträge seit 2005
vor 17 Jahren

Original von norman_timo
Das ist mir auch aufgefallen, wie löse ich hier das Problem, wenn ich mit Vererbung arbeiten will, und trotzdem DesignMode im Child verwenden will?

Gruß
Norman-Timo

Hallo Norman-Timo

Im DesignMode ist eines der folgenden Assemblies null

Du findest ja sicher relativ schnell heraus welches (Try and Error)


if (Assembly.GetEntryAssembly()==null)

//oder war es
if (Assembly.GetExecutingAssembly()==null)



Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

P
56 Beiträge seit 2006
vor 17 Jahren

oder du benutzt folgenden Code, dann erscheint der Parameterlose Kostruktor nicht mehr in der Liste (mein gott, mir fällt grad nicht mehr ein, wie die heißt).

Wenn du trotzdem einen parameterlosen Kostruktor benutzt, wird ohne Fehler kompiliert.

        [EditorBrowsable(EditorBrowsableState.Never)]
        public Test()
        {
            InitializeComponent();
        }