Ответ @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);
}
}