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:
- In Visual Studio im design Modus, ziehen Sie ein Textfeld und tooltip auf eine frische form.
- 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
oderKeyDown
, 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 inIf 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 jeweilsIf 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 schauenNot IsNumeric(TextBox1.Text)
. Sie brauchen nichtTextBox1.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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie ersetzen den text, Sie setzt die Einfügemarke, so verschieben Sie es zurück in Platz am Ende:
.Substring
zu Verhalten, wie.Maxlength
aber mit Hinblick auf mein großes problem, ich immer noch ein workaround für die Erfüllung der >8 Voraussetzung für den tooltip zu zeigen.Ist es besser, zu unterdrücken die Schlüssel wenn es ungültig ist:
BEARBEITEN
Es gibt einen kleinen "bug" in
IsNumeric()
Funktion, denn Sie erlaubt die numerische mit Leerzeichen und mehrere "."Lösen alles:
Fügen Sie diese nach der substring-Aufruf