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
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
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
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?
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
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
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
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...
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...
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
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!
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...
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
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
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!
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
Schau dir halt den Code des Controls mal an wo das funktioniert?!
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...
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 ?
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!”
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...
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();
}