Dialogfeld lässt sich nur 1 mal aufrufen
-
hi,
ich schon wieder ^^ich habe ein Dialogfeld, welches ich über ein Menü aufrufe, klappt auch aber leider nur 1 mal
beim 2. Mal bekomm ich ne Debug-Felermeldung die so aussieht (vollständig wie ich hoffe ) :
System.ObjectDisposedException wurde nicht behandelt. Message="Auf das verworfene Objekt kann nicht zugegriffen werden.\r\nObjektname: Mdialog." Source="System.Windows.Forms" ObjectName="Mdialog" StackTrace: bei System.Windows.Forms.Control.CreateHandle() bei System.Windows.Forms.Form.CreateHandle() bei System.Windows.Forms.Control.get_Handle() bei System.Windows.Forms.Control.SetVisibleCore(Boolean value) bei System.Windows.Forms.Form.SetVisibleCore(Boolean value) bei System.Windows.Forms.Control.Show() bei _stC_SHARPprog.Form1.MenuMOnClick(Object obj, EventArgs ea) in C:\Dokumente und Einstellungen\as\Eigene Dateien\Visual Studio 2005\Projects\Linien.cs:Zeile 333. bei System.Windows.Forms.MenuItem.OnClick(EventArgs e) bei System.Windows.Forms.MenuItem.MenuItemData.Execute() bei System.Windows.Forms.Command.Invoke() bei System.Windows.Forms.Command.DispatchID(Int32 id) bei System.Windows.Forms.Control.WmCommand(Message& m) bei System.Windows.Forms.Control.WndProc(Message& m) bei System.Windows.Forms.ScrollableControl.WndProc(Message& m) bei System.Windows.Forms.ContainerControl.WndProc(Message& m) bei System.Windows.Forms.Form.WndProc(Message& m) bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) bei System.Windows.Forms.Application.Run(Form mainForm) bei _stC_SHARPprog.Program.Main(String[] astrArgs) in C:\Dokumente und Einstellungen\as\Eigene Dateien\Visual Studio 2005\Projects\1stC-SHARPprog\1stC-SHARPprog\Program.cs:Zeile 27. bei System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args) bei System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel) bei System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() bei System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData) bei System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext) bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() bei System.Threading.ThreadHelper.ThreadStart_Context(Object state) bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) bei System.Threading.ThreadHelper.ThreadStart()
Kann jemand damit was anfangen ? Ich habe noch ein anderes Dialogfeld, welches tadellos funktioniert. und ich habe keinen Unterschied zwischen beiden gefunden.
Vielen Dank für alle Antworten
noha
-
Ich hätte da eine Idee aber kA ob das der wirkliche Grund sein kann, weil es ein Anfängerfehler wäre.
Könnte es vielleicht sein das du eine Instanz vom Dialogfeld hast, diese schließt bzw. auf Null setzt und ohne einen neue Instanz zu erstellen mit dem zugriff auf die Alte versuchst sie zu öffnen?
Hier hast mal einen Link mit erklären was ich meine: http://msdn2.microsoft.com/en-us/library/system.objectdisposedexception.aspx
Was anderes fällt mir dazu nicht ein.
-
Zeig etwas Code her.
Dein Fehler ist System.ObjectDisposedException so wie King es geschrieben hat.
-
Das mach ich in der "Hauptform Klasse noch form Konstruktor !
Mdialog mdlg = new Mdialog();
der Zugriff erfolg hier:
void MenuMOnClick(object obj, EventArgs ea) { mdlg.Show(); if (mdlg.DialogResult == DialogResult.OK) { ownerechelle = true; } }
-> Dort kommt auch die Debug Fehlermeldung wenn ich en 2. Mal auf den Menüeintrag drücke ( und zwar für mdlg.Show(); )
ich brauch danach noch Eigenschaften des Dialogs, daher als globale Variable/ Feld
und falls es hilft, so ist die Klasse MDialog:
class Mdialog : Form { Norsensoft.ScrollButton scrbtn; NumericUpDown updown = new NumericUpDown(); NumericUpDown updown2 = new NumericUpDown(); bool ownerechelle = false; public Mdialog() { Text = "Maßstab"; FormBorderStyle = FormBorderStyle.FixedDialog; ControlBox = true; MaximizeBox = false; MinimizeBox = false; ShowInTaskbar = false; Button btn = new Button(); btn.Parent = this; btn.Text = "OK"; btn.Location = new Point(10, 150); btn.Size = new Size(10 * Font.Height, 2 * Font.Height); btn.Click += new EventHandler(ButtonOkOnClick); scrbtn = new Norsensoft.ScrollButton(new Point(0, 0), new Size(300, 70)); scrbtn.Add("Benutzerdefinierter Maßstab"); scrbtn.Add("Automatischer Maßstab"); scrbtn.Click += new EventHandler(MyClick); Controls.Add(scrbtn); updown.Location = new Point(10, 100); updown.Size = new Size(50, 15); updown.Value = 1m; updown.Increment = 10m; updown.TextAlign = HorizontalAlignment.Right; updown.Minimum = 10m; updown.Maximum = 1000m; updown2.Location = new Point(155, 100); updown2.Size = new Size(50, 15); updown2.Value = 10m; updown2.Increment = 1m; updown2.TextAlign = HorizontalAlignment.Right; updown2.Minimum = 1m; updown2.Maximum = decimal.MaxValue; Controls.Add(updown); Controls.Add(updown2); } void ButtonOkOnClick(object obj, EventArgs ea) { DialogResult = DialogResult.OK; this.Close(); } void MyClick(object obj, EventArgs e) { base.OnClick(e); switch (scrbtn.Index ) { case 1: ownerechelle = false; DialogResult = DialogResult.Cancel; this.Close(); break; case 0: ownerechelle = true; break; } } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Graphics grfx = e.Graphics; grfx.DrawString("Millimeter = Newton",new Font("Times New Roman",14),Brushes.Black,new Point( 60, 100)); } public float Scale { get { return (float)(updown2.Value / updown.Value) ; } } public bool Ownerechelle { get { return ownerechelle; } } }
* edit: Ich bin mir nicht bewusst, das das Objekt verworfen/ freigegeben wird o.ä.
-
Wie willst du eine Result eines Dialogs auswerten wenn du eine Modlessdialog erstellst.
Show() erzeugt eine Modelssdialog.
Rufe ShowDialog() auf dann erstellst du eine Modalen Dialog und kannst auch auswerten was dort gemacht wurde.
Warum aber nun deine Exeption: Du schließt den Dialog und dort wird somit Dispose aufgerufen.
Somit wird das Objekt zerstört und kann nicht nochmalls aufgerufen werden.void MenuMOnClick(object obj, EventArgs ea) { Mdialog mdlg = new Mdialog(); mdlg.ShowDialog(); if (mdlg.DialogResult == DialogResult.OK) { ownerechelle = true; } }
-
Danke, das tuts