1

在我的 C# Windows 窗体 MyForm 中,我有一些文本框。在这些TextBoxes中,我们要检测是否发生TextChanged事件,如果这些TextBoxes发生变化并点击关闭按钮,当我们关闭表单时它会询问我们是否要取消更改。但是,当我运行 MyForm 时,我无法知道由于用户键入 for 而没有 textchanged 事件属性而导致的每个文本框的文本更改。但我在想如何让 TextBox 的 TextChanged 知道用户在没有 textchanged 事件的情况下键入导致的事件?感谢帮助。对不起我的英语不好。

4

3 回答 3

4

TextChanged在没有事件或事件的情况下,没有(体面的)方法可以知道输入的内容Leave

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

如果没有这个,比较新旧值是没有意义的,因为你不知道应该设置什么值而不知道有什么改变。

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

更新:

解决此评论:

“因为 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文本框的属性来区分。

于 2013-01-07T08:03:16.607 回答
0

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

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

于 2013-01-07T08:10:27.967 回答
0

你为什么不使用一个计时器,它会在几个间隔后检查文本框是否包含任何文本

于 2013-01-07T11:52:16.663 回答