コントロールのリストで構築されたフォームがあります。ただし、これらのコントロールを削除して再構築することにより、これらのコントロールのデータを更新します。これは、それが敏感になるところです。すべてのコントロールを再構築するためにクリーニング関数を呼び出す前のテキストボックスからの leave イベントをトリガーする別のテキストボックスを最初にクリックすると、エラーが発生します。クリックしたテキストボックスが破棄されたアイテムのリストに含まれているため、「という名前の破棄されたオブジェクトにアクセスできません」というエラーが発生します。ただし、フォームの作成時に System.ObjectDisposedException をキャッチできないため、 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 then return
が、 leave または mousedown イベントはそれを気にしないようです:S
このフォームでこのエラーを処理できる場所を見つけるのを手伝ってもらえますか。End Sub の後にポップアップするだけでデバッグできません。
vb.net FrameWorks 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