3 Stimmen

Wie geht man mit Ausnahmen in UserControls-Konstruktoren um, wenn man den .net Winform Designer verwendet?

Wenn Sie ein UserControl in den WinForm-Designer laden, führt VisualStudio die InitializeComponent()-Methode des Steuerelements aus, aber nicht dessen Konstruktor. Dies macht einen großen Unterschied, da es durchaus üblich ist, Code im Konstruktor zu haben, der zur Entwurfszeit nicht ausgeführt werden kann.

Wenn Sie ein UserControl zu einem anderen Steuerelement hinzufügen, führt VisualStudio leider die InitializeComponent()-Methode des übergeordneten Steuerelements aus, die die Konstruktoren der untergeordneten Steuerelemente aufruft, und wenn Sie in diesen Konstruktoren eine Ausnahme haben, sitzen Sie fest.

Wie gehen Sie mit diesem Problem um?

0 Stimmen

Wie würde Visual Studio InitialiseComponent aufrufen, ohne eine Instanz zu konstruieren. Der Konstruktor wird garantiert, bevor InitialiseComponent aufgerufen wird.

0 Stimmen

Probieren Sie es einfach aus: Erstellen Sie ein leeres Formular und fügen Sie "throw new Exception()" in die erste Zeile des Konstruktors ein (d.h. vor dem Aufruf von Initializecomponent). Sie werden sehen, dass der Winform-Designer das Formular trotzdem laden kann.

2voto

Pondidum Punkte 11289

Die Teile, die nur die Laufzeit betreffen, mit umhüllen:

If Not me.DesignMode Then
  'Runtime only here
End If

0 Stimmen

Achtung: Der DesignMode funktioniert in untergeordneten Steuerelementen nicht richtig. dotnetjunkies.com/WebLog/mjordan/archive/2003/12/01/4117.aspx

0 Stimmen

Wenn Sie mit dem Debuggen Ihres Programms beginnen, scheint es außerdem, dass der Code im Abschnitt "!this.DesignMode" in Ihrem Programm (wie erwartet) ausgeführt wird, aber auch im Designer!

1voto

lbras Punkte 35

Ich fand eine Lösung in CodeProject das für mich funktioniert:

if (System.ComponentModel.LicenseManager.UsageMode != 
    System.ComponentModel.LicenseUsageMode.Designtime)
{
    // Runtime only here
}

0voto

Brann Punkte 30431

Der Workaround, den ich verwende, ist, meinen Laufzeitinitialisierungscode in eine InitializeRuntime()-Methode zu packen, die ich rekursiv vom Toplevel-Konstruktor aufrufe. Dies löst das Problem, aber ich muss immer daran denken, den Aufruf von InitializeRuntime() für jedes einzelne UserControl hinzuzufügen, das ich hinzufüge, anstatt die Komponente einfach per Drag'n'Drop über den Designer zu ziehen.

0voto

pointernil Punkte 588

Warum nicht das OnLoadEvent in diesem Szenario verwenden?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X