也许我只是一个白痴,但我似乎无法找到一个事件,它将在离开时同时触发文本框,但仅当文本框的内容已经改变。有点像textchanged和leave的组合。我无法使用textchanged,因为它会在每次击键时触发。现在,我将文本框的当前值存储在一个变量中,并将其与离开事件进行比较,但似乎真的很骇人听闻。Windows窗体文本在离开事件时发生变化
感谢
也许我只是一个白痴,但我似乎无法找到一个事件,它将在离开时同时触发文本框,但仅当文本框的内容已经改变。有点像textchanged和leave的组合。我无法使用textchanged,因为它会在每次击键时触发。现在,我将文本框的当前值存储在一个变量中,并将其与离开事件进行比较,但似乎真的很骇人听闻。Windows窗体文本在离开事件时发生变化
感谢
您可以创建自己的(派生)类,它覆盖的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);
}
}
@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);
}
}
是啊,这可能比我在做什么更好的方法。我只是想确保我没有错过一些明显的东西... – Rob 2009-04-30 20:25:21
哇......这令人印象深刻..我没有考虑重写这两个事件......该死的好主意...... – Rob 2009-04-30 20:30:12