2009-04-30 55 views
3

也许我只是一个白痴,但我似乎无法找到一个事件,它将在离开时同时触发文本框,但仅当文本框的内容已经改变。有点像textchanged和leave的组合。我无法使用textchanged,因为它会在每次击键时触发。现在,我将文本框的当前值存储在一个变量中,并将其与离开事件进行比较,但似乎真的很骇人听闻。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 2009-04-30 20:25:21

+0

哇......这令人印象深刻..我没有考虑重写这两个事件......该死的好主意...... – Rob 2009-04-30 20:30:12

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); 
    } 
} 
相关问题