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() > > >