Sonderzeichen verbieten

  • Allgemein

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

    Hey,

    Vielen vielen Dank für diese Hilfe. Ich habe das ganze versucht bei mir anzuwenden. Hatte aber massige Fehlermeldungen. Dauerte bis ich alles
    dann perfekt hatte und an meinem Programm angepasst hatte (ToolTip etc. hinzufügen). Jedoch sind da 2 Probleme.

    1.Wenn ich da: "Hallo" stehen habe und zwischen a und l ein : einfüge, so wird der Doppelpunkt zwar nicht angezeigt, aber der Cursor springt dann
    hin und her. (Nur Manchmal)
    2. Wenn ich Test:123 im Zwischenspeicher habe und es einfüge, wird gar nichts eingefügt! Normalerweise sollte dann Test123 da stehen und nur der
    Doppelpunkt sollte weg sein.Aber ich habe lange herumprobiert und hab jetzt ein eigenen Code entwickelt, wo alle Probleme behoben sind und was
    auch einigermaßen akzeptabel funktioniert.

    Nur eine kleine Zwischenfrage:
    ACHTUNG: IST NUR TEIL EINES CODES, KANN SO NICHT FUNKTIONIEREN!

    VB.NET-Quellcode

    1. Private InvalidChars As String = "<>:""\/|*?"
    2. Private Function CountChar(ByVal sString As String, ByVal sChar As Char) As Integer
    3. Dim iCounter As Integer = 0
    4. While (sString.IndexOf(sChar) > -1)
    5. iCounter += 1
    6. sString = sString.Substring(sString.IndexOf(sChar) + 1)
    7. End While
    8. CountChar = iCounter
    9. End Function
    10. TextBox1.Text = TextBox1.Text.Replace(InvalidChars)
    11. If TextBox1.Text.Contains(InvalidChars) Then...
    12. setting.cursor = TextBox1.SelectionStart - CountChar(TextBox1.Text, InvalidChars) ' Funktion zählt die InvalidChars in der TextBox


    Bei den letzen 3 Zeilen Code wird InvalidChars nicht akzeptiert. Also es kommt keine Fehlermeldung, aber es funktioniert auch nicht!
    Wenn ich zB. das InvalidChars durch ein "A" ersetze, so werden alle A's gesperrt. Aber warum erkennt es meinen String nicht an?
    Hallo,

    hatte beim Thread 'For Each durch Replace ersetzen'
    diesen Code gepostet:

    VB.NET-Quellcode

    1. Dim strarray() As Char = TextBox1.Text.ToCharArray
    2. Dim ergebnis As String = ""
    3. Dim zeichen() As Char = {"%"c, "/"c} 'usw.
    4. For i = 0 To strarray.Count - 1
    5. If Not zeichen.Contains(strarray(i)) Then
    6. ergebnis = ergebnis & strarray(i)
    7. End If
    8. Next
    9. Label1.Text = ergebnis


    Ergebnis ist dann, was überprüft und ersetzt wurde und bei zeichen()
    machst du hast immer nach dem Schema: "%"c, "/"c und das
    musst du natürlich an deine Bedürfnisse anpassen.

    Achtung! Du musst .net 3.5 oder höher nutzen, sonst funktioniert es nicht.

    MFG

    Alex-Digital :D
    ~ Alex-Digital :D

    if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D
    Da gibt's doch wunderschöne Konstruktionen für solche Zwecke

    VB.NET-Quellcode

    1. Sub Main()
    2. MsgBox(CountOfChar("123456789123456789123", "2"c))
    3. MsgBox(RemoveInvalidChars("abcdefg%hij/%/klm/"))
    4. End Sub
    5. Function CountOfChar(ByVal SearchString As String, SearchChar As Char) As Integer
    6. Return Aggregate n In SearchString Where n = SearchChar Into Count()
    7. End Function
    8. Function RemoveInvalidChars(ByVal RemoveString As String) As String
    9. Dim InvChars() = {"%"c, "/"c}
    10. Return RemoveString.Where(Function(c) Not InvChars.Contains(c)).ToArray
    11. End Function
    Ein Linq-Spezialist kann das bestimmt noch eleganter.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Sollte nicht diese Lösung ausreichen?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim erp As New ErrorProvider
    3. Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    4. Dim tb As TextBox = DirectCast(sender, TextBox)
    5. For Each zeichen In IO.Path.GetInvalidFileNameChars
    6. If tb.Text.Contains(zeichen) Then
    7. erp.SetError(tb, "Ungültiges Zeichen im Dateinamen")
    8. Exit Sub
    9. End If
    10. Next
    11. erp.SetError(tb, String.Empty)
    12. End Sub
    13. End Class


    ALLE Zeichen zulassen, und im Falle eines ungültigen Zeichens einfach informieren? Der End-User sollte mündig genug gehalten werden, seine Fehler selbst auszubessern. Ich halte nichts von Textboxen, die mir bestimmte Zeichen verbieten. Die gezeigten Varianten sind übrigens interessant, wenn ein Filename per C&P hereinkommt. Löst nämlich keinen Keypress/Keydown/whatever aus.

    Falls dies schon mal thematisiert wurde, dann sorry. Aber wenn in einem Thread drei verschiedene Fragen gestellt werden, dann neige ich zum Nicht-Lesen. ;)
    Hey Leute,

    Ähm hab jetzt so viele Antworten gekriegt und ausprobiert. Irgendwie kriege ich es nicht hin. -.-
    Hab jetzt mal alles wieder zurückgesetzt und hier der Code:


    VB.NET-Quellcode

    1. Dim InvalidChars As String = "<>:""\/|*?"
    2. Dim cursorpos As Integer
    3. Dim iCounter As Integer = 0
    4. Private Function CountChar(ByVal sString As String, ByVal sChar As Char) As Integer
    5. While (sString.IndexOf(sChar) > -1)
    6. iCounter += 1
    7. sString = sString.Substring(sString.IndexOf(sChar) + 1)
    8. End While
    9. CountChar = iCounter
    10. End Function
    11. Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    12. ToolTip1.RemoveAll()
    13. MsgBox(CountChar(TextBox1.Text, InvalidChars))
    14. If TextBox1.Text.Contains(InvalidChars) Then
    15. cursorpos = TextBox1.SelectionStart - CountChar(TextBox1.Text, InvalidChars)
    16. TextBox1.Text = TextBox1.Text.Replace(InvalidChars, "")
    17. TextBox1.SelectionStart = cursorpos
    18. ToolTip1.SetToolTip(TextBox1, "Ein Dateiname darf keines der folgenden Zeichen enthalten: \ / : * ? "" < ")
    19. End If


    So das Hauptproblem war ja das String nicht geht. Deswegen habe ich diesen Beitrag da gelesen mit Option Strict On und es mit Char und so ausprobiert, aber erfolglos.

    Was genau mache ich immer noch falsch? =(
    In der Zeile 16 fragst du ab, ob deine Zeichenkette die Zeichenkette enthält, die du in Zeile 1 definiert hast. Da dies nicht zutrifft, geht's munter weiter in Zeile 21. Die Frage, wie man die einzelnen Zeichen der InvalidChars durchgeht, wurde dir bereits erklärt (=steht schon in Codeform in diesem Thread).
    kleine Verbesserung meines Ansatzes - jetzt stored er im KeyDown - ich kann keinerlei Fehlfunktion festestellen (3* auf Holz geklopft):

    VB.NET-Quellcode

    1. Public Class frmPathInput2
    2. Private _Storage As New TextboxStorage
    3. Private WithEvents _HandledTextBox As TextBox
    4. Private _InvalidChars As New String(IO.Path.GetInvalidFileNameChars())
    5. Public Sub New()
    6. InitializeComponent()
    7. _HandledTextBox = TextBox1
    8. End Sub
    9. Private Sub _HandledTextBox_KeyDown(sender As Object, e As KeyEventArgs) Handles _HandledTextBox.KeyDown
    10. _Storage.Store(TextBox1)
    11. End Sub
    12. Private Sub _HandledTextBox_TextChanged(sender As Object, e As EventArgs) Handles _HandledTextBox.TextChanged
    13. If Any(TextBox1.Text, AddressOf _InvalidChars.Contains) Then
    14. _HandledTextBox = Nothing
    15. _Storage.Restore(TextBox1)
    16. _HandledTextBox = TextBox1
    17. End If
    18. End Sub
    19. End Class

    VB.NET-Quellcode

    1. Public Module Fw2Helpers
    2. Public Function Any(Of T)(list As IEnumerable(Of T), predicate As Func(Of T, Boolean)) As Boolean
    3. For Each itm In list
    4. If predicate(itm) Then Return True
    5. Next
    6. Return False
    7. End Function
    8. End Module
    9. Public Delegate Function Func(Of T)() As T
    10. Public Delegate Function Func(Of T1, T)(arg1 As t1) As T
    11. Public Delegate Function Func(Of T1, T2, T)(arg1 As t1, arg2 As t2) As T

    VB.NET-Quellcode

    1. Public Class TextboxStorage
    2. Private Text As String
    3. Private Start, Length As Integer
    4. Public Sub Store(tb As TextBoxBase)
    5. Text = tb.Text
    6. Start = tb.SelectionStart
    7. Length = tb.SelectionLength
    8. End Sub
    9. Public Sub Restore(tb As TextBoxBase)
    10. tb.Text = Text
    11. tb.Select(Start, Length)
    12. End Sub
    13. End Class
    Hey,

    Naja fast, alles außer eine sehr wichtige Funktion. Wenn ich im Zwischenspeicher: ScreenShot:1 habe und es einfüge, wird nicht eingefügt. Sollte
    aber ScreenShot1 eingefügt werden. Und ähm ich muss ja nur hinbekommen das die Funktionen Contains und Replace diesen String annehmen:
    Dim InvalidChars As String = "<>:""\/|*?"
    Das ist das einzige was ich nicht verstehe. Wie muss ich das nun ändern, damit auch Contains und Replace auf diesen String zugreifen können?
    Char geht irgendwie nicht. =(

    Gruß

    Jowat schrieb:

    Wenn ich im Zwischenspeicher: ScreenShot:1 habe und es einfüge, wird nicht eingefügt. Sollte
    aber ScreenShot1 eingefügt werden.
    Dassis schwierig und fragwürdig.
    Nach meim Konzept wird eine ungültige Eingabe eben abgelehnt, und der User sieht das ja gleich.
    Die Eingabe statt abzulehnen automatisch zu korrigieren ist einerseits schwierig, annererseits wird dann was anneres eingefügt, als was der User denkt, wasser eingefügt hätte. Wenn daraus Folgefehler resultieren sucht der sich vlt. grün und blau, weiler einfach nicht auf die Idee kommen kann, dass aus dem Kopierspeicher was anneres eingefügt wurde, als was er da hineingemacht hat.

    Das ist das einzige was ich nicht verstehe. Wie muss ich das nun ändern, damit auch Contains und Replace auf diesen String zugreifen können?
    Dassis ganz schön viel, was du da nicht verstehst.
    nimm einfach mal das Wort "Contains", dassis englisch, und heißt auf deutsch "enthalten".
    Du willst aber nicht überprüfen, ob der TextboxText "<>:""\/|*?" enthält. Denn dass tut er nur, wenn man "<>:""\/|*?" in die Textbox eintippt, und wer wird das schon tun?
    Nein, du willst überprüfen, ob der TextboxText auch nur irgendeinen dieser Chars beinhaltet.
    "Irgendeiner" ist deutsch, und heißt auf englisch: "Any".
    Hey,

    Okay, das dachte ich mir schon irgendwie, wusste aber nicht das ich dazu Any brauche. Hab jetzt die Any Funktion bei mir eingebaut und das gemacht.
    Aber bei diesen beiden Zeilen weiß ich nicht was ich tun soll:

    VB.NET-Quellcode

    1. TextBox1.Text = TextBox1.Text.Replace(InvalidChars, "")
    2. cursorpos = TextBox1.SelectionStart - CountChar(TextBox1.Text, InvalidChars)


    Denn da kann ich ja nirgends ein Any einsetzen. Oder übersehe ich da nur was?

    Gruß
    Hey Leute,

    Sorry das es so lange gedauert hat. Hatte noch vieles zu tun (Abschlussprüfungen etc.) Naja jetzt hab ich fast alles hier mir. Gut hab jetzt alle Probleme gelöst außer eins. Bei der Repleace Funktion, wird der Cursor wieder an 1. Stelle gesetzt. Wie mache ich das so, das es an gleicher stelle weiterhin bleibt?

    Gruß
    Kannst Du noch mal das Problem aus Deiner jetzigen Sicht beschreiben?
    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!
    Klar also:
    Mein Programm soll Daten erstellen können, wovon man den Namen selber entscheiden darf. Leider lässt Windows paar Zeichen als Dateiname nicht zu: :"?*/ etc.
    Nun habe ich die TextBox so präpariert, das dort keines dieser Zeichen eingetragen werden kann. Unter anderem habe ich dazu die Replace Funktion der TextBox benutzt. Also falls eines dieser Zeichen vorhanden ist, so soll dieses durch ein "" ersetzt werden (Durch nichts). Jedoch ist es bei VB so das dann der Cursor (gemeint ist hier der blinkende Strich) dann an 1. Stelle gesetzt wird. Heiß ich schreibe Name123TestI schreibe dann zB. ein ? und das ganze sieht dann so aus: IName123Test. Der Cursor soll aber weiterhin seine letze Position beibehalten! Und TextBox1.Start = TextBox1.TextLength geht nicht, da man ja nicht immer an letzer Stelle schreibt. ZB. schreibe ich stattdessen zwischen 1 und 2. Und vor dem Replace die Cursor Position zu speichern und dann wieder abzurufen geht dann logischer weise auch nicht...

    Eine echte Zwickmühle. Was soll ich bloß tun? =/

    Gruß

    markus.obi schrieb:

    hast du das Problem erst gar nicht.

    Jowat schrieb:

    Der geht aber nicht bei Einfügen
    Dazu solltet Ihr das Text_Change-Event frequentieren.
    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!