2016-11-20 3 views
0

Ich erstelle benutzerdefinierte Explorer mit Listview, und ich muss navigieren Schaltflächen für die Auflistung von Verzeichnissen, wie in Windows Explorer. Also, kurz gesagt Erklärung ich es brauche, wie dies funktioniert:Listview Explorer - Verzeichnisschaltflächen wie Windows Explorer navigieren?

  1. Wenn Sie einen Doppelklick auf „Ordner“ in Listview, Sie Ebene gehen in diesem Verzeichnis nach unten (Ich habe diese Arbeit)

  2. Wenn Wenn Sie dies tun, sollte die Schaltfläche für die Rückwärtsnavigation aktiv werden und Sie können zur vorherigen Verzeichnisposition zurückkehren. Wenn zurückgegeben, sollte auch die Schaltfläche zum Hochgehen aktiv sein - um in das Verzeichnis zurückzukehren, in dem Sie waren, als Sie auf "Ordner" doppelgeklickt haben.

  3. Ich möchte, dass dies für so viele Up/Down-Ordnerpfade funktioniert wie Benutzerklicks - so funktioniert Windows Explorer.

Ich habe versucht, durch für Pfade öffentliche Variable deklarieren (die von ListViewItem-Tags gespeichert werden), aber man kann nur einmal nach oben/unten in Verzeichnisse bewegen. Ich möchte, dass es so oft funktioniert, wie der Benutzer navigieren kann, wenn es natürlich Verzeichnisse in Verzeichnissen gibt.

Dies ist mein letzter Versuch (mit Liste der Strings):

Dim Navigation as List(of String) 

Private Sub ListView1_DoubleClick(sender As Object, e As EventArgs) Handles ListView1.DoubleClick 

     If ListView1.SelectedItems(0).ImageKey = "folder" Then 

     Dim ItemDirectory As IO.DirectoryInfo 
      ItemDirectory = New IO.DirectoryInfo(ListView1.SelectedItems(0).Tag.ToString) 
      'Pass this path to List of strings too 
      Navigation = ItemDirectory 

      '... I'm adding each subdirectories and files in Listview here 
     Else '... If not folder then just open file by double-clicking 
      Process.Start(ListView1.SelectedItems(0).Tag) 
     End If 
     BtnNavigateBackwards.Enabled=True 'Enable navigating backwards 
End Sub 

Private Sub BtnNavigateForward_Click(sender As Object, e As EventArgs) Handles BtnNavigateForward.Click 

     If Navigation.Count <> 0 Then 

     'Get directory that is one level down from where you are in Listview - I was allready in It by clicking on "folder" item 
      Dim ItemDirectory As IO.DirectoryInfo 
      ItemDirectory = New IO.DirectoryInfo(Navigation. ???? go to path 1 level down each click until last list of string ???) 
      '... Adding each subdirectories and files for directory one level down 
      '... Also checking for "folder" item in directory - If they are not then disable this button 
     End If 

End Sub 

Private Sub BtnNavigateBackwards_Click(sender As Object, e As EventArgs) Handles BtnNavigateBackwards.Click 
     'Get directory one level up from where I am in Listview 
     Dim ItemDirectory As IO.DirectoryInfo 
     ItemDirectory = New IO.DirectoryInfo(IO.Path.GetDirectoryName(Navigation. ?????? how to go only 1 level up each click ???)) 

     '... Adding each subdirectory and files to Listview 

End Sub 

Das ist nicht mein kompletter Code, da es sehr lang ist, und ich weiß, es fehlen viele Dinge. Aber die wichtigste Frage ist - kann ich mich sogar mit der Liste der Saiten so nach oben/unten bewegen?

+0

je nach Ansicht, explorer ist mehr wie ein Treeview, die die Ordnerstruktur und ein Listenansicht zeigt, die zeigen den Inhalt des ausgewählten Ordners – Plutonix

+0

@Plutonix, sicher, das ist richtig. Mein Design ist so: Sie klicken auf einen Treeview-Knoten, der das Tag des Verzeichnisses enthält, und dann wird Listview aufgefüllt. Von dort arbeite ich nur mit Listview und alle Artikel haben ihre Tags. Navigationstasten sind nur für Listview, ich versuche Windows Explorer Look zu erstellen. By the way, habe ich es zu arbeiten 1. Ebene zu navigieren rückwärts, jetzt nur noch die navigate vorwärts Code fehlt mir - was ich denke, ist härter, es hat zu „merken“ und bieten in Klick Schritten alle Ordner-Tags, die ich allready war im. – LuckyLuke82

