2009-04-30 14 views
3

Vielleicht bin ich nur ein Idiot, aber ich kann nicht scheinen, ein Ereignis zu finden, das für eine Textbox gleichzeitig mit dem Urlaub ausgelöst wird, aber nur wenn der Inhalt der Textbox hat sich verändert. Ein bisschen wie eine Kombination von Text geändert und verlassen. Ich kann Textchange nicht verwenden, da es bei jedem Tastendruck ausgelöst wird. Momentan speichere ich den aktuellen Wert der Textbox in einer Variablen und vergleiche sie mit dem Leave-Ereignis, aber es scheint wirklich hackisch zu sein.Windows Formulare Text geändert auf Urlaub Veranstaltung

Dank

Antwort

6

Sie können Ihre eigene (abgeleitet) Klasse erstellen, die OnEnter, OnLeave und OnTextChanged überschreibt Flaggen und Trigger „Ihr“ Ereignis einzustellen.

Etwas wie folgt aus:

public class TextBox: System.Windows.Forms.TextBox { 
     public event EventHandler LeaveWithChangedText; 

     private bool textChanged; 

     protected override void OnEnter(EventArgs e) { 
      textChanged = false; 
      base.OnEnter(e); 
     } 

     protected override void OnLeave(EventArgs e) { 
      base.OnLeave(e); 
      if (textChanged) { 
       OnLeaveWithChangedText(e); 
      } 
     } 

     protected virtual void OnLeaveWithChangedText(EventArgs e) { 
      if (LeaveWithChangedText != null) { 
       LeaveWithChangedText(this, e); 
      } 
     } 

     protected override void OnTextChanged(EventArgs e) { 
      textChanged = true; 
      base.OnTextChanged(e); 
     } 
    } 
+0

Ja, das ist wahrscheinlich ein besserer Ansatz als das, was ich tue. Ich wollte nur sicherstellen, dass ich nicht etwas Offensichtliches verpasse ... – Rob

+0

Wow ... das ist beeindruckend .. Ich habe nicht überlegt, beide Ereignisse zu überschreiben ... verdammt gute Idee .. – Rob

+0

Diese Lösung deckt nicht einen Fall ab: Wenn der Benutzer den Text bearbeitet, aber schließlich den gleichen Text wie in der Textbox eingibt, wird das Ereignis weiterhin ausgelöst. Sie müssten den Inhalt zu dem Zeitpunkt vergleichen, an dem die Textbox dem Inhalt zum Zeitpunkt des Eingebens in die Textbox überlassen wird. –

1

Die Antwort von @Lucero tut es fast perfekt Job.
Es behandelt jedoch nicht den Fall, wenn ein Benutzer den Text bearbeitet und schließlich den gleichen Wert wie zuvor eingibt. Deshalb habe ich eine ähnliche Lösung für meine eigenen (in C++/CLI, aber man kann es leicht zu C# anpassen):

public ref class EventArgsCTextBox1 : EventArgs 
{ 
public: 
    String^ PreviousText; 
}; 

public ref class CTextBox1 : Windows::Forms::TextBox 
{ 
public: 
    virtual void OnEnter (EventArgs^ i_oEventArgs) override; 
    virtual void OnLeave (EventArgs^ i_oEventArgs) override; 

    delegate void EventHandlerCTextBox1 (Object^ i_oSender, EventArgsCTextBox1^ i_oEventArgs); 
    event EventHandlerCTextBox1^ LeaveChanged; 

private: 
    String^ m_sValue; 
}; 

void CTextBox1::OnEnter (System::EventArgs^ i_oEventArgs) 
{ 
    TextBox::OnEnter (i_oEventArgs); 
    m_sValue = this->Text; 
} 

void CTextBox1::OnLeave (System::EventArgs^ i_oEventArgs) 
{ 
    TextBox::OnLeave (i_oEventArgs); 
    if (m_sValue != this->Text) 
    { 
    EventArgsCTextBox1^ oEventArgs = gcnew EventArgsCTextBox1; 
    oEventArgs->PreviousText = m_sValue; 
    LeaveChanged (this, oEventArgs); 
    } 
} 
+0

Spiffy .... Nun, wenn ich mich nur daran erinnern könnte, welches Projekt ich für/gebraucht habe: (vor 6 Jahren, mein Gedächtnis wird unscharf) – Rob

+0

Ich habe auch nicht wirklich erwartet, dass du deinen Code jetzt änderst. ;-) –

+0

Nun, ich/habe mich daran erinnert, dass es ein Problem ist, aber ich habe keine Ahnung, welches Projekt es war. Ich hätte das vielleicht sogar implementiert, aber normalerweise bin ich gut darin, meine Antwort mit den Details zu aktualisieren. Danke dafür trotzdem. – Rob

Verwandte Themen