Sonderzeichen verbieten

  • Allgemein

Es gibt 189 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Sonderzeichen verbieten

    Hey Leute,

    Ich hab ein Programm wo eine Datei erstellt wird. Und man kann den Namen der Datei auswählen. Nun ist es ja bei Windows so das diese Zeichen: < > ? " : | \ / *
    nicht in einem Dateinamen vorhanden sein dürfen. Wie mache ich das nun so das wenn man eines dieser Tasten drückt, diese nicht in die TextBox geschrieben wird. Aber alle anderen Sonderzeichen, Buchstaben und Zahlen sollen weiterhin funktionieren. Des weiteren soll dort dann über der TextBox eine Sprechblase kommen, das dieses Zeichen verboten ist. So in etwa: myimg.de/?img=Test799f8.png

    Über eure Hilfe würde ich mich freuen.

    Mit freundlichen Grüßen
    Jowat
    Hallo,

    das wäre eine möglichkeit:

    VB.NET-Quellcode

    1. Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    2. Dim illegalchar() As String = {"<", ">", "?", """", ":", "|", "\", "/", "*"}
    3. For Each a In illegalchar
    4. If TextBox1.Text.Contains(a) Then
    5. MessageBox.Show("Illegales Zeichen")
    6. TextBox1.Text = TextBox1.Text.Replace(a, "")
    7. End If
    8. Next
    9. End Sub


    mfG

    Derfuhr
    Die TextBox hat ein "KeyPressEvent". Lese den "KeyChar" aus dem Parameter "e".
    Danach einfach eine simple IF Abfrage (Oder ein Case), um zu ermitteln, was für eine Taste gedruckt wurde.
    Falls eine verbotene Taste gedruckt wird, kannst du mit "e.Handled = true" denn Vorgang abbrechen.
    So wird der Buchstabe nicht in die TextBox geschrieben.

    Und wenn du noch eine weitere Aktion ausführen willst, kannst du das direkt hinter dem "e.Handled = true" tun.

    Beispiel von milaim:
    vb-paradise.de/programmieren/h…xtbox-sperren/#post138130

    Greez Dancger
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...

    VB.NET-Quellcode

    1. [vb]Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    2. If e.KeyChar = "/" Then
    3. e.Handled = True
    4. End If
    5. End Sub
    [/vb]

    Oder:

    VB.NET-Quellcode

    1. Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    2. If e.KeyChar = "<" Or e.KeyChar = ">" Or e.KeyChar = "?" Or e.KeyChar = """" Or e.KeyChar = ":" Then
    3. e.Handled = True
    4. End If
    5. End Sub


    LG

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

    @Jowat: .NET kennt Dein Problem:

    VB.NET-Quellcode

    1. Dim c1() As Char = IO.Path.GetInvalidFileNameChars()
    2. Dim c2() As Char = IO.Path.GetInvalidPathChars()
    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!
    Hey Leute,

    Ich danke euch allen vielmals für eure Antworten. Ich habe nun diese Methode genommen:

    VB.NET-Quellcode

    1. If e.KeyChar = "<" Or e.KeyChar = ">" Or e.KeyChar = "?" Or e.KeyChar = """" Or e.KeyChar = ":" Or e.KeyChar = "|" Or e.KeyChar = "\" Or e.KeyChar = "/" Or e.KeyChar = "*" Then
    2. e.Handled = True
    3. End If

    Da ich diese für am sinnvollsten hielt. Nun stellt sich nur noch die Frage wie ich diese Sprechblase dort hinbekomme (myimg.de/?img=Test799f8.png). Eine MessageBox sieht da nicht so toll aus.

    Über eure Hilfe würd ich mich riesig freuen.

    Mit freundlichen Grüßen
    Jowat

    Jowat schrieb:

    Da ich diese für am sinnvollsten hielt.
    Suboptimal, .NET außen vor zu lassen.

    VB.NET-Quellcode

    1. Private cc As New List(Of Char)
    2. Public Sub New()
    3. InitializeComponent()
    4. cc.AddRange(IO.Path.GetInvalidFileNameChars())
    5. End Sub
    6. Private Sub TextBox1_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
    7. If cc.Contains(Convert.ToChar(e.KeyValue)) Then
    8. e.SuppressKeyPress = True
    9. End If
    10. End Sub
    Für Deinen Context noch anzupassen.
    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 Bei dieser Methode werden auch andere Tasten geblockt wie auch zum Beispiel die Backspace Taste
    @Snaptu Darauf bin ich zwar auch schon gekommen, aber das Problem da liegt das da immer die Maus über der TextBox sein muss was ziemlich nervig ist da es so meistens dann nicht angezeigt wird

    Jowat schrieb:

    wie auch zum Beispiel die Backspace Taste
    Ja und?
    cc.Add(Backspace Taste)
    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!
    Hmm das verstehe ich nicht ganz. Bei der Methode von Rod muss man doch viele Tasten reinschreiben die erlaubt sind. Bei der anderen Methode muss man nur 9 Zeichen schreiben die verboten sind. Daher ist das verbieten der 9 Zeichen doch sinnvoller. Oder etwa nicht?
    Wie kommst du darauf? Du erstellst eine Liste, die alle verbotenen Zeichen enthält. Dann brauchst du nur noch mit Contains prüfen, ob des jeweilige Zeichen enthalten ist, wodurch du deine Abfrage erheblich verkürzt und außerdem optimierst.

    Jowat schrieb:

    muss man doch viele Tasten reinschreiben
    Genau die, die Du nicht haben willst.
    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!
    Okay ich hab das jetzt mal so versucht:

    VB.NET-Quellcode

    1. Private cc As New List(Of Char)
    2. Dim c1() As Char = IO.Path.GetInvalidFileNameChars()
    3. Dim c2() As Char = IO.Path.GetInvalidPathChars()
    4. Public Sub New()
    5. InitializeComponent()
    6. cc.AddRange(IO.Path.GetInvalidFileNameChars())
    7. cc.AddRange(c1)
    8. cc.AddRange(c2)
    9. End Sub
    10. Private Sub txtbox2_KeyDown(sender As Object, e As KeyEventArgs) Handles txtbox2.KeyDown
    11. If cc.Contains(Convert.ToChar(e.KeyValue)) Then
    12. e.SuppressKeyPress = True
    13. If txtbox2.Text.Contains(cc.ToString) Then MsgBox("Fehler")
    14. End If
    15. End Sub


    Wo genau liegt mein Fehler (sorry bin noch ein Anfänger)
    Zu deinem Tooltip anliegen:

    Wer sagt das du mit der Maus über die Textbox musst damit ein Tooltip angezeigt wird?
    Lt. MSDN kannst du auch einen Tooltip anzeigen wenn ein Ereignis eintritt, in deinem Fall
    wenn ein nicht erlaubtes Zeichen kommt.
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

    Jowat schrieb:

    Okay ich hab das jetzt mal so versucht:
    Suboptimal.
    Sieh Dir mal an, was Du da anhängst. Entweder das eine oder das andere, je nachdem, wofür Du es brauchst.
    Beide Arrays sind oversized.
    Haltepunkt (F9) auf InitializeComponent(), mit F10 Einzelschritt auslösen und mit Klick drauf und Shift+F9 Inhalt von Variablen ansehen. :D
    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!
    Okay ich habe nun den Code so geändert:

    VB.NET-Quellcode

    1. Private cc As New List(Of Char)
    2. Dim c1() As Char = IO.Path.GetInvalidFileNameChars()
    3. Public Sub New()
    4. InitializeComponent()
    5. cc.AddRange(c1)
    6. End Sub
    7. Private Sub txtbox2_KeyDown(sender As Object, e As KeyEventArgs) Handles txtbox2.KeyDown
    8. If cc.Contains(Convert.ToChar(e.KeyValue)) Then
    9. e.SuppressKeyPress = True
    10. If txtbox2.Text.Contains(cc.ToString) Then MsgBox("Fehler")
    11. End If
    12. End Sub


    Und mit Tooltip. Bei mir wird das nur angezeigt, wenn sich die Maus in der TextBox befindet.