Ordnerpfad Visuell Darstellen (Breadcrumb)

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

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von Matix Media.

    Ordnerpfad Visuell Darstellen (Breadcrumb)

    Hallo Menschen,...

    Ich habe eine Frage bezüglich des Visuellen darstellen von einem Dateipfad, ich meine sowas wie in GIMP:
    Vorschau

    Ist es möglich sowas wie

    VB.NET-Quellcode

    1. For Each pathTeil In Path.GetSubFolders(path)
    2. Dim btnFolderV As New Button
    3. btnFolderV.Text = Path.GetFileName(pathTeil)
    4. btnFolderV.Name = "folderVLabel" & i
    5. flpFolderVisual.Controls.Add(btnFolderV)
    6. Next

    zu machen?

    Danke im Vorraus, Matix
    Grüße, Matix
    Hallo

    Ich werfe hier mal das Stichwort Breadcrumb in den Raum.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ok Danke, ich "Google" mal ob ich da was finde.

    Edit:
    Leider habe ich nicht das gefunden wonach ich gesucht habe....

    Ich suche nach einer Möglichkeit für jeden Ordner in dem Pfad einen Button hinzuzufügen. Wie ich das mit den Buttons mache weis ich schon.

    Edit 2:
    Villeicht gibt es sowas für VB.Net? codeproject.com/Articles/32189/WPF-Breadcrumb-Folder-TextBox
    Grüße, Matix

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

    Matix Media schrieb:

    Ich suche nach einer Möglichkeit für jeden Ordner in dem Pfad einen Button hinzuzufügen. Wie ich das mit den Buttons mache weis ich schon.
    Ich versteh die Frage nicht.
    Wenn du weisst, wie du "das mt den Buttons" machst - dann mach es doch: Füge für jeden Ordner im Pfad einen Button hinzu.

    Vlt. ist Stichwort FlowlayoutPanel dir nützlich - wenn man das auf LayoutOrder.LeftToRight stellt, und dann Buttons reinschmeisst, dann werden die schön der Reihe nach angezeigt.
    @Matix Media so was:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim di = New IO.DirectoryInfo("c:\d\e\f\g\h")
    3. Me.ListBox1.Items.Clear()
    4. Me.ListBox1.Items.Add(di.Name)
    5. Do While di.Parent IsNot Nothing
    6. Me.ListBox1.Items.Add(di.Parent.Name)
    7. di = di.Parent
    8. Loop
    9. End Sub
    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!
    Ja genau sowas!! Danke Super

    Edit:

    Jetzt habe ich das alles, möchte aber beim Click event von den Ganzen buttons zum Dateipfad von ihm navigieren, der im Tag Steht

    VB.NET-Quellcode

    1. Dim di = New IO.DirectoryInfo(now_path)
    2. flpFolderVisual.Controls.Clear()
    3. Dim buttonToAdd As New Button
    4. buttonToAdd.Tag = di.Name
    5. buttonToAdd.Text = di.Name
    6. buttonToAdd.Font = New Font("Segoe UI", 8)
    7. buttonToAdd.BackColor = SystemColors.Control
    8. buttonToAdd.FlatStyle = FlatStyle.Flat
    9. Dim g = Me.CreateGraphics
    10. g.PageUnit = Drawing.GraphicsUnit.Pixel
    11. Dim sz = g.MeasureString(di.Name, New Font("Segoe UI", 8))
    12. buttonToAdd.Size = New Size(sz.Width + 25, buttonToAdd.Height)
    13. flpFolderVisual.Controls.Add(buttonToAdd)
    14. AddHandler buttonToAdd.Click, AddressOf btnFolderViewer_Click
    15. flpFolderVisual.Controls.Add(buttonToAdd)
    16. 'Me.ListBox1.Items.Add(di.Name)
    17. Dim i As Integer = 0
    18. Do While di.Parent IsNot Nothing
    19. Dim bta2 As New Button
    20. bta2.Tag = di.Parent.Name
    21. bta2.Text = di.Parent.Name
    22. Dim g_ = Me.CreateGraphics
    23. g_.PageUnit = Drawing.GraphicsUnit.Pixel
    24. Dim sz_ = g.MeasureString(di.Parent.Name, New Font("Segoe UI", 8))
    25. bta2.Size = New Size(sz_.Width + 25, bta2.Height)
    26. bta2.Name = "bta2" & i
    27. bta2.BackColor = SystemColors.Control
    28. bta2.FlatStyle = FlatStyle.Flat
    29. flpFolderVisual.Controls.Add(bta2)
    30. flpFolderVisual.Controls.SetChildIndex(bta2, 0)
    31. 'Me.ListBox1.Items.Add(di.Parent.Name)
    32. di = di.Parent
    33. i += 1
    34. Loop


    Edit:
    Habe das Problem nun gelöst, Sure Code:

    VB.NET-Quellcode

    1. Dim di = New IO.DirectoryInfo(now_path)
    2. flpFolderVisual.Controls.Clear()
    3. Dim buttonToAdd As New Button
    4. buttonToAdd.Tag = di.FullName
    5. buttonToAdd.Name = "bta0"
    6. buttonToAdd.Text = di.Name.ToString.Replace("\", "")
    7. buttonToAdd.Font = New Font("Segoe UI", 8)
    8. buttonToAdd.BackColor = SystemColors.Control
    9. buttonToAdd.FlatStyle = FlatStyle.Flat
    10. AddHandler buttonToAdd.Click, AddressOf btnFolderViewer_Click
    11. Dim g = Me.CreateGraphics
    12. g.PageUnit = Drawing.GraphicsUnit.Pixel
    13. Dim sz = g.MeasureString(di.Name, New Font("Segoe UI", 8))
    14. buttonToAdd.Size = New Size(sz.Width + 25, buttonToAdd.Height)
    15. flpFolderVisual.Controls.Add(buttonToAdd)
    16. AddHandler buttonToAdd.Click, AddressOf btnFolderViewer_Click
    17. flpFolderVisual.Controls.Add(buttonToAdd)
    18. 'Me.ListBox1.Items.Add(di.Name)
    19. Dim i As Integer = 0
    20. Do While di.Parent IsNot Nothing
    21. Dim bta2 As New Button
    22. bta2.Tag = di.Parent.FullName
    23. bta2.Text = di.Parent.Name.Replace("\", "")
    24. AddHandler bta2.Click, AddressOf btnFolderViewer_Click
    25. Dim g_ = Me.CreateGraphics
    26. g_.PageUnit = Drawing.GraphicsUnit.Pixel
    27. Dim sz_ = g.MeasureString(di.Parent.Name, New Font("Segoe UI", 8))
    28. bta2.Size = New Size(sz_.Width + 25, bta2.Height)
    29. bta2.Name = "bta" & i
    30. bta2.BackColor = SystemColors.Control
    31. bta2.FlatStyle = FlatStyle.Flat
    32. flpFolderVisual.Controls.Add(bta2)
    33. flpFolderVisual.Controls.SetChildIndex(bta2, 0)
    34. 'Me.ListBox1.Items.Add(di.Parent.Name)
    35. di = di.Parent
    36. i += 1
    37. Loop


    VB.NET-Quellcode

    1. Private Sub btnFolderViewer_Click(sender As Object, e As EventArgs)
    2. Dim control As Control = CType(sender, Control)
    3. If (Not (control) Is Nothing) Then
    4. RefreshFiles(control.Tag)
    5. End If
    6. End Sub
    Grüße, Matix

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

    Editiere doch bitte den Titel des Threads, damit Leute die nach "Breadcrumb" suchen, diesen Thread auch finden können.
    Kleine Anmerkung, Zeile 20 ist doppelt gemoppelt und Zeile 30 & 31 überflüssig. Die Variable g solltest du Disposen wenn du sie nicht mehr benötigst.

    PS: Anstelle von

    VB.NET-Quellcode

    1. g.MeasureString(di.Parent.Name, New Font("Segoe UI", 8))

    könntest du

    VB.NET-Quellcode

    1. g.MeasureString(di.Parent.Name, buttonToAdd.Font)

    verwenden. Das spart Resourcen und solltest du dich entscheiden die Font zu ändern musst die Änderung nur an einer Stelle vornehmen und nicht an 3.

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

    Da ich gerade nichts zu tun hatte habe ich mal eine möglich Alternative erstellt.

    Spoiler anzeigen

    C#-Quellcode

    1. private void CreateBreadCrumb(DirectoryInfo path)
    2. {
    3. if (!path.Exists)
    4. throw new ArgumentException("");
    5. string[] pathParts = path.FullName.Split(Path.DirectorySeparatorChar);
    6. if (pathParts == null || pathParts.Length <= 0)
    7. throw new Exception("");
    8. pathParts[0] += Path.DirectorySeparatorChar; // Fügt dem Laufwerksbuchstaben einen Backslash an
    9. string curDir = "";
    10. for (int i = 0; i < pathParts.Length; i++) {
    11. curDir = Path.Combine(curDir, pathParts[i]);
    12. flowLayoutPanel_buttonContainer.Controls.Add(CreateButton("btn_" + i.ToString(), pathParts[i], curDir));
    13. }
    14. }
    15. private Button CreateButton(string name, string text, string tag)
    16. {
    17. Button btn = new Button {
    18. Font = new Font("Segoe UI", 8),
    19. Name = name,
    20. Text = text,
    21. Tag = tag,
    22. AutoSize = true,
    23. AutoSizeMode = AutoSizeMode.GrowAndShrink,
    24. //btn.Padding = new Padding(0, 0, 25, 0);
    25. Margin = new Padding(0, 0, 0, 0)
    26. };
    27. //btn.Click += BreadCrumb_Button_Click;
    28. return btn;
    29. }

    Fakiz schrieb:

    C#-Quellcode

    1. if (pathParts == null || pathParts.Length <= 0)
    keine dieser beiden Teil-Bedingungen kann jemals auftreten.

    Und je nach Kontext kann auch

    Fakiz schrieb:

    C#-Quellcode

    1. if (!path.Exists)
    niemals auftreten.

    Und ich würde den Font nur einmal, static, erstellen, nicht für jeden Button einen eigenen.
    Weil Font ist eine disposable Klasse.



    Ein Problem für den TE wird noch werden, den Code nach vb zu übersetzen.
    Weil auch ein ÜbersetzungsTool wird den Namenskonflikt zwischen path und Path, der sich in vb ergibt, nicht auflösen können.

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

    Das ist deine einzige Chance.
    Wenn du nicht nachdrücklich interessiert bist, deinen CodeStil kontinuierlich zu verbessern, wirst du kaum jemals eine brauchbare Software entwickeln können.

    Ich denke, an den grossen Unterschieden zw. deim Ansatz und dem von Fakiz kannste eine ganze Menge lernen.
    ZB. wie Fakiz (anders als RodFromGermany) garnet mit DirectoryInfo arbeitet, sondern einfach mit String.Split() - das erweist sich als viel einfacher und effizienter.
    Ich find sowas interessant, und glaub auch nützlich, diese Unterschiede zu erkennen und zu verstehen.

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

    ErfinderDesRades schrieb:

    keine dieser beiden Teil-Bedingungen kann jemals auftreten.

    Man lernt nie aus.

    Bei der Anmerkunk zu if (!path.Exists) glaube ich kann ich dir nicht ganz folgen, in welchem Kontext würde dieser Fall nicht auftreten?

    ErfinderDesRades schrieb:

    Ein Problem für den TE wird noch werden, den Code nach vb zu übersetzen.

    Wusste ich auch nicht.




    Eine überarbeitete Version die sich problemlos Konvertieren lassen sollte.
    Spoiler anzeigen

    C#-Quellcode

    1. private void CreateBreadCrumb(string curPath)
    2. {
    3. if (!Directory.Exists(curPath))
    4. throw new ArgumentException("");
    5. string[] pathParts = curPath.Split(Path.DirectorySeparatorChar);
    6. if (pathParts.Length < 2)
    7. throw new Exception("");
    8. pathParts[0] += Path.DirectorySeparatorChar; // Fügt dem Laufwerksbuchstaben einen Backslash an
    9. string curDir = "";
    10. using (Font f = new Font("Segoe UI", 8))
    11. for (int i = 0; i < pathParts.Length; i++) {
    12. curDir = Path.Combine(curDir, pathParts[i]);
    13. flowLayoutPanel_buttonContainer.Controls.Add(CreateButton("btn_" + i.ToString(), pathParts[i], curDir, f));
    14. }
    15. }
    16. private Button CreateButton(string name, string text, string tag, Font font)
    17. {
    18. Button btn = new Button {
    19. Font = font,
    20. Name = name,
    21. Text = text,
    22. Tag = tag,
    23. AutoSize = true,
    24. AutoSizeMode = AutoSizeMode.GrowAndShrink,
    25. //btn.Padding = new Padding(0, 0, 25, 0);
    26. Margin = new Padding(0, 0, 0, 0)
    27. };
    28. //btn.Click += BreadCrumb_Button_Click;
    29. return btn;
    30. }

    Fakiz schrieb:

    keine dieser beiden Teil-Bedingungen kann jemals auftreten.
    naja, wenn du einen String splittest, so erhälst du immer ein String-Array, also niemals null.
    Und nur wenn der String leer ist, kann pathParts.Length <= 0 zutreffen - ein String mit was drin splittet immer zu einem Array mit mindestens einem element - ist doch logisch, odr?

    Mit "Kontext" meinte ich, dass der TE den Directory-Pfad womöglich/vermutlich direkt aus einem FolderBrowserDialog erhält, oder aus einer Ordner-Suche.
    In solchem Kontext kann nicht auftreten, dass das Directory nicht existiert.



    Zum code

    C#-Quellcode

    1. if (pathParts.Length < 2)
    Warum nu eine Exception schmeissen, wenn der Pfad nur ein Segment hat? ZB C: wäre doch ein gültiger Pfad, und würde auch problemlos verarbeitet, odr?

    C#-Quellcode

    1. using (Font f = new Font("Segoe UI", 8))
    Das wird schiefgehen, weil der Button braucht den Font doch.
    Wenn der aber gleich wieder disposed ist kann der Button seinen text nicht zeichnen.
    wie gesagt: Mein Vorschlag war: static
    Ich finde es echt krass, weil ich im Internet gae nichts dazu gefunden habe. Naja ich mache schon professionelle software, aber seien wir ehrlich, wie wichtig ist das ganze Binder Zeit 0,001 Millisekunden und wenn wir gleich bei Zeit sind, in meinen Explorer werden die Datei Typen aufgelistet mit dem jeweiligen Icons, allerdings dauert das bei einem Maß von. 140 Dateien ganz schön lange und das Programm scmiet dann auch manchmal ab, gibt es da was?
    Grüße, Matix

    Matix Media schrieb:

    Naja ich mache schon professionelle software, aber seien wir ehrlich

    Hoffentlich meinst du nicht das was auf deiner Website veröffentlicht ist. (Soll nicht böse gemeint sein, ich mache auch keine "professionelle Software" genau wie ca. 95% dieses Forums meiner Meinung nach.)

    Anderes:
    Was ist "Binder Zeit 0,001 Millisekunden"?
    Wäre toll wenn du wenigstens deinen Text den du abschickst noch einmal oder zweimal durchließt damit sichergestellt ist das man das auch lesen und verstehen kann.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen