在我的 C# Windows 窗体 MyForm 中,我有一些文本框。在这些TextBoxes中,我们要检测是否发生TextChanged事件,如果这些TextBoxes发生变化并点击关闭按钮,当我们关闭表单时它会询问我们是否要取消更改。但是,当我运行 MyForm 时,我无法知道由于用户键入 for 而没有 textchanged 事件属性而导致的每个文本框的文本更改。但我在想如何让 TextBox 的 TextChanged 知道用户在没有 textchanged 事件的情况下键入导致的事件?感谢帮助。对不起我的英语不好。
3 回答
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
文本框的属性来区分。
一种可能的方法是使用计时器。有一个计时器,每 1000 毫秒(例如)滴答一次并检查 textBox.Text。
第二种可能的方法是覆盖WndProc
文本框(通过继承一个新类)并处理更改文本消息。这与覆盖相同TextBox.OnTextChanged
。
你为什么不使用一个计时器,它会在几个间隔后检查文本框是否包含任何文本