2009-04-30 2 views
3

Возможно, я просто идиот, но я не могу найти событие, которое будет срабатывать для текстового поля одновременно с отпуском, но только тогда, когда содержимое текстового поля изменилось. Своего рода комбинация textchanged и уйти. Я не могу использовать textchanged, потому что он срабатывает при каждом нажатии клавиши. Прямо сейчас я сохраняю текущее значение текстового поля в переменной и сравниваю его с событием leave, но он кажется действительно взломанным.Формы Windows Текст Изменен при отпускании

Благодаря

ответ

6

Вы можете создать свой собственный (производный) класс, который переопределяет 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); 
     } 
    } 
+0

Да, это, вероятно, лучший подход, чем то, что я делаю. Я просто хотел удостовериться, что у меня не было чего-то очевидного ... – Rob

+0

Ничего себе ... это впечатляет .. Я не рассматривал переопределение обоих событий ... черт возьми, хорошая идея .. – Rob

+0

Это решение не распространяется на один случай: Когда пользователь редактирует текст, но, наконец, вводит тот же текст, что и в текстовом поле, событие все равно будет срабатывать. Вам нужно будет сравнить содержимое в то время, когда текстовое поле будет размещено в содержимом, входящем в текстовое поле, для его обработки. –

1

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

Spiffy .... Теперь, если бы я мог просто запомнить, какой проект мне нужен для /: (6 лет назад моя память размыта) – Rob

+0

Я тоже не ожидал, что вы измените свой код сейчас. ;-) –

+0

Ну, я/сделал/помню, что это проблема, но я понятия не имею, какой проект был. Возможно, я даже реализовал это, но обычно мне хорошо, что я обновляю свой ответ с подробностями. Спасибо за это независимо. – Rob

Смежные вопросы