Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Designer hat Probleme mit meinem Control
Sirox
myCSharp.de - Member



Dabei seit:
Beiträge: 64

Themenstarter:

Designer hat Probleme mit meinem Control

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Muphin
myCSharp.de - Member



Dabei seit:
Beiträge: 174

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Sirox
myCSharp.de - Member



Dabei seit:
Beiträge: 64

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Sirox
myCSharp.de - Member



Dabei seit:
Beiträge: 64

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Sirox
myCSharp.de - Member



Dabei seit:
Beiträge: 64

Themenstarter:

beantworten | zitieren | melden

schade, naja ok ... danke für die Hilfe!
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Zitat
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...
private Nachricht | Beiträge des Benutzers
Sirox
myCSharp.de - Member



Dabei seit:
Beiträge: 64

Themenstarter:

beantworten | zitieren | melden

COOOL danke danke , muss ich gleich ausprobieren!
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
Sirox
myCSharp.de - Member



Dabei seit:
Beiträge: 64

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Muphin
myCSharp.de - Member



Dabei seit:
Beiträge: 174

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
Sirox
myCSharp.de - Member



Dabei seit:
Beiträge: 64

Themenstarter:

beantworten | zitieren | melden

Das Problem ist ich brauch den Wert umbedingt im Konstruktor
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Zitat
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...
private Nachricht | Beiträge des Benutzers
Sirox
myCSharp.de - Member



Dabei seit:
Beiträge: 64

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Muphin
myCSharp.de - Member



Dabei seit:
Beiträge: 174

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Sirox
myCSharp.de - Member



Dabei seit:
Beiträge: 64

Themenstarter:

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
Sirox
myCSharp.de - Member



Dabei seit:
Beiträge: 64

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
regen
myCSharp.de - Member



Dabei seit:
Beiträge: 494

beantworten | zitieren | melden

Schau dir halt den Code des Controls mal an wo das funktioniert?!
private Nachricht | Beiträge des Benutzers
Sirox
myCSharp.de - Member



Dabei seit:
Beiträge: 64

Themenstarter:

beantworten | zitieren | melden

Wo kann ich mir den Quelltext von z.B. vom Timer ansehen ?
private Nachricht | Beiträge des Benutzers
regen
myCSharp.de - Member



Dabei seit:
Beiträge: 494

beantworten | zitieren | melden

.NET Reflector von Lutz Roeder
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Zitat
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...
private Nachricht | Beiträge des Benutzers
Sirox
myCSharp.de - Member



Dabei seit:
Beiträge: 64

Themenstarter:

beantworten | zitieren | melden

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 ?
private Nachricht | Beiträge des Benutzers
norman_timo
myCSharp.de - Member

Avatar #avatar-1775.jpeg


Dabei seit:
Beiträge: 4.506
Herkunft: Wald-Michelbach (Odw)

beantworten | zitieren | melden

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:
Zitat
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!”
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Zitat
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...
private Nachricht | Beiträge des Benutzers
Phaiax
myCSharp.de - Member



Dabei seit:
Beiträge: 56

beantworten | zitieren | melden

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();
        }
private Nachricht | Beiträge des Benutzers