Announcement

Collapse
No announcement yet.

Treeview-Node per Code selektieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Treeview-Node per Code selektieren

    Hallo zusammen,

    ich habe ein Problem mit Treeview.
    Auszug des Treeview's

    Box 1
    Box 2
    disk 1
    disk 2
    Box 3
    Box 4
    disk 1
    FILM 1
    film 2
    film 3
    film 4
    disk 2
    film 1
    film 2
    film 3
    film 4
    disk 3
    film 1
    film 2
    film 3
    film 4
    disk 4
    film 1
    film 2
    film 3
    film 4

    usw.


    Auf einer anderen Form habe ich 6 Button's
    (1) Prev Box
    (2) Next Box

    (3) Prev Disk
    (4) Next Disk

    (5) Prev Film
    (6) Next Film

    Mein Beispiel:
    Im TreeView ist Box 4 Disk 1 Film 1 selektiert.

    Nun mein Problem
    Wenn ich nun Button "Next Film" Click soll Box 4 Disk 1 Film 2 selektiert werden und ich will den Tag des Knoten auslesen können.
    Wie geht das?

    Vielen Dank im voraus

    Walter

  • #2
    Das wird in dem Fall mit

    http://msdn.microsoft.com/en-us/libr...vs.110%29.aspx

    gehen.
    Christian

    Comment


    • #3
      Code:
      Box 1
      Box 2
         disk 1
         disk 2
      Box 3
      Box 4
         disk 1
            FILM 1
            film 2
            film 3
            film 4
         disk 2
            film 1
            film 2
            film 3
            film 4
         disk 3
            film 1
            film 2
            film 3
            film 4
         disk 4
            film 1
            film 2
            film 3
            film 4
      Die Eigenschaft NextNode ist vermutlich nicht geeignet. Sie gibt stur den nächsten Knoten zurück, egal ob es ein Film eine Disk oder eine Box ist.
      D.h. Wenn du auf Box 4/Disk 1/Film 4 bist, gibt "NextNode" Box 4/Disk 2 zurück. Vermutlich möchtest du aber einen Film haben und keine Disk.

      Was soll denn passieren, wenn z.B. Box 4/Disk 1/Film 4 selektiert ist und man auf "Next Film" klickt?
      Soll er zur nächsten Disk (Disk 2/Film 1) wechseln? Wieder zurück zum Film 1 der Disk 1? Oder soll der Button "Next Film" gar nicht erst enabled sein?
      Was soll passieren wenn du ganz unten angekommen bist?


      Ich hatte mal ein ähnliches Problem, da ging es um eine Suchfunktion im Tree. Nach langen Versuchen und diversen Fehlschlägen sieht meine Lösung so aus:

      Erzeuge dir eine eigene "Node" Klasse die du von TreeNode ableitest, dort definierst du zusätzlich die Eigenschaft ob der Knoten eine Box, Disk oder Film darstellt. Unter Umständen kannst du damit schon alle deine Wünsche realisieren.

      Bei meiner Applikation reichte das noch nicht.
      Wenn der Tree zur Laufzeit erzeugt wird, kopiere ich die Elemente in eine flache Liste, genauer in eine LinkedList(Of TreeNode) Variable.
      In dieser Variable gibt es ebenfalls Methoden wie "Find", "Next", "First", etc. Dort suche ich meine Knoten und gebe sie über eine Funktion zurück.

      Gruss

      Comment


      • #4
        Hallo Wernfried,

        Danke für Deine Hilfe.

        Die Button sollen jenach Position enabled oder nicht enabled sein. Sprich, Box 4/ Disk 1/ Film 4 "NEXT DISK" , "PREV BOX", "PREV FILM" sind enabled, alle anderen nicht.
        Wenn Du mir noch eine Hilfe zu: "Erzeuge dir eine eigene "Node" Klasse die du von TreeNode ableitest, dort definierst du zusätzlich die Eigenschaft ob der Knoten eine Box, Disk oder Film darstellt.
        Unter Umständen kannst du damit schon alle deine Wünsche realisieren." geben kannst, super!

        Danke im voraus Walter

        Comment


        • #5
          Das ganze kann ungefähr so aussehen:

          [HIGHLIGHT=vb]
          Private Class FilmSammlungNode
          Inherits TreeNode
          Private NodeType As String

          Public Sub New(ByVal text As String, ByVal nt As String)
          MyBase.New(text)
          NodeType = nt
          End Sub

          Public Function NextFilm(currentNode ...) As FilmSammlungNode
          If currentNode.NextNode.NextNode.NodeType <> "Film" Then ' Prüfe ob es weitere Filme in der Box gibt
          Button_NextFilm.Enabled = False
          Else
          Button_NextFilm.Enabled = True
          End If
          Return currentNode.NextNode
          End Function

          End Class
          [/HIGHLIGHT]


          Den Tree baust du dann so auf:
          [HIGHLIGHT=vb]
          Dim aNode As FilmSammlungNode

          aNode = New FilmSammlungNode("Action Filme", "Box")
          filmTree.Nodes.Add(aNode)

          aNode = New FilmSammlungNode("Jagt auf Roter Oktober", "Film")
          filmTree.Nodes.Add(aNode)
          [/HIGHLIGHT]

          Der Typ sollte natürlich nicht als hart codierter Text in einer Klassen Variable gespeichert sein, sondern als Aufzählung (Enum) in einer Eigenschaft (Property) aber so habe ich weniger zu schreiben (ausserdem will ich dir nicht alles vorkauen)

          Gruss

          Comment


          • #6
            Kann man denn das ganze nicht umdrehen und es per DataBinding machen? D.h. ich habe die Struktur eins zu eins so wie sie im Baum dargestellt werden als Objekte im Code liegen. Danach verwende ich eine ObjectBindingSource und binde diese an den TreeNodeView. Dieser rendert jetzt den kompletten Baum. Dazu gibt es noch eine weitere Eigenschaft (SelectedObject) in der immer das aktuell ausgewählte Objekt drin steht. Dann könnte man relativ einfach im Code den nächsten Film finden und SelectedObject auf diesen Wert setzen und es würde im View automatisch als markiert erscheinen. Anders herum würde das natürlich genauso funktionieren. Ich bin relativ viel in der Javascript Welt unterwegs und dort ist das eigentlich schon fast Standard (Knockout, Angular usw.).

            Comment

            Working...
            X