String Variabel Aufbauen

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

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Naifu.

    String Variabel Aufbauen

    Moin,

    ich habe das Problem, dass ich einen Dateinamen Variabel mit verschiedenen Parametern erstellen möchte:


    VB.NET-Quellcode

    1. ​DestFileName = ID & "_" & NName & "_" & VName & "_" & Datum & "_" & Station & ".PDF"


    Nun möchte ich das aber für den User Variabel gestalten, z.B. über eine Textbox in der der Anwender eingibt, wie er den Ausgabestring haben möchte, z.B.

    {ID}_{Station}_{NName}_{VName}_{Datum}


    Wobei das nur ein Beispiel ist, eventuell ist das ja noch einfacher zu Lösen. Nur weiß ich nicht wie ich das Überhaupt angehen soll, dass der String unter DestFileName Variabel ist und nicht wie jetzt vordefiniert.
    @PapaBeer92 Ganz einfach:

    VB.NET-Quellcode

    1. If WAS_DER_USER_MÖCHTE = 1 Then
    2. DestFileName = ID & "_" & NName & "_" & VName & "_" & Datum & "_" & Station & ".PDF"
    3. Else If WAS_DER_USER_MÖCHTE = 2 Then
    4. DestFileName = NName & "_" & VName & "_" & Datum & "_" & Station & ".PDF"
    5. Else If WAS_DER_USER_MÖCHTE = 3 Then
    6. DestFileName = ID & "_" & Datum & "_" & Station & ".PDF"
    7. End If
    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!
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Ja, möglich, aber ich möchte den Ausgabe-Namen ja komplett Variabel haben:

    User kann auswählen WAS in den Dateinamen soll, und in welcher Reihenfolge:

    ID
    NName
    VName
    Datum
    Station
    Trennzeichen

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

    Oder so: -> Dynamic string interpolation

    Extention

    VB.NET-Quellcode

    1. Imports System.Text.RegularExpressions
    2. Imports System.Reflection
    3. Public Module AmitFormat
    4. 'Regex to match keywords of the format {variable}
    5. Private ReadOnly TextTemplateRegEx As New Regex("{(?<prop>\w+)}", RegexOptions.Compiled)
    6. ''' <summary>
    7. ''' Replaces all the items in the template string with format "{variable}" using the value from the data
    8. ''' </summary>
    9. ''' <param name="templateString">string template</param>
    10. ''' <param name="model">The data to fill into the template</param>
    11. ''' <returns></returns>
    12. <System.Runtime.CompilerServices.Extension>
    13. Public Function FormatTemplate(templateString As String, model As Object) As String
    14. If model Is Nothing Then
    15. Return templateString
    16. End If
    17. Dim properties As PropertyInfo() = model.[GetType]().GetProperties(BindingFlags.Instance Or BindingFlags.[Public])
    18. If Not properties.Any() Then
    19. Return templateString
    20. End If
    21. Return TextTemplateRegEx.Replace(templateString, Function(match)
    22. Dim [property] As PropertyInfo = properties.FirstOrDefault(Function(propertyInfo) propertyInfo.Name.Equals(match.Groups("prop").Value, StringComparison.OrdinalIgnoreCase))
    23. If [property] Is Nothing Then Return String.Empty
    24. Dim value As Object = [property].GetValue(model, Nothing)
    25. Return If(value Is Nothing, String.Empty, value.ToString())
    26. End Function)
    27. End Function
    28. End Module

    Aufruf

    VB.NET-Quellcode

    1. Private Sub Button49_Click(sender As Object, e As EventArgs) Handles Button49.Click
    2. Dim ID As Integer = 5
    3. Dim Station As String = "Test"
    4. Dim NName As String = "Müller"
    5. Dim VName As String = "Hans"
    6. Dim Datum As String = "Heute"
    7. 'TextBox1.Text = "{ID}_{Station}_{NName}_{VName}_{Datum}"
    8. Dim Data As Object = New With {ID, Station, NName, VName, Datum}
    9. MessageBox.Show(TextBox1.Text.FormatTemplate(Data))
    10. End Sub

    PapaBeer92 schrieb:

    und in welcher Reihenfolge
    Das würde ich ablehnen.
    Und? Wo ist das Problem?
    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!
    Versuchs doch mal mit String.Format

    VB.NET-Quellcode

    1. DestFileName = String.Format("{0}_{1}_{2}_{3}_{4}", v0, v1,v2,v3,v4)

    v0 - v4 befüllst Du dann in der notwendigen Reihenfolge und das Trennzeichen kannst Du über replace ersetzen.

    Oder Du nutzt

    VB.NET-Quellcode

    1. DestFileName = String.Format("{0}{5}{1}{5}{2}{5}{3}{5}{4}", v0, v1,v2,v3,v4, t)

    Wobei t das Trennzeichen enthält und t muss zwingend auf der angegeben Position stehen.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Wozu werden eigentlich bei aktuellen VS-Versionen String.Format vorgeschlagen und nicht gleich zu interpolierten Strings geraten?
    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.
    Mach eine List(Of String) mit den Optionen
    Lass den User z.B mit Checkboxen auswählen, welche Optionen er haben möchte.
    Wenn die angeklickt werden, dann wird aus der Liste die Option entsprechend entfernt oder hinzugefügt. (lstOptionen.Add/ lstOptionen.Remove)

    Dann macht

    VB.NET-Quellcode

    1. DestFileName = $"{String.Join("_"c, lstOptionen.ToArray)}.PDF"
    automatisch deinen String
    Füll die zusammen geklicken Teile des Users in einer ListOf(T) und füge die dann die Items mit nem StringBuilder zusammen.
    Kannste dann auch als User Vorgabe speichern und Laden wenn du willst.