estoy frente a un problema enorme con la "Cannot access a disposed object. Object name: 'TreeView'." error.

En un formulario windows forms de mina yo uso un personalizada de windows el explorador de objetos.

Y aquí viene el código de piezas…

Sobre el nodo seleccionado evento, me carga las imágenes que se encuentran dentro del directorio seleccionado a los controles flowlayoutpanel.

 Private Sub ExpTree1_ExpTreeNodeSelected(ByVal SelPath As String, ByVal Item As ExplorerControls.CShItem) Handles ExpTree1.ExpTreeNodeSelected
      'Loop until all images are loaded.
       LoadImagesToFlowPreviewPanel()
 End Sub

Sobre el botón cerrar de eventos

 Private Sub WizardControl1_CancelClick(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles WizardControl1.CancelClick
        Me.Close()
 End Sub

En el Formulario de Cierre de evento

 Private Sub Wizard_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
                Select Case XtraMessageBox.Show("Exit the application?", Me.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                Case Windows.Forms.DialogResult.No
                    e.Cancel = True
                End Select
        End If
 End Sub

Mientras que la depuración me di cuenta de que cuando me confirman el cierre de la aplicación, el código dentro de la LoadImagesToFlowPreviewPanel sub continúa ejecutándose. El error se produce cuando todas las imágenes se cargan a los controles flowlayoutpanel de control.

Y aquí viene la traza de la pila…

   at System.Windows.Forms.Control.CreateHandle()
at System.Windows.Forms.TreeView.CreateHandle()
at System.Windows.Forms.Control.get_Handle()
at System.Windows.Forms.TreeView.TvnSelected(NMTREEVIEW* nmtv)
at System.Windows.Forms.TreeView.WmNotify(Message& m)
at System.Windows.Forms.TreeView.WndProc(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.SendMessage(HandleRef hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.Control.SendMessage(Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.Control.ReflectMessageInternal(IntPtr hWnd, Message& m)
at System.Windows.Forms.Control.WmNotify(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Application.ParkingWindow.WndProc(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.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
at System.Windows.Forms.TreeView.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.TreeView.WndProc(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(Int32 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 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
at CannonUpdater.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 82
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

ACTUALIZACIÓN: SI todas las imágenes se cargan a la FlowLayoutPanel y la confirmación de la solicitud de cierre que viene a continuación, me sale ningún error.

  • Lo que está sucediendo en el LoadImagesToFlowPreviewPanel() método? A menos que usted está ejecutando que en un hilo separado, usted no debe ser capaz de cerrar el formulario, a menos que el método ha terminado de ejecutar. ¿Qué hace su «Bucle hasta que todas las imágenes se cargan.» comentario significa? No veo un bucle…
InformationsquelleAutor GeorgeBoy | 2011-02-10

3 Comentarios

  1. 4

    Usted debe publicar las partes pertinentes de su LoadImagesToFlowPreviewPanel método.

    Esto es especulación sin ver el código, pero una explicación podría ser:

    • LoadImagesToFlowPreviewPanel está llamando Application.DoEvents en un bucle

    • Se cierra el Formulario en la vista de árbol eliminado durante una de las llamadas a Application.DoEvents

    • Pero el bucle continúa a ejecutar y de los accesos de los desechado TreeView.

    Si fue esta, la solución sería un rediseño para evitar llamar Application.DoEvents, o al menos comprobar si se cierra el Formulario /TreeView se desechan después de cada llamada a Application.DoEvents.

    ACTUALIZACIÓN en respuesta al comentario:

    Wow! En realidad el LoadImages está llamando a la Aplicación.DoEvents dentro de un bucle

    Si utiliza Application.DoEvents usted se exponga a una reentrada problemas en el código que usted necesita ser muy cuidadoso y asegúrese de entender todas las consecuencias cuando se utiliza. El problema que se describe no es el único problema es probable que se enfrentan. Yo sólo lo uso en casos muy específicos donde puedo garantizar que no tiene reentrada problemas (por ejemplo, mientras que un referente de progreso muestra el cuadro de diálogo). Y muchas personas se llame DoEvents «mal» y no tienen nada que ver con él en absoluto.

    • Wow! En realidad el LoadImages está llamando a la Application.DoEvents dentro de un bucle
    • No estoy de acuerdo que DoEvents es «malo», pero es un serio código de olor. Esto puede llevar a que dificulta el diagnóstico de fallos (como este), y que indica una pobre comprensión de las Ventanas modelo orientado a eventos. Las únicas personas que deben usar son aquellas con una profunda comprensión y apreciación de lo que está haciendo, que a menudo son las mismas personas que encontrar una mejor manera de hacer su trabajo de código. Que comienzan le dijo: «tu respuesta es correcta; no estoy seguro de por qué soy el único que upvoted hasta ahora y por qué no ha sido aceptada. Su psíquico depurador está calibrado mucho mejor que la mía.
    • Estoy totalmente de acuerdo con usted. Como para upvotes, mi experiencia es que las respuestas comunes preguntas generales atraer más específicos como este. Pero tengo más puntos de lo que puedo gastar, así que no estoy preocupado 🙂
  2. 3

    Básicamente esto sucede cuando se realiza una operación en un objeto que aún está viva en la que se han eliminado. Así que, ya sea como este:

    A a = new A();
    a.Dispose();
    //operations performed on a will fail now

    O como esta

    using( A a = new A()){
    ...
    }
    //operations performed on a will fail now

    Recuerde que un bloque using también disponer su objeto como manualmente llamar a Dispose.

  3. 0

    Lo que está pasando aquí es que inicia un subproceso que manipula un objeto TreeView y, a continuación, antes de que el hilo está hecho, TreeView se deshaga.

    Para arreglar eso, comprobar si el TreeView está disponible para manipular o no se elimina el uso de TreeView IsDisposed propiedad en su hilo.

Dejar respuesta

Please enter your comment!
Please enter your name here