Antwort

0

Problem gelöst. Sie können wie im Explorer navigieren, indem Sie einige Schleifen von Element-Tags ausführen. Aber zuerst müssen wir Item-Tags in einer Liste von Strings speichern. Also, in meinem Fall habe ich „Ordner“ Element gespeichert Tags, wenn ich auf sie verdoppeln, ein Verzeichnis zu gehen:

Private Navigation As New List(Of String) 'We store each item tag in here and use It for navigating in Listview directories 
'Handle double click on folders - when clicked you go into folder, as in Explorer 
Private Sub ListView1_DoubleClick(sender As Object, e As EventArgs) Handles ListView1.DoubleClick 
     If sender Is Nothing OrElse Not TypeOf sender Is System.Windows.Forms.ListView Then Exit Sub 
     With CType(sender, System.Windows.Forms.ListView) 
      If sender.SelectedItems(0).ImageKey = "folder" Then 
       'Get directory of folder 
       Dim ItemDirectory As IO.DirectoryInfo 
       ItemDirectory = New IO.DirectoryInfo(sender.SelectedItems(0).Tag.ToString) 
       'Then we also add folder item to our variable 
       Navigation.Add(sender.SelectedItems(0).Tag.ToString) 
       sender.Items.Clear() 
       'Then we add each subdirectories and files using GetDirectories and GetFiles 
... 
... 
... 

End Sub 
Private Sub Btn_NavigateForward_Click(sender As Object, e As EventArgs) Handles Btn_NavigateForward.Click 
     Dim i As Integer = 0 
     'When we navigate forward Listview has items, so we need to loop their tags. If loop finds same string that we stored in Navigation variable than this means we were allready in this directory 
     For i = ListView1.Items.Count - 1 To 0 Step -1 
      For Each path As String In Navigation 
       If ListView1.Items(i).Tag.ToString = path Then 
        Navigation_Forward(ListView1, path) 
        Exit Sub 
       End If 
      Next 
     Next 
End Sub 

Private Sub Btn_NavigateBack_Click(sender As Object, e As EventArgs) Handles Btn_NavigateBack.Click 
'When navigating back we have two options – either no items in a directory or there are some ! 
'In both cases we just do correct loops. For no folder we loop backwards in Navigation variable strings 
     If ListView1.Items.Count = 0 Then 
      For j As Integer = Navigation.Count - 1 To 0 Step -1 
       Dim s As String = Navigation.Item(j) 
       Navigation_Back(ListView1, s) 
       Exit Sub 
      Next j 
'If items are in Listview then we first do a loop through items, and a backward loop in Navigation variable – looking for a »folder« tag match 
     ElseIf ListView1.Items.Count > 0 Then 
      Dim i As Integer = 0 
      For i = 0 To ListView1.Items.Count - 1 
       For j As Integer = Navigation.Count - 1 To 0 Step -1 
        Dim s As String = Navigation.Item(j) 
        If s = IO.Path.GetDirectoryName(ListView1.Items(i).Tag.ToString) Then 
         Navigation_Back(ListView1, s) 
         Exit Sub 
        End If 
       Next 
      Next 
'And here is sub for navigating forward – I'm posting only this one, because Navigation_Back is basically same, you just have to define Directory_item like this: »Directory_Item = New IO.DirectoryInfo(IO.Path.GetDirectoryName(path))« - instead of what you see in this sub here 
    Public Sub Navigation_Forward(ByVal sender As Object, ByVal Path As String) 

     Dim LView As System.Windows.Forms.ListView = sender 

     With CType(sender, System.Windows.Forms.ListView) 

      Dim Directory_Item = New IO.DirectoryInfo(Path) 

      LView.Items.Clear() 

      For Each My_directory As IO.DirectoryInfo In Directory_Item.GetDirectories 

       Dim Lvi As New ListViewItem 

       Lvi.Tag = My_directory.FullName 
       Lvi.ImageKey = CacheShellIcon(My_Directory.FullName) 
       Lvi.Text = My_Directory.Name 
       Lvi.Items.Add(Directory_Item) 

      Next 

      'Do same loop for files if desired 
     End With 

    End Sub 

-Code arbeitet für Schaltflächen im Zusammenhang mit der Navigation Listview Inhalt nur. Ich denke jedoch, dass es angepasst werden kann, um mit Treeview-Knoten zu arbeiten, falls gewünscht.

Verwandte Themen