Treeview in Visual Studio 17 (VB)

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

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Treeview in Visual Studio 17 (VB)

    Huhu, eine Frage ich bastel gerade an einem Treeview in VB und würde gerne abfragen welchen Node der User geklickt hat. Im moment habe ich das so.

    VB.NET-Quellcode

    1. Private Sub Tvw_Haupt_AfterSelect(ByVal sender As Object, ByVal e As TreeViewEventArgs) Handles Tvw_Haupt.AfterSelect
    2. MessageBox.Show((dicHaupt.Item(e.Node.Text).ToString))
    3. End Sub


    Der Text der Node wird in einem Dictionary gesucht und dessen "Item" ausgegeben. Ich bekomme aber folgendes Problem:

    Die Nodes sind alle schon per Designer hinzugefügt worden. So bald ich nun das UserForm aufrufe wird mir direkt die oberste Node schon per MessageBox ausgegeben (bzw das Item des Dic), dabei wurde noch nichts geklickt. Ich habe sicher das falsche Event genommen oder?

    Hat jemand evtl. einen Ratschlagf für mich?
    @Black-Mage Wie hast Du denn das Dictionary befüllt?
    Ohne das Dictionary sieht das vernünftig aus.
    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!

    Black-Mage schrieb:

    Tvw_Haupt.AfterSelect
    hat nichts mit

    Black-Mage schrieb:

    geklickt
    zu tun. Da das TreeView nach dem Laden automatisch den ersten Node - falls vorhanden - auswählt (= selektiert), wird auch das AfterSelect-Event gefeuert. Du könntest ein Boolean-Flag machen, was steuert, ob der von Dir gepostete EventHandler gefeuert werden soll. Dazu klassenweit eine Boolean-Variable (z.B. namens ShallProcessEventHandlerCode) mit Wert False erstellen und am Ende vom FormShown-EventHandler diese Variable auf True setzen. Und im o.g. TreeView-EventHandler als erste Zeile: If Not ShallProcessEventHandlerCode Then Return
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Da das TreeView nach dem Laden automatisch den ersten Node - falls vorhanden - auswählt
    Bist du da sicher?
    Ich hab das nicht so in Erinnerung.
    Aber man kanns ja leicht herauskommen, indem man einen Haltepunkt ins Event setzt, und dann im CallStack nachguckt, wo es ausgelöst wurde.
    Jup. TreeView mit Knoten befüllen und im Code:

    VB.NET-Quellcode

    1. Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles Me.Load
    2. Stop
    3. End Sub
    4. Private Sub TreeView1_AfterSelect(sender As Object, e As TreeViewEventArgs) Handles TreeView1.AfterSelect
    5. Stop
    6. End Sub
    7. Private Sub FrmMain_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    8. Stop
    9. End Sub

    Wird in der Reihenfolge abgearbeitet.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Komisch - bei mir nicht.

    VB.NET-Quellcode

    1. Public Class frm_Template
    2. Private Sub TreeView1_AfterSelect(sender As Object, e As TreeViewEventArgs) Handles TreeView1.AfterSelect
    3. Stop ' wird beim Startup nicht erreicht - erst beim ersten selectieren eines Treenodes
    4. End Sub
    5. End Class

    Aber ich guck auch nochmal in vb2017
    Jo - gleiches Spiel - im Anhang mal meine 2013-Solution
    Dateien
    • _Template01.zip

      (204,31 kB, 93 mal heruntergeladen, zuletzt: )

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

    Dann hab ich wohl instinktiv die gleiche Situation/den gleichen Fehler wie der TE gemacht: TreeView als Erstfokus-CE auf dem Formular.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    RodFromGermany schrieb:

    @Black-Mage Wie hast Du denn das Dictionary befüllt?
    Ohne das Dictionary sieht das vernünftig aus.

    Huhu in einer eigenen Sub im Code per .add Key /item habe ich die befüllt.
    Es dient auch lediglich dem Programm als Speicher. Der User hat darauf keinen zugriff.

    VaporiZed schrieb:

    Black-Mage schrieb:

    Tvw_Haupt.AfterSelect
    hat nichts mit

    Black-Mage schrieb:

    geklickt
    zu tun. Da das TreeView nach dem Laden automatisch den ersten Node - falls vorhanden - auswählt (= selektiert), wird auch das AfterSelect-Event gefeuert. Du könntest ein Boolean-Flag machen, was steuert, ob der von Dir gepostete EventHandler gefeuert werden soll. Dazu klassenweit eine Boolean-Variable (z.B. namens ShallProcessEventHandlerCode) mit Wert False erstellen und am Ende vom FormShown-EventHandler diese Variable auf True setzen. Und im o.g. TreeView-EventHandler als erste Zeile: If Not ShallProcessEventHandlerCode Then Return


    Huhu wenn das AfterSelect Event nicht so ganz das richtige ist, was würde man denn normal machen, wenn das TV darauf reagieren soll, wenn man eine Node anklickt. Ich hatte davor Nodemouseclick oder so in der art, und da hatte ich das Problam das er immer die Node genommen hatte die davor ausgewählt war (also eines immer davor). Mit dem afterselevt ging das.

    ErfinderDesRades schrieb:

    Komisch - bei mir nicht.

    VB.NET-Quellcode

    1. Public Class frm_Template
    2. Private Sub TreeView1_AfterSelect(sender As Object, e As TreeViewEventArgs) Handles TreeView1.AfterSelect
    3. Stop ' wird beim Startup nicht erreicht - erst beim ersten selectieren eines Treenodes
    4. End Sub
    5. End Class

    Aber ich guck auch nochmal in vb2017
    Jo - gleiches Spiel - im Anhang mal meine 2013-Solution


    Huhu ich schau mir deine Datei mal an. Danke :)

    Ich werde das aber mit dem Flag mal versuchen.
    Allen schonmal ein großes danke für die Hilfe.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Black-Mage“ ()

    @Black-Mage Hör mal auf, vollständige Posts zu zitieren, das erschwert das Lesen enorm.
    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!