Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 无法访问名为“的已处置对象”;文本框“;(Leave和MouseDown事件)(如何处理System.ObjectDisposedException)_Vb.net_Events_Exception_Controls_Dispose - Fatal编程技术网

Vb.net 无法访问名为“的已处置对象”;文本框“;(Leave和MouseDown事件)(如何处理System.ObjectDisposedException)

Vb.net 无法访问名为“的已处置对象”;文本框“;(Leave和MouseDown事件)(如何处理System.ObjectDisposedException),vb.net,events,exception,controls,dispose,Vb.net,Events,Exception,Controls,Dispose,我有一个表单是用控件列表构建的。但是,它们通过删除并重新生成这些控件来刷新这些控件中的数据。这就是它变得敏感的地方。当我第一次单击另一个文本框时,会发生此错误,该文本框从调用清理函数以重新生成所有控件的前一个文本框触发请假事件。单击的文本框包含在已销毁项列表中,这就是为什么出现“无法访问名为的已处置对象”错误的原因。但是,我不知道在哪里处理System.ObjectDisposedException,因为我无法在表单创建时捕获它 这是坠机日志 System.ObjectDisposedExce

我有一个表单是用控件列表构建的。但是,它们通过删除并重新生成这些控件来刷新这些控件中的数据。这就是它变得敏感的地方。当我第一次单击另一个文本框时,会发生此错误,该文本框从调用清理函数以重新生成所有控件的前一个文本框触发请假事件。单击的文本框包含在已销毁项列表中,这就是为什么出现“无法访问名为的已处置对象”错误的原因。但是,我不知道在哪里处理System.ObjectDisposedException,因为我无法在表单创建时捕获它

这是坠机日志

 System.ObjectDisposedException: Can not access a disposed object named "TextBox".
Object name: "TextBox".
    Has System.Windows.Forms.Control.CreateHandle ()
    Has System.Windows.Forms.TextBoxBase.CreateHandle ()
    Has System.Windows.Forms.Control.get_Handle ()
    Has System.Windows.Forms.Control.set_CaptureInternal (Boolean value)
    Has System.Windows.Forms.Control.WmMouseDown (Message & m, MouseButtons button, Int32 clicks)
    at System.Windows.Forms.Control.WndProc (Message & m)
    Has System.Windows.Forms.TextBoxBase.WndProc (Message & m)
    Has System.Windows.Forms.TextBox.WndProc (Message & m)
    Has System.Windows.Forms.ControlNativeWindow.OnMessage (Message & m)
    Has System.Windows.Forms.ControlNativeWindow.WndProc (Message & m)
    at System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
我还尝试使用语句
if Control.Isdisposed,然后返回
,但似乎leave或mousedown事件并不关心它:s

你们能帮我找到我可以在哪处理这个表单上的错误吗。 我无法通过调试跟踪它,它只是在结束子项后弹出

在vb.net Framework 1.1中编码

这是我销毁目标的代码

Private Sub viderRecursiveStack(ByVal control As Control)
        Dim stack As New stack
        Dim ctl As control
        Dim enfantAssocie As ArrayList


        stack.Push(control)

        While stack.Count > 0

            ctl = CType(stack.Pop, control)


            If Not ctl Is Nothing Then

                If TypeOf ctl Is Panel Then

                    'Cree la liste des enfants associés
                    enfantAssocie = New ArrayList(ctl.Controls)

                    For Each ctli As control In enfantAssocie

                        If Not TypeOf ctli Is EasyDeal.Controls.EasyDealLabel3D AndAlso** Not TypeOf ctli Is EasyDeal.Controls.EasyDealButton Then
                            stack.Push(ctli)
                            ctl.Controls.Remove(ctli)
                        End If

                    Next

                Else
                    RemoveHandler ctl.Leave, AddressOf txtEquipAddCommissionChanged
                    ctl.Dispose()
                End If

            End If

        End While

    End Sub
“删除”控件时,应按以下顺序执行所有操作:

  • 从控件中删除所有事件处理程序
  • 从父控件的
    控件
    集合中删除控件
  • 调用控件上的
    Dispose
    方法
  • 但是,在本例中,您正在执行所有这些操作,但仍然存在问题,因为您正在尝试从控件自身的事件中删除该控件。如果您希望首先避免获取异常,我建议您在这种情况下,等待稍后调用该控件上的dispose。在步骤2之后,您可以将控件添加到名为
    \u controlsToDispose As List(控件列表)
    的私有字段中。然后,在窗体的卸载事件中,或者在计时器上,或者在来自某个其他控件的某个其他事件上,您可以循环遍历在该列表中排队等待处理的任何控件,然后对它们进行处理


    但是,如果您想让事情保持原样,并在异常发生时忽略异常,您应该能够在
    MyApplication\u UnhandledException
    事件处理程序中这样做。要到达该位置,请打开项目属性,转到“应用程序”选项卡,然后单击页面底部应用程序框架中的“查看应用程序事件”按钮。但是,这仅在启用了应用程序框架的情况下可用。如果您已经为应用程序创建了自己的入口点,并且正在调用
    application.Run
    ,您应该能够在该调用周围放置一个try-catch块来捕获它。

    我用递归堆栈正确地清理了我的控件,并从中删除了我的处理程序,因此在表单上确实没有办法处理这个问题?没有。异常是由WndProc(窗口消息循环)调用的框架代码在内部引发的。换句话说,它正在处理WM_MOUSE_DOWN消息,并且在Microsoft的一个对象中失败,因为框架假定当前控件不会由它自己的事件处理程序处理。异常中是否有任何on信息可以让我知道发送方事件信息的基本信息或其他任何信息?定义“发件人事件信息”“。我不知道你这是什么意思。正如@SteveDog建议的那样,你可以绕过这一个错误,但代码将非常脆弱,很可能依赖于windows和framework版本。如果是我,我会试图找到另一种方式来描述你想要的行为。我明白,如果可能的话,我想在System.ObjectDisposedException中处理我自己!这不是您可以处理的异常,而是代码中的错误。表单的成员(如“TextBox1”)引用已处置的控件。不要给它带创可贴,修复错误。例如,重新运行initializeControl()应该可以修复它。帕桑先生在这一点上是正确的(以及:),充其量只能修复一个症状。在代码附近嗅探,例如在某处添加另一个事件处理程序,它将再次中断。