mehrere Treeview-Knoten in Schleife nach Bezeichnung abfragen

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    mehrere Treeview-Knoten in Schleife nach Bezeichnung abfragen

    Hallo liebe VB-Paradise Leute,

    ich bin neu hier und habe ein Problem:

    Ich habe in Form1 fünf Treeviews (treeview 1 - 5) mit jeweils einen Knoten (xyz, aaa, bbb, ccc, ddd).

    Es soll eine Schleife durchlaufen, welche den Topnodes.text abfragt und bei mit dem Text einer Textbox verglichen werden.
    Bei Übereinstimmung solle eine z.B. Messagebox erscheinen mit "Es kam im Treeview 3 zur Übereinstimmung".

    Wie kann ich also die insgesamt 5 Knoten in einer Schleife abfragen? Ohne der Verwendung einer Schleife ist es einfach:

    VB.NET-Quellcode

    1. If Textbox1.Text = me.TreeView1.TopNode.text then
    2. MsgBox("Bla Bla Übereinstimmung Bla Bla")


    Mit Schleife bekomme ich es nicht ohne Hilfe hin. Mein Ansatz:

    VB.NET-Quellcode

    1. Dim i As Integer
    2. Dim TV As TreeView
    3. For i = 1 To 5
    4. Tv = me.Controls("TreeView" & i.ToString)
    5. If TextBox1.Text = TV.TopNode.Text Then 'Knoten gefunden
    6. ...
    7. End If
    8. Next 'ansonsten weiter suchen


    Könnt ihr mir helfen? Danke im Voraus

    Sven
    Wozu Hilfe? Der Code in Block#2 passt und läuft doch. Wo kommst DU nicht weiter?
    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.
    Hi VaporiZed,

    bei mir kommt immer eine Fehlermeldung "NullReferenceExcepetion"

    Mein Originalcode lautet auch ein bisschen anders, ich dachte nur zur Vereinfachung passe ich ihn ein bisschen an.
    Beim Original gibt es 2 Formen. Auf Form 1 befinden sich die 5 TreeViews und auf Form 2 die Textbox.
    Der Textboxinhalt soll mit den Knoten der TreeViews verglichen werden...

    VB.NET-Quellcode

    1. Dim i As Integer
    2. Dim TV As TreeView
    3. For i = 1 To 5
    4. TV = Form1.Controls("TreeView" & i.ToString)
    5. If TextBox1.Text = TV.TopNode.Text Then 'Knoten gefunden
    6. End if


    Der Code befindet sich auf der Form 2.
    Willkommen im Forum. :thumbup:

    Zwän schrieb:

    VB.NET-Quellcode

    1. Tv = me.Controls("TreeView" & i.ToString)

    Zwän schrieb:

    VB.NET-Quellcode

    1. TV = Form1.Controls("TreeView" & i.ToString)
    Gugst und verstehst Du zunächst Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    So lange Du das nicht verstanden hast, musst Du nicht weitermachen :!:
    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!
    Hallo Rod,

    der erste Teil betrifft nur eine Form deswegen me. ...

    Im zweiten Teil existieren zwei Formen. Der Code steht in Form2 und dieser möchte auf Form1 zugreifen, deswegen "Form1.Controls...", da mit me.Control er auf die Form2 zugreifen würde.

    Deinen Link schaue ich mir gleich mal an :)
    1. Für welches Objekt kommt die Ex(ception)?
    2. Wie rufst Du aus Formular 1 das Formular 2 mit welchem Code auf?
    3. Arbeitest Du mit Threads? Denn selbst wer ohne es besser zu wissen (der Link von RfG macht diese Aussage ungültig) mit den Form-Namen hantiert, kommt ohne Threads zur gewünschten Wirkung.
    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.
    Nochemal: Für welches Objekt kommt die Ex? Du postest eine ganze Codezeile. Da gibt es mehrere Objekte drin (TextBox1, TV, TV.TopNode). Und ich hab noch ne 3. Frage nachgestellt (die kam wohl etwas spät)
    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.

    Zwän schrieb:

    deswegen "Form1.Controls..."
    Das ist alter schei... mist inkompatibler grottiger von der Evolution überholter VB6-Ranz.
    So kannst Du in VB.NET nicht (mehr) programmieren.
    Form1 => Form2: Aufruf einer Methode oder Setzen einer Property,
    Form2 => Form1: Auslösen eines Events.
    (hier ist vorausgesetzt, dass Form2 in Form1 instanziiert und aufgerufen wird.
    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!

    Zwän schrieb:

    Es wird die ganze Zeile markiert und auf den Fehler verwiesen.
    Dann kann das Lernen jetzt losgehen. Lerne zu Debuggen: Debuggen, Fehler finden und beseitigen
    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!
    Ich habe bisher immer mit F5 Debuggin gestartet.

    Die Ex kommt für das Obekt TV! ---> TV = Form1.Controls("TreeView" & i.ToString)

    Ich werde, wie Rob beschrieben, es morgen nachfolgend umzusetzen:
    "Form1 => Form2: Aufruf einer Methode oder Setzen einer Property,Form2 => Form1: Auslösen eines Events.(hier ist vorausgesetzt, dass Form2 in Form1 instanziiert und aufgerufen wird."

    Danke euch für die Hilfe und schönen Abend noch
    Hm, komisches Ding. Der folgende Code ist bei mir lauffähig, soll aber auf keinen Fall zeigen, dass man es so lassen soll.
    VB6-Style; obsolet

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. TreeView1.Nodes.Add("a")
    4. TreeView2.Nodes.Add("b")
    5. TreeView3.Nodes.Add("c")
    6. TreeView4.Nodes.Add("d")
    7. TreeView5.Nodes.Add("e")
    8. Form2.Show()
    9. End Sub
    10. End Class

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    3. Dim i As Integer
    4. Dim TV As TreeView
    5. For i = 1 To 5
    6. TV = DirectCast(Form1.Controls("TreeView" & i.ToString), TreeView)
    7. If TextBox1.Text = TV.TopNode.Text Then 'Knoten gefunden
    8. MessageBox.Show(i.ToString)
    9. End If
    10. Next 'ansonsten weiter suchen
    11. End Sub
    12. End Class



    Daher hier nochmal eine sinnvolle Variante, wie man es besser machen könnte. Namenskonvention hab ich mal über den Haufen geworfen.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. TreeView1.Nodes.Add("a")
    4. TreeView2.Nodes.Add("b")
    5. TreeView3.Nodes.Add("c")
    6. TreeView4.Nodes.Add("d")
    7. TreeView5.Nodes.Add("e")
    8. Using Frm As New Form2
    9. AddHandler Frm.GetTreeViewTopNodeText, AddressOf SendTvTopNodeText
    10. Frm.ShowDialog(Me)
    11. End Using
    12. End Sub
    13. Private Sub SendTvTopNodeText(sender As Object, e As Form2.GetTreeViewTopNodeTextEventArgs)
    14. e.TreeViewTopNodeText = DirectCast(Me.Controls(e.TreeViewName), TreeView).TopNode.Text
    15. End Sub
    16. End Class

    VB.NET-Quellcode

    1. Public Class Form2
    2. Public Event GetTreeViewTopNodeText As EventHandler(Of GetTreeViewTopNodeTextEventArgs)
    3. Public Class GetTreeViewTopNodeTextEventArgs : Inherits EventArgs
    4. Public TreeViewName As String
    5. Public TreeViewTopNodeText As String
    6. End Class
    7. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    8. Dim CurrentTreeViewName As String = Nothing
    9. Dim CurrentEventArgs As New GetTreeViewTopNodeTextEventArgs
    10. For i = 1 To 5
    11. CurrentTreeViewName = "TreeView" & i.ToString
    12. CurrentEventArgs.TreeViewName = CurrentTreeViewName
    13. RaiseEvent GetTreeViewTopNodeText(Me, CurrentEventArgs)
    14. If TextBox1.Text = CurrentEventArgs.TreeViewTopNodeText Then
    15. MessageBox.Show(i.ToString)
    16. End If
    17. Next
    18. End Sub
    19. End Class

    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.

    Zwän schrieb:

    Das Objekt "TV" ist "nothing".
    Da fehlt irgendwo ein TV = New WAS_AUCH_IMMER oder eine entsprechende Zuweisung.
    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!
    Da Variante 2 gar kein TV enthält, muss der Knoten in Deinem Code drin sein. Gibt es überhaupt die 5 TreeViews mit den Namen TreeView1 bis TreeView5? Lad mal bitte Dein bereinigtes Projekt hoch.
    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.

    Zwän schrieb:

    Man müsste also mit Form1.Panel1... beginnen
    Sofern Form1 der Name der Instanz, nicht aber der Name der Form ist und der dann an die andere Form-Instanz zu übergeben wäre.
    Wenn es sich um die MainForm handelt, ginge auch

    VB.NET-Quellcode

    1. Dim frm = Application.OpenForms(0)
    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!