2016-11-06 1 views
0

Kannst du mir helfen herauszufinden, wie der vorherige Text in den Textkasten eingefügt werden kann, und der tatsächliche Inhalt ist gleich?Wie kann man wissen, ob das vorherige Einfügen in das Textfeld dem tatsächlichen Einfügen entspricht?

Zum Beispiel, wenn ich "Wort 1" in das Textfeld einfüge, dann gebe es ein, und nach dem Einfügen von "Wort 2" passiert nichts, aber wenn ich "Wort 1" nach "Wort 1" wieder einfüge, Ich muss es wissen.

Vergleich von aufgezeichneten und eingegebenen Zeilen macht in diesem Fall keinen Sinn, weil ich String nicht immer in die Textdatei speichern, aber ich möchte wissen, ob String mit tatsächlichen Einfügen und vorherigen Einfügen Vergleich ist, auch wenn Zeile existiert nicht in Datei.

Ich brauche einen Wert, der zwischen zwei tatsächlichen und früheren Einfügungen existiert und wenn vorherige Einfügung gleich der tatsächlichen Einfügung ist, zeige diese Tatsache an, annulliere den Wert, aber wenn die tatsächliche Einfügung anders ist, entferne diesen zeitlichen Wert.

Ich bin mir nicht sicher, wie man dieses Ergebnis für die tatsächliche Einfügung mit Textbox richtig erhalten, wie man über Gleichheit für den nächsten und vorherigen Einsatz weiß.

Ich bin sicher, dass mein Versuch ist schlecht, und wahrscheinlich falsch, und meine Frage wäre so schlecht bewertet werden, aber trotzdem:

Ich versuche tatsächliche Zeichenfolge Datensatz mit 0 Index in die Liste hinzuzufügen, dann, wenn Der nächste Istwert ist gleich dem String in dieser Liste, macht den Feldvariablenwert gleich 1 und löscht die Liste, andernfalls löscht er die Liste und annulliert den Feldvariablenwert. Wenn die Feldvariable nicht gleich Null ist, Anzeige "Wiederholen des vorherigen Einfügens" und den Wert der Feldvariablen annullieren, löschen Sie die zeitliche Liste.

aber scheint, wie der Vergleich der actStr und Listen-Datensatz rpt[0] es nicht Vergleich frühere und aktuell ist, sondern nur tatsächlich mit dem tatsächlichen, so dass es nicht richtig funktioniert funktioniert, am absolut falschen Weg sieht aus wie es zu tun:

List<string> rpt = new List<string>();  

string tempRptCheck = actStr; 
rpt.Insert(0, tempRptCheck); 

if (actStr == rpt[0]) 
{ 
    rptVal = (rptVal = 1); 
    rpt.Clear(); 
} 
else 
{ 
    rptVal = (rptVal = 0); 
    rpt.Clear(); 
} 

if (rptVal > 0) 
{ 
    Console.WriteLine("Repeat of previous insert"); 
    rptVal = (rptVal = 0);  
    rpt.Clear(); 
} 

um wieder klarer zu sein:

ich möchte Benachrichtigung im Falle, wenn tatsächliche Eingang zur vorherigen Eingabe, zum Beispiel gleich ist:

Insert Textbox ist eine Zeichenfolge „word1“, drücken Sie die Eingabetaste weiter verarbeiten. Also muss es in der Liste aufgezeichnet werden, und wenn die folgende Einfügung gleich dieser vorherigen Einfügung ist, mit demselben "word1", benachrichtige mich über diese Gleichheit, entferne diese Zeichenkette von der Liste und ändere sie in tatsächliches "word1", und wenn als nächstes Einfügen wird gleich wieder sein, mach dasselbe.

