2015-11-26 25 views
5

System.ObjectDisposedException gdy przycisk styl jest ustawiony na FlatStyle.System w aplikacji WinFormsSystem.ObjectDisposedException gdy przycisk styl jest ustawiony na FlatStyle.System w aplikacji WinForms

Mam formularz dziecko, które pojawia się na kliknięcie przycisku w rodzica . A kod idzie jak poniżej.

Formularz dziecka ma z kolei przycisk, który się zamyka.

Public Class Child 
    Private Sub btnCloseMe_Click(sender As Object, e As EventArgs) Handles btnCloseMe.Click 
     Me.Close() 
    End Sub 
End Class 

kroki, aby uzyskać wyjątek:

  • W trybie debugowania, umieścić punkt przerwania na Me.Close()
  • Następnie kliknij przycisk zamykania z dzieckiem.
  • Przy trafieniu punktu przerwa otwarty notatnik i
  • powrót do roztworu następnie kontynuować

Wyjątek:

System.ObjectDisposedException was unhandled 
    HResult=-2146232798 
    Message=Cannot access a disposed object. 
Object name: 'Button'. 
    Source=System.Windows.Forms 
    ObjectName=Button 
    StackTrace: 
     at System.Windows.Forms.Control.CreateHandle() 
     at System.Windows.Forms.Control.get_Handle() 
     at System.Windows.Forms.Control.PointToScreen(Point p) 
     at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
     at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
     at System.Windows.Forms.Control.WndProc(Message& m) 
     at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
     at System.Windows.Forms.Button.WndProc(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
     at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
     at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
     at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.Run(ApplicationContext context) 
     at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun() 
     at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel() 
     at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine) 
     at WindowsApplication2.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

Czy ktoś ma jakiś pomysł, to jest wyraźnie nadchodzi, gdy przycisk styl ustawiony FlatStyle.System

+0

Czy to powoduje problem w aplikacji lub z ciekawości? –

+0

W mojej aplikacji działającej w czasie rzeczywistym przy zamkniętych kliknięciach jest długotrwały proces, który trwa co najmniej 10-15 sekund. W międzyczasie, jeśli użytkownik kliknie na inną aplikację, np. Notatnik, dokument tekstowy lub chrome, pojawia się ten błąd. –

+0

Debugowanie interfejsu użytkownika ma talent do powodowania takich problemów. Samo przerwanie debugowania pozwala na różny sposób wywoływania zdarzeń, może powodować ogniskowanie i malowanie. W takim przypadku aktywacja innego procesu jest wyzwalaczem. Zakładam, że ma to coś wspólnego z właściwością Capture, kluczową dla przycisków. W skrajnych przypadkach może być konieczne użycie zdalnego debuggera, aby sam debugger nie mógł wpłynąć na interfejs użytkownika. To nie jest tak skrajny przypadek, po prostu nie uruchamia się. Po prostu trzymaj motoryzację. –

Odpowiedz

2

Krótko mówiąc, to błąd. Implementacja wewnętrzna Button/ButtonBase utrzymuje niektóre flagi związane ze stanami myszy, które w tym przypadku nie są poprawnie usuwane. FlatStyle.System wydaje się być szczególnym przypadkiem obejmującym wiele gałęzi w kodzie źródłowym, więc najwyraźniej niektóre z nich czegoś nie mają.

Rozwiązaniem byłoby stworzenie i użyć własnego Button podklasy tak (przepraszam za C#, jestem pewien, że można przełożyć go do VB):

public class MyButton : Button 
{ 
    protected override void OnMouseUp(MouseEventArgs mevent) 
    { 
     if (this.IsDisposed) return; 
     base.OnMouseUp(mevent); 
    } 
}