如何在没有Textchanged事件的情况下知道文本框的文本更改

时间:2013-01-07 07:54:29

标签: c# winforms

在我的C#Windows窗体MyForm中我有一些TextBoxes。 在这些TextBox中,我们必须检测TextChanged事件是否发生, 如果这些TextBox中有更改并单击关闭按钮,它将询问我们是否要在关闭表单时取消更改。 但是,当我运行MyForm时,我无法知道用户输入没有textchanged事件属性导致的每个文本框的文本更改。 但我在想如何让TextBox的TextChanged知道 用户输入没有textchanged事件的事件? 感谢帮助。 抱歉我的英文。

3 个答案:

答案 0 :(得分:4)

在没有TextChangedLeave事件的情况下,没有(体面的)方式知道输入的内容。

您需要使用其中一个事件来获取输入的内容。这样做可以设置一个“脏”标志,您可以在关闭时检查并在保存时清除。

如果没有这个原因,比较旧值和新值是没有意义的,如果不知道某些内容发生了变化,你就不会知道应该设置什么值。

有一个例外:如果您的原始数据来自数据库,您可以使用比较旧/新方法,因为您将比较来自数据库的文本框。

更新

发表此评论:

  

“因为Myform有很多文本框,如果没有文本更改,这将会   不显示确认消息。如果我捕获所有的textchanged事件   文本框,这是很多代码。“

您可以使用通用处理程序在一个方法中收集所有文本框的更改。使用sender对象(将其强制转换为文本框)以确定更改了哪个文本框(如果需要),或者只是为任何文本框进行更改设置脏标记。

bool isDirty = false;

void SomeInitMethod() //ie. Form_Load
{
    textbox1.TextChanged += new EventHandler(DirtyTextChange);
    textbox2.TextChanged += new EventHandler(DirtyTextChange);
    textbox3.TextChanged += new EventHandler(DirtyTextChange);
    //...etc
}
void DirtyTextChange(object sender, EventArgs e)
{
    isDirty = true;
}
void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    if (isDirty) {
        //ask user
    }
}

// to clear
void Save()
{
    SaveMyDataMethod();
    isDirty = false;
}

如果表单控件集合中的表单循环中有批次文本框,请使用typeof来解决文本框问题。如果您有需要不同方法的文本框,请使用文本框的Tag属性进行区分。

答案 1 :(得分:0)

可能的方法是使用计时器。有一个计时器,每1000毫秒(例如),并检查textBox.Text。

第二种可能的方法是覆盖文本框的WndProc(通过继承新类)并处理更改文本消息。这与覆盖TextBox.OnTextChanged相同。

答案 2 :(得分:0)

为什么不使用计时器,如果文本框包含任何文本,将在几个时间间隔后检查