Aber wenn insert "word1" ist, muss es in diese Liste aufgenommen werden, und wenn die folgende Einfügung ungleich dieser vorherigen Einfügung ist, entferne diese Zeichenfolge aus der Liste und ändere sie in tatsächliches "word2", um einen solchen Fall zu vermeiden Wenn insert ist "word1", und folgende Einfügung ist "word2" nicht gleich zu diesem vorherigen, und dann nächsten folgenden einfügen ist "word1" wieder gleich vor dem letzten, sollte es nicht als Wiederholung betrachtet werden.

Also ich will Benachrichtigung der Wiederholung nur zwischen tatsächlichen und vorraus, oder anders gesagt tatsächlichen und nächsten Inserts bekommen.

mehr klar sein, ich will genau diese Logik, die nur mit Konsolenanwendung mit dem gewünschten Ergebnis funktioniert:

static void Main(string[] args) 
    { 
     var words = new List<string>(); 

     while (true) 
     { 
      Console.Write("Add word: "); 
      var input = Console.ReadLine(); 

      if (words.Contains(input)) 
      { 
       Console.WriteLine($"{input} is already in the list!"); 
       continue; 
      } 
      words.Clear(); 
      words.Add(input); 
     }   
     Console.ReadLine(); 
    } 

aber es hat funktioniert nicht mit Textbox, bekam ich gleiches Ergebnis wie mit dem Code oben: Jeder Anfrage als bereits vorhanden. And while (true) Schleifen im endlosen Zyklus, weil das gleiche hier passiert, ist tatsächlich gleich.

Auch habe ich auf diese Weise versucht, über wiederholte Text passieren Wertvariable rpt Feld aber es funktioniert nicht funktioniert:

string OldText = string.Empty; 
private void textBox1_GotFocus(object sender, EventArgs e) 
{ 
    OldText = textBox1.Text; 
} 

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    string newText = textBox1.Text; 

    if (newText == OldText) 
    { 
     rpt = (rpt = 1); 
    } 
    else 
    { 
     rpt = (rpt = 0); 
    } 
} 
+0

nicht sicher für UI, was Sie verwenden? Winformen? ASP.net? Sie können eine statische Variable erstellen und für das Ereignis textbox_changed (im Fall von winforms) oder onblur (wenn Sie js verwenden) den aktuellen Wert des Textfelds mit der statischen Variablen vergleichen. Hoffe, dass hilft! –

+0

@Dirty Entwickler Hallo, winforms. Ich habe versucht mit textbox_changed Event ist es jetzt zeigen, habe ich meine Frage bearbeitet, aber immer noch nicht herausfinden –

+0

Was sind die "Doppel-Zuweisungen (' rpt = (rpt = 1) ') gut für? Im Zweifelsfall vergleichen 'string's (Objekte im allgemeinen) mit' .Equals' ('object.Equals (x, y)', wenn weder _known_ noch 'null' ist. – greybeard

Antwort

0

Ich habe es mit einfachen Code versucht. Verwenden Sie _Leave Ereignis von Textfeld. Stellen Sie außerdem sicher, dass Sie die Liste löschen, bevor Sie neue Werte eingeben. Auch ich habe die Liste Variable auf Klassenebene deklariert:

List<string> a = new List<string>(); 

private void textBox1_Leave(object sender, EventArgs e) 
    { 

     if(a.Contains(textBox1.Text)) 
     { 
      MessageBox.Show("Notify"); 
     } 
     else 
     { 
      a.Clear(); 
      a.Add(textBox1.Text); 
     } 
    } 
+0

sieht aus, es muss funktionieren, aber nicht, ich auch überprüfte es, wenn Wert mit Label neben dem 'MessageBox.Show ("Notify") aktualisiert wurde; ', aber nicht, keine Änderungen. Kann nicht bekommen, was hier falsch ist. –

+0

Nicht sicher, was ist das Problem mit Ihrem Winform habe ein neues winform erstellt und eine Testanwendung erstellt und es funktioniert gut für mich :) können Sie bitte das vollständige Design sowie Code? –

+0

