在我的C#Windows窗体MyForm中我有一些TextBoxes。 在这些TextBox中,我们必须检测TextChanged事件是否发生, 如果这些TextBox中有更改并单击关闭按钮,它将询问我们是否要在关闭表单时取消更改。 但是,当我运行MyForm时,我无法知道用户输入没有textchanged事件属性导致的每个文本框的文本更改。 但我在想如何让TextBox的TextChanged知道 用户输入没有textchanged事件的事件? 感谢帮助。 抱歉我的英文。
答案 0 :(得分: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
属性进行区分。
答案 1 :(得分:0)
可能的方法是使用计时器。有一个计时器,每1000毫秒(例如),并检查textBox.Text。
第二种可能的方法是覆盖文本框的WndProc
(通过继承新类)并处理更改文本消息。这与覆盖TextBox.OnTextChanged
相同。
答案 2 :(得分:0)
为什么不使用计时器,如果文本框包含任何文本,将在几个时间间隔后检查