Ответ @Lucero делает его работу почти идеально.
Однако он не обрабатывает случай, когда пользователь редактирует текст и, наконец, вводит то же значение, что и раньше. Поэтому я создал подобное решение для моей (в C++/CLI, но вы можете легко адаптировать его к C#):
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);
}
}
Да, это, вероятно, лучший подход, чем то, что я делаю. Я просто хотел удостовериться, что у меня не было чего-то очевидного ... – Rob
Ничего себе ... это впечатляет .. Я не рассматривал переопределение обоих событий ... черт возьми, хорошая идея .. – Rob
Это решение не распространяется на один случай: Когда пользователь редактирует текст, но, наконец, вводит тот же текст, что и в текстовом поле, событие все равно будет срабатывать. Вам нужно будет сравнить содержимое в то время, когда текстовое поле будет размещено в содержимом, входящем в текстовое поле, для его обработки. –