2017-06-12 3 views
1

Ich habe ein textbox und ein TextChanged Ereignis damit, dass, wenn ein Benutzer etwas eingibt, ein Backslash automatisch am Ende des Textfelds hinzugefügt wird, wenn es nicht bereits eins gibt.Setze letzte mögliche Position von Textbox Caret

Das funktioniert gut, außer wenn der Benutzer den Cursor nach dem umgekehrten Schrägstrich und Typen an das Ende des Textfelds platziert, verschiebt es den umgekehrten Schrägstrich nach links, fügt den neuen Text und dann einen weiteren umgekehrten Schrägstrich am Ende.

Zum Beispiel gibt der Benutzer C und C\ erscheint. Jetzt, wenn sie nach der \ klicken und a eingeben, C\a\ erscheint, wenn was ich will, ist nur Ca\.

Also brauche ich eine Möglichkeit, die letzte Position des Cursors im Textfeld vor dem umgekehrten Schrägstrich zu setzen, wenn der Benutzer versucht, es nach dem umgekehrten Schrägstrich zu setzen.

Hier ist der Code für das Textchanged-Ereignis:

private void batchRootFolderText_TextChanged(object sender, EventArgs e) 
{ 
    if (!batchRootFolderText.Text.EndsWith("\\")) 
    { 
     batchRootFolderText.Text = batchRootFolderText.Text + "\\"; 
    } 
} 
+0

Das ist ziemlich seltsames Verhalten oder 'TextBox', wenn Sie mich fragen. Kannst du erzählen, warum machst du das? Punkt ist, dass Sie einige Male später ändern können, wenn der Benutzer fertig ist (Fokus verloren oder drücken der Taste), nicht unbedingt nach jedem Textwechsel, während er noch nicht fertig ist. – Sinatr

+0

Ja, es ist komisch, aber der Benutzer hat ausdrücklich darum gebeten, dass es jedes Mal passiert, wenn ein Text eingegeben wird. Es wäre besser, wenn ich es am Ende tun könnte, wenn sie endlich einen Knopf drücken, um diesen Text zu benutzen. – pfinferno

Antwort

0
private void batchRootFolderText_TextChanged(object sender, EventArgs e){ 
    if (!batchRootFolderText.Text.EndsWith("\\")){ 
     String temp = batchRootFolderText.Text; 
     temp = temp.Substring(0, MyString.Length - 1); 
     batchRootFolderText.Text = temp + "\\"; 
    } 
} 

das Ende der Schnur Versuchte das Abschneiden dann zu ersetzen?

+0

Dies führt nicht zum richtigen Verhalten. Zum Beispiel erzeugt die Eingabe von "c" 'c \'. Aber wenn der Benutzer dann den Cursor rechts neben den umgekehrten Schrägstrich setzt und "c" erneut eingibt, erscheint "c \\" anstelle von "cc \". – pfinferno

0

Sie eine Variable hinzufügen, die verfolgen, wo der Backslash und „bewegen“ es bis zum Ende halten werden, wenn erforderlich:

int backSlashIndex = -1; 

private void batchRootFolderText_TextChanged(object sender, EventArgs e) 
{ 
    if (!batchRootFolderText.Text.EndsWith("\\")) 
    { 
     if(backSlashIndex != -1) 
     { 
      var fullText = batchRootFolderText.Text; 

      var beforeBackslashText = fullText.Substring(0, backSlashIndex); 
      var afterBackslashText = fullText.Substring(backSlashIndex + 1, fullText.Length - beforeBackslashText.Length - 1); 

      batchRootFolderText.Text = beforeBackslashText + afterBackslashText; 
     } 

     batchRootFolderText.Text = batchRootFolderText.Text + "\\"; 
     backSlashIndex = batchRootFolderText.Text.Length - 1; 
    } 
} 

Denken Sie daran, Handhabung für Fälle hinzuzufügen, wenn Zeichen von einem Benutzer entfernt werden, oder wenn ein Benutzer den Backslash-Charakter selbst eintippt.

0

Sie können die Cursorposition mit der Selection Eigenschaft: https://msdn.microsoft.com/en-us/library/system.windows.controls.textbox.selectionstart(v=vs.110).aspx

Im Selection Ereignisse (https://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.textboxbase.selectionchanged(v=vs.110).aspx) Sie können überprüfen, ob die Einfügemarke am Ende des Textes sind und wenn der Text endet mit einem umgekehrten Schrägstrich und stelle die Position ein.

if (textBox.SelectionStart == textBox.Length - 1 && textBox.Text.EndsWith(@"\") 
    textBox.SelectionStart = textBox.Length - 2; 

Dieser Code sollte die Arbeit machen.

+0

Dieses Ereignis ist nur in WPF (glaube ich), das ist für winforms. – pfinferno

+0

Oh, das ist richtig. Ich habe es selbst überprüft. Sie können dies jedoch in MouseUp- und KeyUp-Ereignissen implementieren. Ich denke, Maus und Tastatur sollten die einzige Möglichkeit für den Benutzer sein, die Position des Carets zu ändern;) – Serraniel

Verwandte Themen