me.Close

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von PrinzCharly.

    Moin...
    Bin ein wenig am Testen. Habe in einer Form nur ein einzelnes TreeView. In diesem TreeView möchte ich meine 'Menü-Struktur' aufbauen. Klicke ich auf den Knoten 'Beenden' rufe ich Me.Close auf.

    VB.NET-Quellcode

    1. Private Sub TreeView1_AfterSelect(sender As Object, e As TreeViewEventArgs) Handles TreeView1.AfterSelect
    2. Select Case e.Node.Name
    3. Case "Daten speichern"
    4. Call DatenSpeichern()
    5. Case "Beenden"
    6. Me.Close()
    7. End Select
    8. End Sub


    Dabei wird ein Fehler ausgelöst.
    'ObjectDisposedException wurde nicht behandelt'

    Fragen:
    Wie kann ich den Fehler abfangen?
    Warum tritt der Fehler auf? Ein Button.Click-Ereignis mit Me.Close() funktioniert doch auch. Wo liegt der Unterschied?

    Schon mal jetzt einen 'Guten Rutsch' ins Neue Jahr 2016
    Charly
    Bilder
    • Fehlermeldung.PNG

      16 kB, 474×407, 187 mal angesehen

    PrinzCharly schrieb:

    Klicke ich auf den Knoten 'Beenden'
    Krasses Fehldesign.
    Das ist ungefähr so, dass Du das Auto anhalten willst, wenn Du den Zigarettenanzünder reindrückst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Über 'Design' kann man ja trefflich streiten... ;) Mir gefällt auch nicht jedes Auto, welches so angeboten wird.
    Ansonsten hilft mir deine Antwort aber nicht wirklich weiter.
    Simpel gesagt, ich 'Klicke' auf ein Objekt und löse damit etwas aus. Ob es nun ein Button ist oder ein TreeView-Knoten ist doch erst einmal unwichtig.
    Gruß
    Charly
    1. ist ​Call VB6. Lass' das einfach weg.
    2. Gib' uns mal einen genauen StackTrace und mehr Code, so ist vollkommen unklar, was los ist.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Mehr gibt es nicht...
    Neue Windows-Forms Projekt, in das standardmäßig erstellte Form eine TreeView rein, im Designer 2 Knoten ins TreeView (eines davon hat den Namen 'Beenden', eines 'DatenSpeichern') und dazu im TreeView.AfterSelect den obigen Code.
    Wie gesagt, bin am Testen...

    P.S.: 'Daten speichern' im ersten Post ist falsch. Muss 'DatenSpeichern' heißen...
    Das kann ich mir nicht vorstellen. Irgendwas muss da schon disposed sein.
    Gib' uns daher bitte mal den StackTrace, sonst lässt sich da erst recht nichts herausfinden.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Bin relativ neu mit VB.net...
    Was genau ist StackTrace bzw. wie komme ich an die Information, die du haben willst? Hilft mir in Zukunft ja vermutlich, wenn ich mal wieder nach Fehlern suche oder hier um Hilfe bitte.

    Gruß
    Charly

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. End Sub
    4. Private Sub TreeView1_AfterSelect(sender As Object, e As TreeViewEventArgs) Handles TreeView1.AfterSelect
    5. Select Case e.Node.Name
    6. Case "DatenSpeichern"
    7. Call DatenSpeichern()
    8. Case "Beenden"
    9. Me.Close()
    10. End Select
    11. End Sub
    12. Private Sub DatenSpeichern()
    13. End Sub
    14. End Class


    P.S.: Mehr als das beschriebe Testprojekt ist nicht da. Ich rufe nichts anderes auf.
    Die Fehlermeldung kommt auch mit dem einfachen Nachmachen, wie er es geschrieben hat.

    Ich vermute nur, die Meldung kommt deshalb, weil das Treeview schon durch me.close disposed wurde und VS will da noch ein Event bezogen auf das Treeview abfeuern. Nun ist es aber disposed. Also ich denke, mit AfterSelect und Me.Close wird es nichts. Das musst du ändern.

    Übrigens würde ich solche Sachen nicht im Afterselect Event, sondern im DoubleClick, etc. Event behandeln.

    PrinzCharly schrieb:

    Mehr gibt es nicht...
    Poste mal die Form1.Designer.vb und die Form1.vb.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @ petaod
    Ja, gefunden - auch wenn es in VS 2015 etwas anders aussieht. 'Call Stack' habe ich dort so auch (noch) nicht gefunden?! Hat mir aber geholfen, da ich in den Debug-Bereich noch nicht wirklich intensiv reingeschaut habe, bzw. auch noch nicht die Notwendigkeit dazu hatte, da ich Fehler normalerweise im Code abfange - hier aber keiner auftritt.

    @ vb_fan
    Danke... Das kurze Testprojekt mal schnell selbst erstellen war wohl das einfachste Vorgehen, um nachzuvollziehen, welcher Fehler auftritt - 3 Minuten-Sache ;)
    Deine Anregung, das auf Click oder DoubleClick zu legen nehme ich gerne auf. AfterSelect war halt deshalb, weil es das Ereignis war, welches der Designer automatisch vorgeschlagen hat, nachdem ich auf das TreeView im Form-Designer geklickt habe.

    Habe das auch nochmals mit Einzelschritt durchlaufen lassen. Die Sub wird sauber abgearbeitet. Der Fehler tritt erst NACH schließen der Anwendung (hier der Form) auf, und nicht während der Code-Ausführung. Insofern kann ich auch nichts an weiteren Info liefern, da die Anwendung schon geschlossen.

    Danke euch allen...
    Und nun ein schönes Silvester
    Gruß
    Charly

    P.S.: Als Neuling hier doch noch eine Frage: Wie kann ich Bilder hier einfügen - ein Bild sagt ja oft mehr als 1.000 Worte. Dateianlagen geht ja wohl nur im Eröffnungs-Thread.

    @ RodFromGermany
    Die 'From1.vb' steht schon weiter oben...

    Die 'Form1.Designer.vb':

    VB.NET-Quellcode

    1. <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    2. Partial Class Form1
    3. Inherits System.Windows.Forms.Form
    4. 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
    5. <System.Diagnostics.DebuggerNonUserCode()> _
    6. Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    7. Try
    8. If disposing AndAlso components IsNot Nothing Then
    9. components.Dispose()
    10. End If
    11. Finally
    12. MyBase.Dispose(disposing)
    13. End Try
    14. End Sub
    15. 'Wird vom Windows Form-Designer benötigt.
    16. Private components As System.ComponentModel.IContainer
    17. 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
    18. 'Das Bearbeiten ist mit dem Windows Form-Designer möglich.
    19. 'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
    20. <System.Diagnostics.DebuggerStepThrough()> _
    21. Private Sub InitializeComponent()
    22. Dim TreeNode1 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Datei speichern")
    23. Dim TreeNode2 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Beenden")
    24. Dim TreeNode3 As System.Windows.Forms.TreeNode = New
    25. System.Windows.Forms.TreeNode("Programm", New
    26. System.Windows.Forms.TreeNode() {TreeNode1, TreeNode2})
    27. Dim TreeNode4 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Daten")
    28. Me.TreeView1 = New System.Windows.Forms.TreeView()
    29. Me.SuspendLayout()
    30. '
    31. 'TreeView1
    32. '
    33. Me.TreeView1.Location = New System.Drawing.Point(12, 12)
    34. Me.TreeView1.Name = "TreeView1"
    35. TreeNode1.Name = "Datei_speichern"
    36. TreeNode1.Text = "Datei speichern"
    37. TreeNode2.Name = "Beenden"
    38. TreeNode2.Text = "Beenden"
    39. TreeNode3.Name = "Programm"
    40. TreeNode3.Text = "Programm"
    41. TreeNode4.Name = "Daten"
    42. TreeNode4.Text = "Daten"
    43. Me.TreeView1.Nodes.AddRange(New System.Windows.Forms.TreeNode() {TreeNode3, TreeNode4})
    44. Me.TreeView1.Size = New System.Drawing.Size(260, 237)
    45. Me.TreeView1.TabIndex = 0
    46. '
    47. 'Form1
    48. '
    49. Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
    50. Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    51. Me.ClientSize = New System.Drawing.Size(284, 261)
    52. Me.Controls.Add(Me.TreeView1)
    53. Me.Name = "Form1"
    54. Me.Text = "Form1"
    55. Me.ResumeLayout(False)
    56. End Sub
    57. Friend WithEvents TreeView1 As TreeView
    58. End Class


    Schneller geht - wie 'vb_fan' schon schrieb - selbst das kleine Testprojekt zu erstellen...

    Danke aber für dein Bemühen

    LETZTE Änderung und dann 'fertig mit diesem Thema'...
    @ vb_fan
    Du hast es vermutlich nur vorgeschlagen, aber nicht selbst getestet...
    Gleicher Code im TreeView.NodeMouseClick-Ereignis funktioniert ohne Fehlermeldung!!!

    Damit Problem gelöst...

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „PrinzCharly“ ()

    Hej @PrinzCharly und willkommen im VB-Paradise :thumbup: .

    Versuch doch mal vor und hinter die Namen ein einzelnes Anführungszeichen zu setzen. Also: @'Name', dann wird derjenige auch tatsächlich benachrichtigt.

    PrinzCharly schrieb:

    Als Neuling hier doch noch eine Frage: Wie kann ich Bilder hier einfügen - ein Bild sagt ja oft mehr als 1.000 Worte. Dateianlagen geht ja wohl nur im Eröffnungs-Thread.

    Unter dem Editor findest du einen Button mit "Erweiterte Antwort". Dort kannst du dann wieder Bilder als Dateianhang einfügen.

    Grüße
    Väinämö
    @'PrinzCharly,

    alles klar. Dann verwende jetzt einen der entsprechenden Events. Wenn du willst das deine Methoden beim "Selktieren" aufgerufen werden musst du den MouseClick -Event verwenden bei einem Doppelklick dem entsprechend den MouseDoubleClick -Event. Und das Call noch raus nehmen, für Methoden -Aufrufe wird diese Schllüsselwort in .Net nicht mehr benötigt.

    *Edit*

    Die benötigten Events wären NodeMouseClick & NodeMouseDoubleClick.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Fakiz“ ()

    Wahrscheinlich böse, aber funktioniert

    VB.NET-Quellcode

    1. Private Sub TreeView1_AfterSelect(sender As Object, e As TreeViewEventArgs) Handles TreeView1.AfterSelect
    2. Select Case e.Node.Name
    3. Case "DatenSpeichern"
    4. Call DatenSpeichern()
    5. Case "Beenden"
    6. Me.Close()
    7. End
    8. End Select
    9. End Sub


    Funktioniert auch so:

    VB.NET-Quellcode

    1. Private Sub TreeView1_AfterSelect(sender As Object, e As TreeViewEventArgs) Handles TreeView1.AfterSelect
    2. Select Case e.Node.Name
    3. Case "DatenSpeichern"
    4. Call DatenSpeichern()
    5. Case "Beenden"
    6. Application.Exit()
    7. End Select
    8. End Sub


    Ich kann mir denken, dass das alles nicht sinnvoll ist und andere (bessere) Lösungen wurden ja auch genannt.

    Dksksm schrieb:

    Application.Exit()
    ist allerdings eine Holzhammermethode.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke an alle...
    Wie oben schon gesagt, me.close() reicht und funktioniert in dem entsprechenden 'mouseclick' Event.
    Das vom Designer vorgeschlagene 'TreeView.AfterSelect' war einfach das falsche Event. Aber, nur so lernt man ;)

    Frohes Neues Jahr nochmals...
    Gruß
    Charly