Re: showdialog and 'Cannot access a disposed object'

chris Burgess <[email protected]> Tue, 8 Jan 2008 08:56:40 -0500
Newsgroups gmane.comp.windows.devel.dotnet.winforms
Message-ID <[email protected]>
Hi Mike:

This is what I need.

Thanks!

Chris

On Jan 7, 2008 8:49 AM, Mike Andrews <[email protected]> wrote:
> If you need to be able to specify a type for the "form" and then create it
> if it's not been created yet or show it if it has, you can use generics to
> your advantage here.
>
> Create a method called CreateForm(Of T) or some such name like this:
>
>    Public Class BaseForm
>        Inherits System.Windows.Forms.Form
>    End Class
>    Private ShownForms As New Dictionary(Of String, BaseForm)
>    Public Function CreateForm(Of ItemType As {BaseForm, New})() As ItemType
>        Dim form As ItemType
>        Dim key As String = GetType(ItemType).Name
>        If Not ShownForms.ContainsKey(key) Then
>            form = New ItemType()
>            'Set other form parameters here
>            ShownForms.Add(key, form)
>        Else
>            form = CType(ShownForms(key), ItemType)
>        End If
>        Return form
>    End Function
>
>
> On Jan 4, 2008 9:28 AM, chris Burgess <[email protected]> wrote:
>
>
> > I have the following code to launch forms based upon a selection from
> > a list box:
> >
> >  Private Sub LoadReport_Click(ByVal sender As System.Object, ByVal e
> > As System.EventArgs) Handles LoadReport.Click
> >        Dim rpt As New BaseReport
> >        rpt = DirectCast(Me.Reports.SelectedValue, BaseReport)
> >        rpt.ShowDialog()
> >        rpt.Dispose()
> >    End Sub
> >
> > 'Reports' is a list box that contains 'Report' objects. The Report
> > object has a report name property (the DisplayMember) and a report
> > form property, each of which is derived from BaseForm (the
> > .valuemember).
> >
> > If I launch a report form, close it, then try to launch it again, I
> > get an error:
> >
> > System.ObjectDisposedException was unhandled
> >  Message="Cannot access a disposed object.
> > Object name: 'Report_OrdersByDate'."
> >  ObjectName="Report_OrdersByDate"
> >  Source="System.Windows.Forms"
> >  StackTrace:
> >       at System.Windows.Forms.Control.CreateHandle()
> >       at System.Windows.Forms.Form.CreateHandle()
> >       at System.Windows.Forms.Control.get_Handle()
> >       at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
> >       at System.Windows.Forms.Form.ShowDialog()
> >       at Converse.MainMenu.LoadReport_Click(Object sender, EventArgs
> > e) in C:\Work\StoreReporter\StoreReporter\MainMenu.vb:line 48
> >       at System.Windows.Forms.Control.OnClick(EventArgs e)
> >       at System.Windows.Forms.Button.OnClick(EventArgs e)
> >       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
> > (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 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 Converse.My.MyApplication.Main(String[] Args) in
> > 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81
> >       at System.AppDomain.nExecuteAssembly(Assembly 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.Run(ExecutionContext
> > executionContext, ContextCallback callback, Object state)
> >       at System.Threading.ThreadHelper.ThreadStart()
> >
>