2013-06-27 5 views
5

Ich habe Probleme beim Öffnen eines geerbten Formulars in einer Windows CE-Anwendung. Dies ist ein Projekt, das ich von einem Ex-Angestellten übernehme, aber es gibt kompilierte Versionen, die auf einigen mobilen Geräten laufen, daher würde ich annehmen, dass es in der Lage sein sollte, es zu öffnen. Ich habe die richtige VS-Version (2008) und habe versucht, die Lösung zu bereinigen und die Lösung neu aufzubauen. Bei der Bereitstellung der Lösung funktioniert es wie ein Zauber. Sobald ich in den Designer der vererbten Formen zu gehen versuchen, erhalte ich folgende Fehlermeldung:Fehler beim Öffnen des Designers für geerbtes Formular

To prevent possible data loss before loading the designer, the following errors must be resolved: 

Object reference not set to an instance of an object. 

Stack Trace:

at MyApp.frmBase.UpdateOnline() in C:\Users\Corne\Documents\Visual Studio 2008\Projects\Test\MyApp\MyApp\frmBase.cs:line 35 
at MyApp.frmBase.frmBase_Load(Object sender, EventArgs e) in C:\Users\Corne\Documents\Visual Studio 2008\Projects\Test\MyApp\MyApp\frmBase.cs:line 30 
at System.Windows.Forms.Form.OnLoad(EventArgs e) 
at System.Windows.Forms.Form.OnCreateControl() 
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) 
at System.Windows.Forms.Control.CreateControl() 
at System.Windows.Forms.Control.SetVisibleCore(Boolean value) 
at System.Windows.Forms.Form.SetVisibleCore(Boolean value) 
at System.Windows.Forms.Control.set_Visible(Boolean value) 
at System.Windows.Forms.Design.DesignerFrame.Initialize(Control view) 
at System.Windows.Forms.Design.DocumentDesigner.Initialize(IComponent component) 
at System.Windows.Forms.Design.FormDocumentDesigner.Initialize(IComponent component) 
at System.ComponentModel.Design.DesignerHost.AddToContainerPostProcess(IComponent component, String name, IContainer containerToAddTo) 
at System.ComponentModel.Design.DesignerHost.Add(IComponent component, String name) 
at System.ComponentModel.Design.DesignerHost.System.ComponentModel.Design.IDesignerHost.CreateComponent(Type componentType, String name) 
at System.ComponentModel.Design.Serialization.DesignerSerializationManager.CreateInstance(Type type, ICollection arguments, String name, Boolean addToContainer) 
at System.ComponentModel.Design.Serialization.DesignerSerializationManager.System.ComponentModel.Design.Serialization.IDesignerSerializationManager.CreateInstance(Type type, ICollection arguments, String name, Boolean addToContainer) 
at System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.Deserialize(IDesignerSerializationManager manager, CodeTypeDeclaration declaration) 
at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager manager) 
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager serializationManager) 
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.DeferredLoadHandler.Microsoft.VisualStudio.TextManager.Interop.IVsTextBufferDataEvents.OnLoadCompleted(Int32 fReload) 

Antwort

8

Sie klar aus dem Stack-Trace kann sehen, dass Ihr die Grundform Load-Ereignishandler wird ausgeführt und gibt eine Ausnahme aus. Das ist normal, Ereignisse in der Basisform wie Load und Paint werden auch zur Entwurfszeit ausgeführt. Es bietet die WYSIWYG-Designeransicht. Dies geht jedoch schlecht, wenn dieser Code nur zur Laufzeit korrekt funktionieren kann.

Die Control.DesignMode-Eigenschaft sollte Ihnen eine Möglichkeit bieten, zu überprüfen, ob der Code in der Klasse zur Entwurfszeit ausgeführt wird. Leider ist es in CF nicht verfügbar, daher ist ein anderer Ansatz erforderlich. Die magische Beschwörung sieht so aus:

private void frmBase_Load(object sender, EventArgs e) { 
     if (this.Site == null || !this.Site.DesignMode) { 
      // Not in design mode, okay to do dangerous stuff... 
      this.UpdateOnline(); 
     } 
    } 
+1

SUPER große Arbeit sehr gut, wie ein Charme! –

Verwandte Themen