【问题标题】:Windows forms Text Changed on leave eventWindows 窗体文本在休假事件中更改
【发布时间】:2009-04-30 20:22:24
【问题描述】:

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

谢谢

【问题讨论】:

    标签: c# .net winforms events


    【解决方案1】:

    您可以创建自己的(派生的)类来覆盖 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】:

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

    【讨论】:

    • Spiffy....现在,如果我能记住我需要这个用于什么项目/:(6年前,我的记忆变得模糊)
    • 我也没想到您现在更改了代码。 ;-)
    • 好吧,我 /did/ 记得这是个问题,但我不知道它是什么项目。我什至可能已经实现了这一点,但通常我很乐意用细节重新更新我的答案。不管怎样,谢谢你。
    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2021-12-12
    • 1970-01-01
    • 2011-07-03
    • 2022-08-23
    • 1970-01-01
    相关资源
    最近更新 更多