Windows формы Текст изменен при выходе из события - PullRequest
4 голосов
/ 01 мая 2009

Может быть, я просто идиот, но я не могу найти событие, которое сработает для текстового поля одновременно с отпуском, но только когда содержимое текстового поля изменилось. Вроде как сочетание текстовых сообщений и оставь. Я не могу использовать textaged, потому что он срабатывает при каждом нажатии клавиши. Прямо сейчас я сохраняю текущее значение текстового поля в переменной и сравниваю его с событием отпуска, но оно выглядит по-настоящему хакерским.

Спасибо

Ответы [ 2 ]

7 голосов
/ 01 мая 2009

Вы можете создать свой собственный (производный) класс, который переопределяет OnEnter, OnLeave и OnTextChanged для установки флагов и запуска «вашего» события.

Примерно так:

    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);
        }
    }
2 голосов
/ 13 ноября 2015

Ответ @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);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...