mit roher Einfügung oder mit Regex-Korrekturen für eingefügten Text mit textBox1_TextChanged Ereignis Ich habe das gleiche Ergebnis. Nicht sicher, welcher Teil von mir muss zur Verfügung stellen, es ist groß, ein Teil, der in Beziehung steht, macht nichts, Fügen Sie einfach textBox1_KeyDown und dann (e.KeyCode == Keys.Enter) ein. textBox1_TextChanged ist leer, aber wenn ich dort regex, kein mater, dasselbe Ergebnis, nichts –

0

Sie benötigen keine List benötigen, weil Sie nur gegen zuletzt eingefügten Wert vergleichen möchten. Instanz der Zeichenfolge ist genug.

Zum Beispiel, wenn Ihr Formular drei TextBoxen haben. Sie können den Eventhandler Leave verwenden, da Sie den zuletzt eingefügten Text nur überprüfen möchten, wenn der Benutzer mit der aktuellen TextBox fertig ist und zum anderen Text wechselt. TextChanged wird jedes Mal erhöht werden Sie Zeichen hinzufügen oder entfernen

public class MyForm : Form 
{ 
    private string _LastInsertedText; 

    public MyForm() 
    { 
     thisTextBox1.Leave += TextBox_Leave; 
     thisTextBox2.Leave += TextBox_Leave; 
     thisTextBox3.Leave += TextBox_Leave; 
    } 

    private void TextBox_Leave(object sender, EventArgs e) 
    { 
     var textBox = (TextBox)sender; 
     if(textbox.Text.Equals(_LastInsertedText)) 
     { 
      // notify about same value 
     } 
     else 
     { 
      _LastInsertedText = textbox.Text 
     } 
    } 
} 

Es wird nur mitteilen, wenn Sie den Fokus auf ein anderes Steuerelement

Wenn Sie benachrichtigen möchten über Gleichheit nur dann, wenn eingefügt Wert derselben zu bewegen ist, wie zuvor in diesem eingefügt TextBox, dann verwenden Sie TextBox.Tag Eigenschaft

private void TextBox_Leave(object sender, EventArgs e) 
{ 
    var textBox = (TextBox)sender; 
    var previousText = (string)textbox.Tag; 
    if(textbox.Text.Equals(previousText)) 
    { 
     // notify about same value 
    } 
    else 
    { 
     textbox.Tag = textbox.Text 
    } 
} 
+0

Hallo, ich bin mir nicht sicher, was hier falsch ist, habe ich keine Updates oder Regex auf textbox_change Ereignis, aber wenn ich diesen Code TextBox_Leave mit textbox.Tag verwende, habe ich das gleiche Ergebnis, wie mit Lösung von Dirty Developer. Er sagt mir nichts über den gleichen Wert, keine Änderungen. Es gibt nichts besonderes, zwischen vorherigen und tatsächlichen Einfügen, Benutzer schreibt Text, dann drücken Sie die Eingabetaste, ich entfernte sogar die Reinigung des Textfeldfeldes nach dem Drücken der Eingabetaste, wenn es Ursache sein kann, aber nicht, es funktioniert nicht –

+0

@TimR, sind Bist du sicher, dass 'Enter' (Bruchlinie) nicht zum Eingabewert hinzugefügt wird? kannst du deinen Code zeigen, den du hast. – Fabio

+0

Ja sicher, ich habe es mit Regex und ohne für solche Möglichkeiten überprüft, aber das Ergebnis ist das gleiche, kein mater, wenn es absolut roh einfügen oder mit verschiedenen Korrekturen für eingefügten Text mit 'textBox1_TextChanged' Ereignis.Nicht sicher, welcher Teil des Codes zu zeigen ist, ist es groß, aber Code, der in Verbindung mit Textfeld ist, gibt es nichts besonderes, fügen Sie 'textBox1_KeyDown' und dann' (e.KeyCode == Keys.Enter) 'ein. textBox1_TextChanged ist leer, aber kein mater, wenn ich Regex-Korrekturen verwende, in beiden Fällen habe ich kein gewünschtes Ergebnis –

Verwandte Themen