Toolstrip - Items speichern

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

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

    Toolstrip - Items speichern

    Ich würde gerne Items in einer Datei speichern und zwar TOOLSTRIPBUTTONS und TOOLSTRIPDROPDOWNBUTTONS.

    Die mache ich so:

    VB.NET-Quellcode

    1. Dim path As String = "C:\Datei.ini"
    2. Dim lines As New List(Of String)
    3. 'DropDownButtons
    4. Try
    5. For Each item As System.Windows.Forms.ToolStripDropDownButton In ts.Items
    6. If Not item.Tag = "" Then
    7. lines.Add("◙" & item.Text & "◘" & item.Tag)
    8. End If
    9. Next
    10. Catch : End Try
    11. 'Buttons
    12. Try
    13. For Each item As System.Windows.Forms.ToolStripButton In ts.Items
    14. If Not item.Tag = "" Then
    15. lines.Add(item.Text & "◘" & item.Tag)
    16. End If
    17. Next
    18. Catch : End Try
    19. IO.File.WriteAllLines(path, lines)




    Nun ist aber mein Problem, dass nur die normalen Buttons gespeichert werden, aber auch nur bis man einen DropDownButton erstellt, weil danach werden selbst nicht mehr die normalen Buttons gespeichert. Also:
    Item1 hinzugefügt - Gespeichert; Item2 hinzugefügt - Gespeichert; DropDownItem1 hinzugefügt - Nicht Gespeichert; Item3 hinzugefügt - Nicht gespeichert


    Wie kriege ich es hin, dass der Fehler ab dem hinzufügen eines Dropdownbuttons nicht mehr auftritt?

    kingsunil2000 schrieb:

    Keine Idee?
    Machst Du Option Strict On und die Try / Catch weg.
    Dann wird Dir vom studio geholfen. ;)
    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!
    Bei der Zeile

    VB.NET-Quellcode

    1. For Each item As System.Windows.Forms.ToolStripDropDownButton In ts.Items
    zeigt er mir an, dass System.Windows.Forms.ToolStripButton nicht in Typ System.Windows.Forms.ToolStripDropDownButton umgewandelt werden kann.

    Außerdem wird mir bei Option Strict on nur item.tag unterstrichen

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

    kingsunil2000 schrieb:

    umgewandelt
    Jou.
    Da musst Du den richtigen Cast machen.
    Teste, was rauskommen soll, dann brauchst Du nur eine Schleife:

    VB.NET-Quellcode

    1. If TypeOf Ctrl Is Button Then
    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!

    VB.NET-Quellcode

    1. 'DropDownButtons
    2. For Each item As System.Windows.Forms.ToolStripDropDownButton In ToolStrip1.Items
    3. If Not item.Tag = "" Then
    4. lines.Add("◙" & item.Text & "◘" & item.Tag)
    5. End If
    6. Next
    7. 'Buttons
    8. For Each item As System.Windows.Forms.ToolStripButton In ToolStrip1.Items
    9. If Not item.Tag = "" Then
    10. lines.Add(item.Text & "◘" & item.Tag)
    11. End If
    12. Next
    13. IO.File.WriteAllLines(path, lines)


    Item.tag ist immer unterstrichen
    Bei mir sollen items ohne tag nicht gespeichert werden.

    Ich habs. Hier meine Lösung:


    VB.NET-Quellcode

    1. Dim path As String = "C:\Datei.ini"
    2. Dim lines As New List(Of String)
    3. For Each item As System.Windows.Forms.ToolStripItem In toolstrip.Items
    4. If Not item.Tag = "" Then
    5. If TypeOf (item) Is ToolStripButton Then
    6. lines.Add(item.Text & "◘" & item.Tag)
    7. ElseIf TypeOf (item) Is ToolStripDropDownButton Then
    8. lines.Add("◙" & item.Text & "◘" & item.Tag)
    9. End If
    10. End If
    11. Next
    12. IO.File.WriteAllLines(path, lines)

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

    VB.NET-Quellcode

    1. 'ToolStripItem allgemein - deckt sowohl ToolStripDropDownButton als auch ToolStripButton ab
    2. For Each item In ToolStrip1.Items.OfType(Of ToolStripItem).Where(Function(itm) itm.Tag IsNot Nothing)
    3. lines.Add("◙" & item.Text & "◘" & item.Tag.ToString)
    4. Next
    5. IO.File.WriteAllLines(path, lines)
    Beachte das bei .OfType() ToolStripItem angegeben ist, die Basisklasse von beidem: sowohl ToolStripDropDownButton als auch ToolStripButton. Daher brauchts nur eine Schleife.
    Beachte auch die nun auch angewandte .Where - Linq-Extension, die die Items ohne Tag gleich weg-filtert.
    Jo, so geht OOP :D

    Aber vlt. wolltest du die beiden Typen ja bewusst unterscheiden, dann brauchts halt doch beide Schleifen:

    VB.NET-Quellcode

    1. 'DropDownButtons
    2. For Each item In ToolStrip1.Items.OfType(Of ToolStripDropDownButton).Where(Function(itm) itm.Tag IsNot Nothing)
    3. lines.Add("◙" & item.Text & "◘" & item.Tag.ToString)
    4. Next
    5. 'Buttons
    6. For Each item In ToolStrip1.Items.OfType(Of ToolStripButton).Where(Function(itm) itm.Tag IsNot Nothing)
    7. lines.Add(item.Text & "◘" & item.Tag)
    8. Next
    9. IO.File.WriteAllLines(path, lines)


    Der Punkt ist, dass Item.Tag einen anderen Datentyp als String hat - das ist die Info, die dir dank Option Strict On nun gegeben wird.
    In OOP ists von fundamentaler Bedeutung, jederzeit zu wissen, welchen Datentyp die Objekte haben, mit denen man arbeitet.
    Vb.Net in seiner Grundeinstellung verbirgt diese Information leider, sodass man vb.net in Grundeinstellung als OOP-Sprache überhaupt nicht ernst nehmen kann.
    Also korrigiere diese Einstellungen (es sind 2 Grundeinstellungen, durch die vb.net-Progger verblödet werden) - am besten grundsätzlich: Visual Studio - Empfohlene Einstellungen

    Kannste gleich eine Übung dran anschliessen: Finde heraus, welchen Datentyp itm.Tag wirklich hat.
    Video-Tut: Welchen Datentyp hat das Objekt?

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

    @ErfinderDesRades Jou.

    kingsunil2000 schrieb:

    VB.NET-Quellcode

    1. If Not item.Tag = "" Then
    Hältst Du nix von

    RodFromGermany schrieb:

    Option Strict On
    :?:
    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!