Windows表单在离开事件时更改了文本

时间:2009-04-30 20:22:25

标签: c# .net winforms events

也许我只是一个白痴,但我似乎无法找到一个会在离开的同时触发文本框的事件,但只有当文本框的内容发生变化时才会触发。有点像textchanged和leave的组合。我不能使用textchanged,因为它会在每次击键时触发。现在我将文本框的当前值存储在一个变量中,并在离开事件中进行比较,但它似乎真的很乱。

由于

2 个答案:

答案 0 :(得分:7)

您可以创建自己的(派生)类,该类覆盖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);
        }
    }

答案 1 :(得分:2)

@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);
  }
}