Kontextmenü mit Untermenü per Code erstellen

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

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Achilleus.

    Kontextmenü mit Untermenü per Code erstellen

    Hallo Leute,

    ich komme echt nicht weiter. ?(

    Ich habe einen String, den ich splitten und daraus ein Kontextmenü erstellen möchte. Dabei gibt es nur ein Hauptmenü und ggf. dazu Untermenüs.

    Quellcode

    1. dim s as String="ESt.-Berechnung|ESt.-Berechnung EM|ESt.-Berechnung EF;ESt.-Sendeprotokoll|ESt.-Sendeprotokoll EM|ESt.-Sendeprotokoll EF;ESt.-Formulare|ESt-Formulare EM|ESt.-Forumlare EF"
    2. Daraus soll jetzt folgendes Kontextmenü erstellt werden.
    3. ESt.-Berechnung
    4. - ESt.-Berechnung EM
    5. - ESt.-Berechnung EF
    6. ESt.-Sendeprotokoll
    7. - ESt. Sendeprotokoll EM
    8. - ESt.-Sendeprotokoll EF
    9. ESt.-Formulare
    10. - ESt.-Formulare EM
    11. - ESt.-Formulare EF


    Leider wird bei mir aber immer nur leere Menü-Items erstellt und im letzten werden dann alle Untermenüs eingefügt.
    Kann mir einer vielleicht helfen, wo hier mein Gedankenfehler ist?

    Hier mein bisheriger Ansatz:

    VB.NET-Quellcode

    1. Private Sub KryptonDropButton_DropDown(sender As Object, e As ContextPositionMenuArgs)
    2. 10: Dim btn As New KryptonDropButton
    3. 20: btn = CType(sender, KryptonDropButton)
    4. 30: Dim _FileProperty As FileProperty
    5. 40: Dim mnuitem As ToolStripItem
    6. 50: Dim mnuSubItem As New ToolStripMenuItem
    7. 60: _FileProperty = DirectCast(btn.Tag, FileProperty)
    8. 70: Dim t() As String = _FileProperty.Contextmenue.Split(";"c)
    9. 80: ContextMenuStripKrypton.Items.Clear()
    10. 90: For i As Integer = 0 To t.Count - 1
    11. 100: Dim c() As String = t(i).Split("|"c)
    12. 110: If c(0).ToString = "---" Then
    13. 120: ContextMenuStripKrypton.Items.Add(New ToolStripSeparator)
    14. 130: Else
    15. 140: If c.Length <= 1 Then
    16. 150: mnuitem = ContextMenuStripKrypton.Items.Add(c(0).ToString, ImlProfile.Images(0))
    17. 160: mnuitem.Tag = _FileProperty
    18. 170: AddHandler(mnuitem.Click), AddressOf ToolStripMenuItem_Click
    19. 180: Else
    20. mnuitem = ContextMenuStripKrypton.Items.Add("")
    21. 200: mnuSubItem.Text = c(0)
    22. mnuSubItem.Image = ImlProfile.Images(0)
    23. 210: mnuSubItem.Tag = _FileProperty
    24. 220: AddHandler(mnuSubItem.Click), AddressOf ToolStripMenuItem_Click
    25. 190: For q = 1 To c.Length - 1
    26. 230: If c(q).ToString = "---" Then
    27. 240: mnuSubItem.DropDownItems.Add(New ToolStripSeparator)
    28. 250: ContextMenuStripKrypton.Items.Add(mnuSubItem)
    29. 260: Else
    30. 270: mnuSubItem.DropDownItems.Add(c(q), ImlProfile.Images(0))
    31. 290: ContextMenuStripKrypton.Items.Add(mnuSubItem)
    32. mnuSubItem.DropDownItems(mnuSubItem.DropDownItems.Count - 1).Tag = _FileProperty
    33. AddHandler mnuSubItem.DropDownItems(mnuSubItem.DropDownItems.Count - 1).Click, AddressOf ToolStripMenuItem_Click
    34. 300: End If
    35. 310: Next
    36. 320: End If
    37. 330: End If
    38. 340: Next
    39. End Sub


    Vielen Dank im Voraus.

    Gruß Achilleus

    Kontextmenü

    In meinem Code war ein Fehler enthalten:

    VB.NET-Quellcode

    1. 180: Else
    2. 190: mnuitem = ContextMenuStripKrypton.Items.Add("")
    3. 200: mnuitem.Text = c(0)
    4. 210: mnuitem.Image = ImlProfile.Images(0)
    5. 220: mnuitem.Tag = _FileProperty


    Aber jetzt sieht das Kontextmenü wie folgt aus:

    Irgendwo ist bei mir der Wurm drinne.
    Bilder
    • Screenshot 2023-01-14 202000.png

      13,95 kB, 449×160, 10 mal angesehen
    KryptonWas? Naja, dauert immer, bis man sowas zum Laufen bekommt, und manche habe darauf keinen Bock.
    Haben die zusätzlichen in-Code-Zeilenangaben irgendeine Bedeutung? Ich dachte, dass das ein Relikt von vor 30 Jahren ist.
    --- ist ja in Deinem Text nicht vorhanden. Ist wahrscheinlich Absicht.

    Forenzeile#20 bzw. DeineCodezeile#140: Was willst Du uns damit sagen?

    Ich frag mich manchmal wirklich, warum man solche komplizierten Variablennamen nimmt? Damit macht man sich nur das Leben schwer.
    Einfach mal das Ziel im Designer nachbauen und das Codeergebnis in der FormX.Designer.vb anschauen.
    Nuja, auf jeden Fall muss mnuItem ein ToolStripMenuItem sein. Dem werden per DropDownItems.Add SubItems angefügt, fertig. Dem ContextMenuStrip wird sonst nix hinzugefügt.

    Abgewandelter, funktionierender Code:

    VB.NET-Quellcode

    1. Dim mnuitem As ToolStripMenuItem
    2. Dim mnuSubItem As New ToolStripMenuItem
    3. Dim t() As String = "ESt.-Berechnung|ESt.-Berechnung EM|ESt.-Berechnung EF;ESt.-Sendeprotokoll|ESt.-Sendeprotokoll EM|ESt.-Sendeprotokoll EF;ESt.-Formulare|ESt-Formulare EM|ESt.-Forumlare EF".Split(";"c)
    4. ContextMenuStrip1.Items.Clear()
    5. For i As Integer = 0 To t.Count - 1
    6. Dim c() As String = t(i).Split("|"c)
    7. If c(0).ToString = "---" Then
    8. ContextMenuStrip1.Items.Add(New ToolStripSeparator)
    9. Else
    10. If c.Length <= 1 Then
    11. mnuitem = New ToolStripMenuItem With {.Text = c(0)}
    12. ContextMenuStrip1.Items.Add(mnuitem)
    13. Else
    14. mnuitem = New ToolStripMenuItem With {.Text = c(0)}
    15. ContextMenuStrip1.Items.Add(mnuitem)
    16. mnuitem.Text = c(0)
    17. For q = 1 To c.Length - 1
    18. If c(q).ToString = "---" Then
    19. mnuitem.DropDownItems.Add(New ToolStripSeparator)
    20. Else
    21. mnuitem.DropDownItems.Add(c(q))
    22. End If
    23. Next
    24. End If
    25. End If
    26. Next

    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.
    @Achilleus Erstell Dir ein solches Menü im Designer und sieh Dir den Designercode an in der FormX.Designer.vb.
    Ansonsten steppe Deinen Code mal durch und lerne zu debuggen:
    Ist das, was da passiert, das, was da passieren soll?
    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!
    Hallo VaporiZed,

    vielen Dank für deine Hilfe.

    Zu deinen Anmerkungen:

    Programmbeschreibung (nur für den Hausgebrauch):

    Ich verwende in einem einzigen Formular die KryptonSuite, da es hier ein tollen DropDownButton gibt. Damit kann ich neben der eigentlichen Button-Funktion auch noch ein normales Kontextmenü aufrufen.
    Die Button werden onfly in einem Flowpanel erstellt, dabei werden die Bezeichnungen verwendet, um gescannte Dateien umzubennen und zu verschieben.

    Die Fileproperty dient dazu, zu den Button Zusatzangaben zu hinterlegen, wie mit den Dateien speziell zu verfahren ist.

    VB.NET-Quellcode

    1. Public Structure FileProperty
    2. Public Counter As Boolean 'Datei soll automatisch hochgezählt und nicht überschrieben werden
    3. Public IsMainTab As Boolean 'Ablage nur im ersten Reiter erlaubt
    4. Public Contextmenue As String '"ESt.-Berechnung|ESt.-Berechnung EM|ESt.-Berechnung EF;ESt.-Sendeprotokoll|ESt.-Sendeprotokoll EM|ESt.-Sendeprotokoll EF;ESt.-Formulare|ESt-Formulare EM|ESt.-Forumlare EF"
    5. End Structure



    zu Zeile 20:

    Ist ein Wert in FileProperty.Contextmeu enthalten, wird statt eines normalen Button ein DropDownbutten eingefügt. Bei Auswahl des DropDownbefehl, wird diese Property ausgelesen und ein Kontextmenü erstellt. Aus diesem Grunde habe ich ein Verweis auf den aktuellen Button gesetzt und die Fileproperty.Contextmenue ausgelesen. Eventuell könnte das man auch einfacher machen, aber ich bin nur Hobbyprogrammierer, da muss ich den Code auch später noch verstehen.

    Nach meinem aktuellen Stand soll es erst einmal für die Kontextmenüs keine eigenen FileProperty-Anweisungen geben, sondern nur ein Standardverhalten erhalten.

    zu Zeile 140:

    Diese Anweisung ist dafür vorgesehen, dass es ja auch nur Hauptmenüs gibt ohne weitere Untermenüs.

    zur Anweisung "---"

    Diese Anweisung soll einfach nur eine Textanweisung sein, dass ein ​ToolStripSeparator eingefügt werden soll. Das hätte auch ein x-beliebiges Zeichen sein können.

    Mit den Variablennamen für c() u. t() gebe ich dir uneingeschränkt recht. Hier hätte ich in der Tat etwas mehr sprechenden Namen vergeben soll. Werde ich auch gleich umsetzen.

    Programmablauf:

    Es werden Dateien in einem Scanner-Ordner abgelegt.
    Wird jetzt die Datei nur selektiert, kann mit den Buttons/ Kontextmenü diese Datei vor der Ablage noch umbenannt werden. Anschließend kann ich die abzulegenden Dateien checken, und diese werden im Listview "Merge Dateien" abgelegt. Im LVW "Merge Dateien" kann nachträglich die Reihenfolge der Dateien verändern. Ferner kann ich mit dem Button kann ich zusätzlich bestimmen, ob beim mergen der PDF-Dateien die Zieldatei Lesezeichen erhalten sollen. Standardmäßig werden für die Dateien mit dem Namen "doc..." keine Lesezeichen eingefügt. Nur Dateien mit Realnamen sollen grundsätzlich ein Lesezeichen erhalten, aber das kann ich halt auch ausschalten. Das mergen von PDF mache immer mit iText; nur bei Lesezeichen verwende ich ein erstellten Job mit den XChangeViewer-Tools von Tracker.

    Beim verschieben kommen jetzt halt die FileProperty ins Spiel. Hier wird jetzt vor dem Verschieben ausgelesen, ob die Dateien nur im MainTab verschoben werden dürfen (Steuererklärungen) oder auch, ob die Dateien mit einer anderen bereits abgelegten Datei nachträglich noch verschmolzen werden soll.



    Dieses Vorgehen reicht für meine Bedürfnisse vollkommen aus und funktioniert auch tadellos.

    Ich glaube das sollte jetzt reichen

    Nochmals vielen Dank für deine Hilfe. Jetzt läuft alles tadellos.

    Gruß Achilleus
    Bilder
    • Screenshot 2023-01-15 084419.png

      130,68 kB, 1.502×684, 8 mal angesehen
    • Screenshot 2023-01-15 084718.png

      894 Byte, 31×36, 63 mal angesehen
    • Screenshot 2023-01-15 085442.png

      9,08 kB, 419×107, 62 mal angesehen
    Hallo Leute,

    ich habe leider immer noch ein Problem.

    Wie bekomme ich es hin, dass jedes MenüItem (Haupt- u. Untermenü) ausgeführt wird.
    Für das Hauptmenü habe ich es hinbekommen, aber bei den Untermenüs wird gar nichts ausgeführt. Ich vermute es liegt am fehlenden Eventhandler?


    VB.NET-Quellcode

    1. Private Sub ContextMenuStripKrypton_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs) Handles ContextMenuStripKrypton.ItemClicked
    2. Dim _FileProperty As FileProperty = Nothing
    3. Call MoveFiles(e.ClickedItem.Text.Trim, _FileProperty)
    4. ContextMenuStripKrypton.Close()
    5. End Sub


    Kann mir vielleicht jemand noch einmal helfen, wie ich im Code von @VaporiZed für die Untermenüs das auch noch hinbekomme?

    Vielen Dank.

    Gruß Achilleus
    @Achilleus Was passiert in Zeile #3 Deines Codes mit dem letzten Parameter := Nothing?
    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!
    @RodFromGermany:

    Es wird einfach kein Event für die Untermenüs gefeuert. ;(

    __________________________________________________


    Nachtrag:
    Ich habe jetzt die Lösung gefunden.

    Ich musste lediglich noch zwei Zeilen Code hinzufügen:

    VB.NET-Quellcode

    1. 260: mnuSubItem = DirectCast(mnuitem.DropDown.Items(mnuitem.DropDown.Items.Count - 1), ToolStripMenuItem)
    2. 270: AddHandler mnuSubItem.Click, AddressOf ToolStripMenuItem_Click


    Jetzt funktioniert alles wie es soll. <3

    Hier noch einmal meine vollständige Lösung zum Hinzufügen eines Kontextmenüs mit Submenüs:

    VB.NET-Quellcode

    1. Private Sub KryptonDropButton_DropDown(sender As Object, e As ContextPositionMenuArgs)
    2. 10: Dim btn As New KryptonDropButton
    3. 20: btn = CType(sender, KryptonDropButton)
    4. 30: Dim _FileProperty As FileProperty
    5. 40: Dim mnuitem As ToolStripMenuItem
    6. 50: Dim mnuSubItem As New ToolStripMenuItem
    7. 60: _FileProperty = DirectCast(btn.Tag, FileProperty)
    8. 70: Dim arrMenueItems() As String = _FileProperty.Contextmenue.Split(";"c)
    9. 80: ContextMenuStripKrypton.Items.Clear()
    10. 90: For i As Integer = 0 To arrMenueItems.Count - 1
    11. 100: Dim arrSubMenuItems() As String = arrMenueItems(i).Split("|"c) 'arrSubMenuItems(0) = Hauptmenü
    12. 110: If arrSubMenuItems(0).ToString = "---" Then
    13. 120: ContextMenuStripKrypton.Items.Add(New ToolStripSeparator)
    14. 130: Else
    15. 140: If arrSubMenuItems.Length <= 1 Then
    16. 150: mnuitem = New ToolStripMenuItem With {.Text = arrSubMenuItems(0), .Image = ImlProfile.Images(0)}
    17. 160: ContextMenuStripKrypton.Items.Add(mnuitem)
    18. 170: Else
    19. 180: mnuitem = New ToolStripMenuItem With {.Text = arrSubMenuItems(0), .Image = ImlProfile.Images(0)}
    20. 190: ContextMenuStripKrypton.Items.Add(mnuitem)
    21. 200: mnuitem.Text = arrSubMenuItems(0)
    22. 210: For q = 1 To arrSubMenuItems.Length - 1
    23. 220: If arrSubMenuItems(q).ToString = "---" Then
    24. 230: mnuitem.DropDownItems.Add(New ToolStripSeparator)
    25. 240: Else
    26. 250: mnuitem.DropDownItems.Add(arrSubMenuItems(q), ImlProfile.Images(0))
    27. 260: mnuSubItem = DirectCast(mnuitem.DropDown.Items(mnuitem.DropDown.Items.Count - 1), ToolStripMenuItem)
    28. 270: AddHandler mnuSubItem.Click, AddressOf ToolStripMenuItem_Click
    29. 280: End If
    30. 290: Next
    31. 300: End If
    32. 310: End If
    33. 320: Next
    34. End Sub


    Vielen Dank an alle für die Unterstützung. :thumbsup:

    Gruß Achilleus

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Achilleus“ ()

    Achilleus schrieb:

    Es wird einfach kein Event für die Untermenüs gefeuert.
    Bei diesem Code:

    VB.NET-Quellcode

    1. Call MoveFiles(e.ClickedItem.Text.Trim, _FileProperty)
    erwarte ich auch nicht, dass da ein Event gefeuert 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!

    Achilleus schrieb:

    Verstehe die Aussage nicht.
    Das war eine Erläuterung zu einer wieder mal von Dir nicht beantworteten Frage.
    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 @RodFromGermany,

    weil dieser Funktionsaufruf nichts mit dem fehlenden Event zu tun hatte.
    Aber hier die Funktion:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub MoveFiles(NewFileName As String, _FileProperty As FileProperty)
    2. 10: Dim amPDF As New PDFTools
    3. 20: Dim blnStErkl As Boolean = False
    4. 30: Dim _Weblink As String = ""
    5. 40: Dim lSource As New List(Of String)
    6. 50: If Me.ToolStripDropDownButton2.Visible = False And _FileProperty.IsMainTab = False AndAlso LvwFile.CheckedItems.Count > 0 Then
    7. 60: MessageBox.Show("In das Stammverzeichnis können keine Dateien " & Environment.NewLine _
    8. & "verschoben werden." & Environment.NewLine _
    9. & "" & Environment.NewLine _
    10. & "Wählen Sie bitte erst ein Jahresregister aus.", "Datei verschieben", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    11. 70: Exit Sub
    12. 80: End If
    13. 90: Dim sTargetFile As String = ""
    14. 100: Dim sTargetPath As String = Me.ToolStripDropDownButton1.Text
    15. 110: Dim sSourceFile As String = "", sTmpFile As String = ""
    16. '140: Dim tmpPathPDFTools = IO.Path.Combine(My.Computer.FileSystem.SpecialDirectories.Temp, "PDFTools\Compress")
    17. 120: Dim _Source As New List(Of String)
    18. 130: Dim sSourceName As String = ""
    19. 140: amPDF.TmpPathSource = IO.Path.Combine(My.Computer.FileSystem.SpecialDirectories.Temp, "PDFTools\Compress")
    20. 150: amPDF.TmpPathTarget = IO.Path.Combine(My.Computer.FileSystem.SpecialDirectories.Temp, "PDFTools\Target")
    21. 160: If IO.Directory.Exists(amPDF.TmpPathSource) = True Then
    22. 170: amPDF.CleanPath(amPDF.TmpPathSource)
    23. 180: Else
    24. 190: IO.Directory.CreateDirectory(amPDF.TmpPathSource)
    25. 200: End If
    26. 210: If IO.Directory.Exists(amPDF.TmpPathTarget) = True Then
    27. 220: amPDF.CleanPath(amPDF.TmpPathTarget)
    28. 230: Else
    29. 240: IO.Directory.CreateDirectory(amPDF.TmpPathTarget)
    30. 250: End If
    31. 260: If LvwFile.CheckedItems.Count = 0 Then
    32. 270: FSW1.EnableRaisingEvents = False 'keine Reaktion auf Änderung
    33. 290: sTargetPath = TxtPath.Text
    34. 300: Try
    35. 310: sSourceFile = LvwFile.SelectedItems(0).Text
    36. 320: Catch
    37. 330: MessageBox.Show("Bitte selektieren Sie die Datei zum umbennen aus.", "keine Datei selektiert", MessageBoxButtons.OK, MessageBoxIcon.Information)
    38. 340: Exit Sub
    39. 350: End Try
    40. 280: Call Unload_Webbrowser(False)
    41. 360: NewFileName = NewFileName & ".pdf"
    42. 370: _Weblink = IO.Path.Combine(sTargetPath, NewFileName)
    43. 380: If IO.File.Exists(_Weblink) Then 'Doppelte Dateien
    44. 390: If MessageBox.Show("Möchten Sie die Dateien zusammenführen?", "Doppelte Datei", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
    45. 400: lSource.Add(_Weblink)
    46. 410: For Each ItemX As ListViewItem In LvwFile.SelectedItems
    47. 420: sSourceFile = IO.Path.Combine(TxtPath.Text, ItemX.Text)
    48. 430: If _Weblink.Contains(sSourceFile) = False Then lSource.Add(sSourceFile)
    49. 440: Next
    50. 450: sSourceFile = amPDF.MergePDFFiles(lSource, IO.Path.Combine(amPDF.TmpPathTarget, NewFileName))
    51. 'Lösche alle Dateien aus lSource
    52. 460: lSource.ForEach(Sub(s) My.Computer.FileSystem.DeleteFile(s, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin))
    53. 470: System.IO.File.Copy(sSourceFile, IO.Path.Combine(TxtPath.Text, NewFileName))
    54. 480: Else
    55. 490: Exit Sub
    56. 500: End If
    57. 510: Else 'Mehrfachselektion
    58. 520: If LvwFile.SelectedItems.Count > 1 Then
    59. 530: For Each ItemX As ListViewItem In LvwFile.SelectedItems
    60. 540: lSource.Add(IO.Path.Combine(TxtPath.Text, ItemX.Text))
    61. 550: Next
    62. 560: _Weblink = amPDF.MergePDFFiles(lSource, IO.Path.Combine(amPDF.TmpPathTarget, NewFileName))
    63. 'Lösche alle Dateien aus lSource
    64. 570: lSource.ForEach(Sub(s) My.Computer.FileSystem.DeleteFile(s, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin))
    65. 580: System.IO.File.Copy(_Weblink, IO.Path.Combine(TxtPath.Text, NewFileName))
    66. 590: Else 'Einfachselektion
    67. 600: My.Computer.FileSystem.RenameFile(IO.Path.Combine(sTargetPath, sSourceFile), NewFileName)
    68. 610: End If
    69. 620: End If
    70. 630: WebBrowser1.Navigate(_Weblink)
    71. 640: Call RefreshToolStripMenuItem.PerformClick()
    72. 650: FSW1.EnableRaisingEvents = True 'keine Reaktion auf Änderung
    73. 660: Exit Sub
    74. 670: End If
    75. 680: If LvwMerge.CheckedItems.Count = 0 Then Exit Sub
    76. 690: If NewFileName = "manuell" Then
    77. 700: sSourceName = InputBox("Geben Sie bitte einen Dateinahmen ein.", "Dateiname", LvwMerge.Items(0).Text)
    78. 710: If sSourceName = "" Then
    79. 720: Exit Sub
    80. 730: Else
    81. 740: If IO.Path.GetExtension(sSourceName) = Path.GetExtension(LvwMerge.Items(0).Text) Then sSourceName = IO.Path.GetFileNameWithoutExtension(sSourceName)
    82. 750: End If
    83. 760: ElseIf NewFileName = "Steuererklärung" Then
    84. 770: Dim iMdNr As Integer = 0
    85. 780: Dim iJahr As Integer = My.Settings.Steuerjahr
    86. 790: Dim _t As String = Me.ToolStripDropDownButton1.Text
    87. 800: iMdNr = Convert.ToInt32(oFomrMandanteninfo._GetMdNr)
    88. 810: blnStErkl = True
    89. 'tmpPathPDFTools = IO.Path.Combine(My.Computer.FileSystem.SpecialDirectories.Temp, "PDFTools\Source")
    90. 820: With frmAblageStErkl
    91. 830: .TxtMdNr.Text = iMdNr.ToString
    92. 840: .TxtJahr.Text = iJahr.ToString
    93. 850: .ShowDialog()
    94. 860: End With
    95. 870: If frmAblageStErkl.sResult = "" Then
    96. 880: frmAblageStErkl.Close()
    97. 890: Exit Sub
    98. 900: End If
    99. 910: If iMdNr <> Convert.ToInt32(frmAblageStErkl.TxtMdNr.Text) Then
    100. 920: iMdNr = Convert.ToInt32(frmAblageStErkl.TxtMdNr.Text)
    101. 930: sTargetPath = sTargetPath.Substring(0, sTargetPath.Length - 4) & iMdNr.ToString
    102. 940: End If
    103. 950: Dim dRow As DataRow = GetDataRow(iMdNr, EnDatabase.Mandanten, "SEQ")
    104. 960: Dim blnGeldwaesche As Boolean = Convert.ToBoolean(dRow.Item("Geldwaesche"))
    105. 970: Dim blnEinzugFA As Boolean = Convert.ToBoolean(dRow.Item("EinzugFA"))
    106. 980: Dim blnFADatenabruf As Boolean = Convert.ToBoolean(dRow.Item("FADatenabruf"))
    107. 990: Dim blnOnWork As Boolean = Convert.ToBoolean(dRow.Item("Selektion"))
    108. 1000: If blnOnWork = True Then
    109. 1010: Select Case MessageBox.Show("Für den Mandanten ist das Kennzeichen ""In Arbeit"" gesetzt." & Environment.NewLine _
    110. & "" & Environment.NewLine _
    111. & "Möchten Sie das Kennzeichen jetzt löschen?", "Kennzeichen ""In Arbeit"" löschen", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    112. Case DialogResult.Yes
    113. 1020: blnOnWork = False
    114. 1030: Call SaveInArbeit(iMdNr, blnOnWork, blnGeldwaesche, blnFADatenabruf)
    115. 1040: Case DialogResult.No
    116. 1050: End Select
    117. 1060: End If
    118. 1070: iJahr = Convert.ToInt32(frmAblageStErkl.TxtJahr.Text)
    119. 1080: My.Settings.Steuerjahr = iJahr
    120. 1090: My.Settings.Save()
    121. 1100: sSourceName = frmAblageStErkl.sResult & " " & iJahr.ToString & " Erklärung"
    122. 1110: Call Add2Logbuch(iMdNr, iJahr, frmAblageStErkl.sResult)
    123. 1120: frmAblageStErkl.Close()
    124. 1130: Else
    125. 1140: sSourceName = NewFileName
    126. 1150: End If
    127. 1160: For Each itemX As ListViewItem In LvwMerge.CheckedItems
    128. 1170: _Source.Add(IO.Path.Combine(TxtPath.Text, itemX.Text))
    129. 1180: Next
    130. 1190: Dim sExtension As String = IO.Path.GetExtension(_Source(0)).ToLower
    131. 1200: Try
    132. 1210: Call Unload_Webbrowser(True)
    133. 1220: If _FileProperty.IsMainTab = False Then
    134. 1230: sTargetPath = IO.Path.Combine(sTargetPath, Me.ToolStripDropDownButton2.Text)
    135. 1240: End If
    136. 1250: sTargetFile = sTargetPath & "\" & sSourceName & sExtension.ToLower
    137. 1260: Select Case sExtension
    138. Case ".pdf"
    139. 1270: Case Else
    140. 1280: If IO.File.Exists(sTargetFile) Then
    141. 1290: sTargetFile = amPDF.GetNewFileName(sTargetFile)
    142. 1300: End If
    143. 1310: System.IO.File.Move(_Source(0), sTargetFile)
    144. 1320: Exit Sub
    145. 1330: End Select
    146. 'Mergen
    147. 1340: For Each f In _Source
    148. 1350: sTmpFile = IO.Path.Combine(amPDF.TmpPathSource, IO.Path.GetFileName(f.ToString))
    149. 1360: My.Computer.FileSystem.CopyFile(f, sTmpFile, True) 'Falls Datei schon vorhanden
    150. 1370: lSource.Add(sTmpFile)
    151. 1380: Next
    152. 1390: If IO.File.Exists(sTargetFile) Then
    153. 1400: _Weblink = sTargetFile
    154. '440: Me.TopMost = False
    155. 1410: If _FileProperty.Counter = True Then
    156. 1420: sTargetFile = amPDF.GetNewFileName(sTargetFile)
    157. 1430: Else
    158. 1440: Select Case MessageBox.Show("Die Zieldatei exisitiert bereits." & Environment.NewLine _
    159. & "" & Environment.NewLine _
    160. & "Möchten Sie die neuen PDF-Dateien zu der Zieldatei hinzufügen oder Vorgang abbrechen?", "Joinen PDF -> Zieldatei existiert", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)
    161. Case DialogResult.Cancel
    162. 1450: Exit Sub
    163. 1460: Case DialogResult.Yes
    164. 1470: lSource.Insert(0, sTargetFile)
    165. 1480: Case DialogResult.No
    166. 1490: If blnStErkl Then
    167. 1500: My.Computer.FileSystem.DeleteFile(sTargetFile, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
    168. 1510: Else
    169. 1520: sTargetFile = sTargetPath & "\" & CreateFileName(sSourceName & ".pdf", sTargetPath, _FileProperty.Counter)
    170. 1530: End If
    171. 1540: End Select
    172. End If
    173. 1550: End If
    174. 1560: Dim FileTarget As String = amPDF.TmpPathTarget & "\Merge.pdf"
    175. 1570: If lSource.Count > 1 Then
    176. 1580: If blnStErkl Then
    177. 1590: If amPDF.JoinPDFBookmark(lSource, sTargetFile) = False Then
    178. 1600: MessageBox.Show("Bei der Ablage der Steuererklärung ist ein Fehler aufgetaucht.", "Fehler Ablage StErkl.", MessageBoxButtons.OK, MessageBoxIcon.Error)
    179. 1610: End If
    180. 1620: Else
    181. 1630: If krpChkBtnLesezeichen.Checked = True Then
    182. 1640: amPDF.JoinPDFBookmark(lSource, FileTarget)
    183. 1650: sSourceFile = FileTarget
    184. 1660: Else
    185. 1670: sSourceFile = amPDF.MergePDFFiles(lSource, FileTarget)
    186. 1680: End If
    187. 1690: End If
    188. 1700: Else
    189. 1710: blnStErkl = False 'bei 1 Datei ist blnStErkl immer false
    190. 1720: sSourceFile = lSource(0).ToString
    191. 1730: If IO.File.Exists(sTargetFile) Then My.Computer.FileSystem.DeleteFile(sTargetFile, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
    192. 1740: End If
    193. 1750: If blnStErkl = False Then
    194. 1760: If IO.File.Exists(sTargetFile) Then My.Computer.FileSystem.DeleteFile(sTargetFile, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
    195. 1770: System.IO.File.Move(sSourceFile, sTargetFile)
    196. 1780: End If
    197. 1790: For Each f In _Source
    198. 1800: If IO.File.Exists(f) Then My.Computer.FileSystem.DeleteFile(f, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
    199. 1810: Next
    200. 1820: _Weblink = sTargetFile
    201. 1830: If _Weblink.Length > 0 Then
    202. 1840: With oFomrMandanteninfo.WebBrowser1
    203. 1850: .Visible = True
    204. 1860: .Navigate(_Weblink)
    205. 1870: Do While .IsBusy
    206. 1880: System.Threading.Thread.Sleep(200)
    207. 1890: Loop
    208. 1900: End With
    209. 1910: End If
    210. '720: LvwFile.Sorting = SortOrder.None
    211. 1920: For Each itemX As ListViewItem In LvwFile.CheckedItems
    212. 1930: itemX.Remove()
    213. 1940: Next
    214. 1950: LvwMerge.Items.Clear()
    215. 1960: Call Lvw_Design(LvwFile, lngfirstColor, lngsecondColor)
    216. 1970: If LvwFile.Items.Count > 0 Then
    217. 1980: LvwFile.Focus()
    218. 1990: LvwFile.Items(0).Selected = True
    219. 2000: End If
    220. 2010: krpChkBtnLesezeichen.Checked = False
    221. 2020: Catch ex As Exception
    222. 2030: MessageBox.Show("Error " & Err.Number & ": (" & Err.Description & ") in Prozedur Button_Click von Modul EMA.frmScanner", "Fehler in Zeile: " & Erl())
    223. 2040: End Try
    224. End Sub


    Und ja, ich hätte für das reine Umbenennen eine eigene Funktion schreiben können, aber dafür war ich zu faul. 8o

    Gruß Achilleus

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

    Achilleus schrieb:

    Aber hier die Funktion:
    281 Zeilen zum Scrollen, dafür gibt es den
    Spoiler
    Spoiler
    .
    Was passiert, wenn Du Deine Funktion aufrufst, in DEINER Codezeile 50?
    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!
    Das was sie soll. :whistling:

    ​If Me.ToolStripDropDownButton2.Visible = False And _FileProperty.IsMainTab = False AndAlso LvwFile.CheckedItems.Count > 0 Then

    1. Prüfung:
    ​If Me.ToolStripDropDownButton2.Visible = False And _FileProperty.IsMainTab = False
    ToolStripDropDownButton2 werden alle Unterverzeichnisse des Mandanten angezeigt (MSeq_1233, ESt. 2021 usw.).
    Ist in der Hauptanwendung der MainTab (MSeq_1233) ausgewählt, dann ist mein ToolStripDropDownButton2 unsichtbar. Wird jetzt mein Verschiebe-Button vom Scan-Verzeichnis angeklickt, dann wird die FileProperty.IsMainTab geprüft, ob auch in das Hauptverzeichnis verschoben werden darf. Wenn Nein, dann...

    2. Prüfung
    Wird der Verschiebe-Button ausgewählt, ohne das die Datei gecheckt ist, dann soll keine Prüfung erfolgen, da es sich nur um eine interne Anweisung handelt.

    Wie gesagt, die Funktion arbeitet einwandfrei und hatte mit meinem eigentlichen Problem mit dem fehlenden Event nichts zu tun.
    Ich gebe auch gerne zu, die Funktion ist nicht schön und man könnte diese sinnvollerweise aufteilen. Ich brauche diese aber auch nur in diesem speziellen Fall und wollte nicht alles noch einmal anfassen.

    Achilleus schrieb:

    1. Prüfung:
    _FileProperty = Nothing und es knallt!
    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!
    @RodFromGermany:

    Im FrmScanner_Load erhält jeder Button ein Button.Tag = _FileProperty

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim table As DataTable = myDataSet.Tables("ScannerProfil")
    2. Dim myRow As DataRow
    3. Dim iCount As Integer = 0
    4. Dim _FileProperty As FileProperty
    5. 'Dim myButton As New ComponentFactory.Krypton.Toolkit.KryptonDropButton
    6. Dim newButton As KryptonButton
    7. Dim newDropDown As KryptonDropButton
    8. For Each myRow In table.Rows
    9. iCount = +1
    10. _FileProperty.Counter = Convert.ToBoolean(myRow(3))
    11. _FileProperty.IsMainTab = Convert.ToBoolean(myRow(4))
    12. _FileProperty.Contextmenue = String.Empty
    13. 'DropDown
    14. If myRow(5).ToString.Length > 0 Then 'DropDownButton
    15. _FileProperty.Contextmenue = myRow(5).ToString
    16. newDropDown = New KryptonDropButton
    17. With newDropDown
    18. .AllowDrop = True
    19. .Name = "Btn_" & iCount
    20. .Values.Image = ImlProfile.Images(0)
    21. .Width = 150
    22. .Text = myRow(2).ToString
    23. .Tag = _FileProperty 'Zähler
    24. .ContextMenuStrip = ContextMenuStripKrypton
    25. With .StateCommon.Content
    26. .Image.ImageH = PaletteRelativeAlign.Near
    27. .ShortText.TextH = PaletteRelativeAlign.Near
    28. End With
    29. End With
    30. AddHandler newDropDown.Click, AddressOf KryptonDropButton_Click
    31. AddHandler newDropDown.DropDown, AddressOf KryptonDropButton_DropDown
    32. AddHandler newDropDown.DragDrop, AddressOf KryptonDropDown_DragDrop
    33. AddHandler newDropDown.DragEnter, AddressOf KryptonButton_DragEnter
    34. FlowLayoutPanel1.Controls.Add(newDropDown)
    35. Else 'CommandButton
    36. newButton = New KryptonButton
    37. With newButton
    38. .AllowDrop = True
    39. .Name = "Btn_" & iCount
    40. .Values.Image = ImlProfile.Images(0)
    41. .Width = 150
    42. .Text = myRow(2).ToString
    43. .Tag = _FileProperty 'Zähler
    44. With .StateCommon.Content
    45. .Image.ImageH = PaletteRelativeAlign.Near
    46. .ShortText.TextH = PaletteRelativeAlign.Near
    47. End With
    48. End With
    49. AddHandler newButton.Click, AddressOf KryptonButton_Click
    50. AddHandler newButton.DragDrop, AddressOf KryptonButton_DragDrop
    51. AddHandler newButton.DragEnter, AddressOf KryptonButton_DragEnter
    52. FlowLayoutPanel1.Controls.Add(newButton)
    53. End If
    54. Next



    Deshalb kann _FileProperty nie Nothing sein.

    Lediglich in den nachfolgenden Events

    VB.NET-Quellcode

    1. Private Sub ContextMenuStripKrypton_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs) Handles ContextMenuStripKrypton.ItemClicked
    2. 30: Dim _FileProperty As FileProperty = Nothing
    3. 50: Call MoveFiles(e.ClickedItem.Text.Trim, _FileProperty)
    4. ContextMenuStripKrypton.Close()
    5. End Sub
    6. Private Sub ToolStripMenuItem_Click(sender As Object, e As EventArgs)
    7. 10: Dim mnuitem As ToolStripItem
    8. 20: mnuitem = CType(sender, ToolStripItem)
    9. 30: Dim _FileProperty As FileProperty = Nothing
    10. If Not mnuitem.Tag Is Nothing Then
    11. 40: _FileProperty = DirectCast(mnuitem.Tag, FileProperty)
    12. End If
    13. 50: Call MoveFiles(mnuitem.Text.Trim, _FileProperty)
    14. End Sub


    wird die _FileProperty = Nothing initialisiert.
    Das Ergebnis ist dann



    Und ich prüfe ja auch nur die _FileProperty.IsMainTab ab und die wird mir False initialisiert.
    Und ich erhalte auch keine Fehlermeldung.

    Habe ich da etwas falsch verstanden?

    Gruß Achilleus
    Bilder
    • Screenshot 2023-01-15 181024.png

      8,52 kB, 393×114, 44 mal angesehen

    Achilleus schrieb:

    VB.NET-Quellcode

    1. Dim _FileProperty As FileProperty = Nothing
    2. Call MoveFiles(e.ClickedItem.Text.Trim, _FileProperty)
    Dim _FileProperty As FileProperty = Nothing
    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 @RodFromGermany,

    ich will ja nicht nerven und ich werde es auch ändern, so dass ich die _FileProperty mit Werten befülle und nicht mit Nothing initialisiere.
    Aber für mein Verständnis.

    Wenn ich sage: ​Dim _FileProperty = Nothing dann wird an die Sub MoveFile() die _FileProperty übergeben und wie auf dem Bild zu sehen, erhält dann die _FileProperty.IsMainTab = False. Und nur diese _FileProperty.IsMainTab wird doch auf True/False geprüft und es kommt auch zu keinem Fehler.
    Deswegen verstehe ich den Einwand nicht. ?(

    Aber ich werde jetzt die _FileProperty sauber initialisieren. Ist ja auch kein Problem.

    Vielen Dank für Deine Geduld.

    Gruß Achilleus
    Wenn Du aber das so aufrufst:

    VB.NET-Quellcode

    1. Dim _FileProperty As FileProperty = Nothing
    2. Call MoveFiles(e.ClickedItem.Text.Trim, _FileProperty)

    Und dann in MoveFiles

    VB.NET-Quellcode

    1. Private Sub MoveFiles(NewFileName As String, _FileProperty As FileProperty)
    2. Dim amPDF As New PDFTools
    3. Dim blnStErkl As Boolean = False
    4. Dim _Weblink As String = ""
    5. Dim lSource As New List(Of String)
    6. If Me.ToolStripDropDownButton2.Visible = False And _FileProperty.IsMainTab = False AndAlso LvwFile.CheckedItems.Count > 0 Then

    dann ist in der zuletzt hier gezeigten Zeile _FileProperty Nothing. Und von einem Nothing kann man kein IsMainTab abfragen oder setzen. Der Versuch führt zu einem Programmabsturz.
    Das ist es, was RfG Dir sagen will.
    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.