Sonderzeichen verbieten

  • Allgemein

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

    Nimm btw. nen StringBuilder.

    VB.NET-Quellcode

    1. Static invalidChars() As Char = IO.Path.GetInvalidFileNameChars()
    2. Dim sb As New StringBuilder()
    3. For Each c As Char In text
    4. If Array.IndexOf(invalidChars, c) = -1 Then
    5. sb.Append(c)
    6. End If
    7. Next
    8. text = sb.ToString()

    Wenn du noch die Anzahl der Zeichen, die vor dem SelectionStart übernommen wurden mitzählst, kannst du die Auswahl wieder übernehmen.

    Gruß
    ~blaze~
    Hey Leute,

    Vielen Dank für eure Hilfe. Hat mir enorm weitergeholfen. Und ich hab jetzt den Codeansatz von Blade genommen und meinen entfernt, da dieser viel kürzer ist und auch effizienter. Nur habe ich jetzt paar Probleme. Und das wichtigste ist das hier: Wenn ich eine TextBox nehme, den Text markiere und ein verbotenes Zeichen schreibe, ist der ganze Text in der TextBox weg! Wenn ich dann aber eine RichTextBox nehme, alles markiere und ein verbotenes Zeichen schreibe ist nicht alles weg ABER wenn ich was schreibe, schreibt es alles rückwärts. Ich demonstriere: Aus Hallo wird in der RichTextBox: "ollaH" Und der Cursor beamt sich immer wieder in die erste Stelle... Deswegen hab ich auch alles aus dem Code entfernt was nicht wichtig ist, aber der Fehler ist weiterhin da! Was soll ich da tun? Das ist zurzeit das größte Problem.
    @programmer71: Cursor ist nicht das Caret, sondern der Mauszeiger ;).

    Ändere mal die Implementierung oben so ab, dass mitgezählt wird, wie viele Zeichen von vor dem SelectionStart übernommen werden. Der neue Wert gibt dir dann die Position nach der Änderung an. Warum es dann leer ist, weiß ich nicht.

    Gruß
    ~blaze~
    Hey,

    Nun ich wollte ja jetzt aber die RTB nehmen, weil der ganze Text gelöscht wird wenn der Text markiert ist. Und ja da schreibt es ja falschrum. Was genau kann man dagegen tun? Hab ja mal jetzt eine Weile rumprobiert aber nichts gefunden, was wirklich geholfen hat. =/
    Hey,

    so hab in letzer Zeit leider etwas wenig Zeit gefunden aber jetzt sieht der Code bei mir so aus:

    VB.NET-Quellcode

    1. Private Sub txtbox2_TextChanged(sender As Object, e As EventArgs) Handles txtbox2.TextChanged
    2. Static InvalidChars() As Char = IO.Path.GetInvalidFileNameChars()
    3. Dim sb As New System.Text.StringBuilder()
    4. For Each c As Char In txtbox2.Text
    5. If Array.IndexOf(InvalidChars, c) = -1 Then
    6. sb.Append(c)
    7. End If
    8. Next
    9. txtbox2.Text = sb.ToString
    10. ttip1.SetToolTip(txtbox2, "Fehler")
    11. End Sub


    Wieder 3 Probleme:
    1. Wenn ich ein verbotenes Zeichen eintrage so wird der Cursor an die erste Stelle gestellt. Wie behebe ich das am besten und ist es möglich das zu schaffen ohne das die Position gespeichert wird und dann wieder abgerufen wird? Finde ich ziemlich umständlich und unangebracht für so ein Problem.
    2. Wenn der ganze Text markiert ist und dann ein verbotenes Zeichen eingetragen wird, so wird der ganze Text gelöscht. Möglichkeiten ohne die Textbox durch eine Richtextbix zu entfernen oder den Inhalt irgendwo zwischen zu speichern?
    3. Der ToolTip wird ja nur angezeigt wenn man wenn die Textbox nicht fokussiert ist. Was soll man dagegen tun?

    Ich würde mich über eure Hilfe echt freuen. =)

    VB.NET-Quellcode

    1. Public Class frmPathInput
    2. Private _Storage As New TextboxStorage
    3. Private WithEvents _HandledTextBox As TextBox
    4. Private _InvalidChars As Char() = IO.Path.GetInvalidFileNameChars()
    5. Public Sub New()
    6. InitializeComponent()
    7. _HandledTextBox = TextBox1
    8. End Sub
    9. Private Sub _HandledTextBox_KeyUp(sender As Object, e As KeyEventArgs) Handles _HandledTextBox.KeyUp
    10. _Storage.Store(TextBox1)
    11. End Sub
    12. Private Sub _HandledTextBox_TextChanged(sender As Object, e As EventArgs) Handles _HandledTextBox.TextChanged
    13. If TextBox1.Text.Any(AddressOf _InvalidChars.Contains) Then
    14. _HandledTextBox = Nothing
    15. _Storage.Restore(TextBox1)
    16. _HandledTextBox = TextBox1
    17. End If
    18. End Sub
    19. End Class
    20. Public Class TextboxStorage
    21. Private Text As String
    22. Private Start, Length As Integer
    23. Public Sub Store(tb As TextBoxBase)
    24. Text = tb.Text
    25. Start = tb.SelectionStart
    26. Length = tb.SelectionLength
    27. End Sub
    28. Public Sub Restore(tb As TextBoxBase)
    29. tb.Text = Text
    30. tb.Select(Start, Length)
    31. End Sub
    32. End Class
    Im _KeyUp wird der aktuelle Zustand gespeichert, und im TextChanged wird bei illegalen zustand der vorherige restauriert.
    Zum Restore müssen zeitweilig die Events abgehängt werden - siehe auch Alles über Events
    Hey,

    Vielen Dnak für deine Antwort. Hab jetzt den Code stück für Stück mal angesehen und erstmal versucht zu alles zu kapieren. Dann habe es Stück für Stück übernommen und die fehlenden Sachen eingetragen. Bekomme aber 7 Fehlermeldungen.

    Hier der Code wo Fehler angezeigt werden:



    In 6 von 7 Fällen ist der Fehler: Der Verweis ist auf einen nicht freigegebenen Membererfordert einen Objektverweis. Und 1x steht da: "Contais" ist kein Memver von "System.Array".

    Wo ich das nicht ganz verstehe. Ich muss es doch auf die TextBox verweisen oder sehe ich das Falsch? Ich würde mich über hilfe freuen.
    Hey,

    Hab per Copy & Paste gemacht und ich benutze Net Framework 2. Und ich habe Visual Studio Ultimate 2012 und kann irgendwie die Datei nicht öffnen. Bzw. die .exe schon aber ich kann nicht den Code vom Programm sehen. Gibts da irgendeine Möglichkeit das zu öffnen?
    Ja das ist mir alles schon bewußt xD
    Ich glaub du hast mich etwas falsch verstanden. Deswegen hier nochmal mit einem Screenshot.
    Ich hab den ProkektExlporer geöffnet da sehe ich nur sowas:




    Wenn ich jedoch auf "Starten" klicke öffnet sich dein Programm. Ich brauche ja aber den Code. Und den sehe ich hier ja nicht. Deswegen weiß ich nicht was ich tun soll, um das zu öffnen.
    @Jowat:: Offensichtlich weißt du nicht so recht, was der ProjektExplorer ist, jdfs nicht, wie man ihn zur Ansicht bringt.
    Das VisualStudio sollteman aber schon so leidlich bedienen können
    Dieses Buch lesen (hingegen das Galileio-Openbook ist Mist) - da ist auch dazu das meiste erläutert. (Aber auch da kommt das imo wichtigste: ObjectBrowser zu kurz.)



    Was ich dir noch sehr empfehle: Richte dein Studio ergonomisch ein. Zunächstmal dieser Dark-Skin ist schlecht leserlich. Es ist wissenschaftlich belegt, dass dunkle Schrift auf hellem Untergrund leichter aufzufassen ist als die FarbInversion.
    Dann hast du lauter unnütze Fenster auf, und unnütze Toolstrips, die dir deine Arbeitsfläche zumüllen, sodass dir zum Coden nurnoch ca. 1/3 des Bildschirms verbleibt.

    Ich hab meine Toolstrips mit handverlesenen Buttons ausgerüstet, und alle Fenster sind bei mir in einem TabControl gepackt, wo ich das jeweilige Fenster dann hervorhole.

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

    Hey,

    Hab den Code jetzt übernommen und es werden 2 Fehler angezeigt. Das liegt daran das ich NetFramework 2 benutze.

    Hier treten die Fehler auf:
    Private _Storage As New TextboxStorage
    Private _Validators As Func(Of String, Boolean)() = New Func(Of String, Boolean)() { _

    Fehler: Der Typ TextboxStroage wurde nicht definiert
    Der Typ Func wurde nicht definiert

    Da NetFramework 2 die noch nicht beinhaltet, muss ich sie doch selber definieren. Jedoch als was?
    Kennt jemand den Code von den beiden Sachen?

    Desweitren hast du Einen Private Sub als CheckText erstellt und den dann wieder durch ' entfernt.
    Aber später rufst du CheckText bei SelectionChanged auf. Warum wurde dann Checktext wieder entfernt?



    Und sorry mit dem Projektexplorer. Kannte das Problem nicht das das so schwarz bleibt.