2013-06-27 31 views
5

Mam problem z otwarciem odziedziczonego formularza w aplikacji systemu Windows CE. Jest to projekt, który przejmuję od byłego pracownika, ale istnieją wersje skompilowane działające na niektórych urządzeniach mobilnych, więc zakładam, że powinien on być w stanie otworzyć. Mam poprawną wersję VS (2008) i próbowałem oczyścić rozwiązanie i przebudować rozwiązanie. Podczas wdrażania rozwiązania działa jak urok. Tak szybko, jak staram się iść do projektanta odziedziczonych form, pojawia się następujący błąd:Błąd podczas otwierania projektanta na formularzu dziedziczonym

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. 

Stos śledzenia:

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) 

Odpowiedz

8

można wyraźnie zobaczyć od śladu stosu, że forma bazowej Załaduj moduł obsługi zdarzeń i uruchom wyjątek. Jest to normalne, zdarzenia w formie podstawowej, takie jak Load i Paint, są uruchamiane również w czasie projektowania. Zapewnia widok projektanta WYSIWYG. Jest to jednak słabe, jeśli ten kod może działać poprawnie tylko w środowisku wykonawczym.

Właściwość Control.DesignMode miała na celu zapewnienie sposobu sprawdzenia, czy kod w klasie działa w czasie projektowania. Niestety nie jest dostępny w CF, więc potrzebne jest inne podejście. Magiczna inkantacja wygląda następująco:

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 BIG PRACUJE BARDZO DOBRZE, JAK CHARM! –