Wie um zu überprüfen, ob Textfeld maximale Länge überschritten wurde?

Mein problem:

Bin ich begrenzen ein Textfeld zu 8 Zeichen und zeigt ein tooltip, wenn es überschritten (>8) eher als erreicht (=8). Mit der .Maxlength Funktion verhindert, dass der Benutzer immer mehr als 8 Zeichen, so dass meine >8 ist die Funktion nie erfüllt.

Wenn ich auf die .Maxlength - Funktion und verwenden Sie stattdessen .Substring begrenzen den Eingang, meine >8 Funktion erfüllt ist jedoch das Verhalten unterscheidet sich von .Substring (die letzten anstatt die ersten 8 Eingänge gehalten werden, und dann verliere ich den Alarm-Ton).

Wäre es viel sauberer in der Lage sein zu überprüfen, Wann immer .Maxlength überschritten wird, ohne die ersten 8 Eingänge.

Zu reproduzieren:

  1. In Visual Studio im design Modus, ziehen Sie ein Textfeld und tooltip auf eine frische form.
  2. Verwenden Sie die folgende wie:

Code:

Public Class Form1
    Private Sub Textbox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        TextBox1.MaxLength = 8
        If (Not IsNumeric(TextBox1.Text) And TextBox1.Text.Length > 0) Then
            If ToolTip1.GetToolTip(TextBox1) = "" Then
                ToolTip1.ToolTipTitle = "Input must be numeric!"
                ToolTip1.Active = True
                ToolTip1.IsBalloon = True
                ToolTip1.ToolTipIcon = ToolTipIcon.Warning
                ToolTip1.Show(vbNewLine, TextBox1, 45, -40)
            End If
        ElseIf TextBox1.Text.Length > 8 Then
            'TextBox1.Text = TextBox1.Text.Substring(0, 8)
            ToolTip1.IsBalloon = True
            ToolTip1.ToolTipTitle = "8 character maximum!"
            ToolTip1.Active = True
            ToolTip1.ToolTipIcon = ToolTipIcon.Warning
            ToolTip1.Show(vbNewLine, TextBox1, 45, -40)
        Else
            ToolTip1.Active = False
            ToolTip1.Hide(TextBox1)
        End If
    End Sub
End Class
  • MaxLength sollte ein design-time-Eigenschaft, so dass Sie nicht haben, um sorgen über den Benutzer mehr als das maximum, da Sie nicht in der Lage.
  • mit ErrorProvider könnte sparen Sie ein wenig code, anstatt alle Arten von tool-Tipps
  • Der Benutzer wird nie in der Lage sein, mehr als die maximale, aber ich wurde gebeten, einen Ballon-Tipp, wenn der Benutzer versucht, mehr als die maximale. Dies ist auf der Grundlage, dass der Benutzer kann nicht wissen, warum Sie sind, eingeschränkt zu sein. In Bezug auf Ihre design-time-Beratung, gibt es einen Nachteil bei der Einstellung .MaxLength im code?
  • Ihre Logik hat einen Fehler. Betrachten wir den Fall, wenn der Benutzer nicht numerische Zeichen. Die TextBox1.Text.Länge > 8-Vergleich wird nie ausgeführt.
  • Wahrscheinlich hast du schon die sauberste Lösung für das, was Sie suchen mit LarsTech Antwort - gibt es andere Möglichkeiten, vielleicht Umgang KeyPress oder KeyDown, aber ich denke, das wird viel einfacher sein. Über die MaxLength-die Eigenschaft persistent ist, so setzen Sie es in Ihrem event-handler jedes mal war überflüssig - wenn Sie es, es ist jetzt die gleiche, als wenn Sie getan haben würde, es als design-Zeit - das ist offenbar nicht das, was Sie tun wollen, um Ihr Verhalten zu erwarten.
  • Ich habe es gerade getestet auf meinem Ende zu und Sie sind richtig. Ich bin derzeit korrigiert wird, die Logik und werde berichten, mit den korrigierten code.
  • Vielen Dank für die Klarstellung und Erläuterung der Redundanz nicht mit dem design-time-Eigenschaft und ja, pro LarsTech Lösung, ich bin jetzt mit .Substring statt .Maxlength.
  • Die Fehler-Provider sieht vielversprechend aus und würde sparen eine erhebliche Menge an Codierung über meine gesamte Anwendung. Ich war mir nicht bewusst, es. Ich werde es-Forschung in Kürze.
  • Logik korrigiert. Vereinfachtes Beispiel mit message-Boxen: pastebin.com/YG2kxCDD | komplettes Beispiel mit tooltips: pastebin.com/vJU74D7k
  • Es hat immer noch ein problem beim eingeben von nicht numerischen Zeichen bestehen und länger als 8 Zeichen. Der Ballon dreht.
  • Nach einer weiteren überprüfung, die einzige Lösung die mir bekannt ist eine Problemumgehung, die Sie in eine ähnlich codiert Beispiel. In Bezug auf der code von meinem vorletzten Kommentar, ich habe eine If Not IsNumeric Zustand elternschaft sowohl >8 und >0 " - Zustände. Derzeit ist die >8 statement ist übergeordnet in If ToolTip1.GetToolTip() produziert inversion...(Fortsetzung)...
  • Parenting >8-Anweisung anstelle von >0-Anweisung, parenting >8-Anweisung und >0-Anweisung und parenting If Not IsNumeric statement mit jeweils If ToolTip1.GetToolTip() alle verhindern die Auslösung von >8. Löschen >0 verhindert die inversion aber auf Kosten des >0. Diese sind die einzigen Permutationen kann ich begreifen, mit dem wissen, das ich derzeit habe.
  • Statt ständig zu überprüfen TextBox1.Text.Length > 8 könnten Sie setzen es in den Anfang und dann schauen Not IsNumeric(TextBox1.Text). Sie brauchen nicht TextBox1.Text.Length > 0. Eine weitere Sache. Da schreiben Sie den gleichen code (Anzeige der QuickInfo) die ganze Zeit, steckte es in eine Funktion. Ich gebe Ihnen ein Beispiel schrieb ich als Antwort.

Schreibe einen Kommentar