c# - 我怎么知道没有 Textchanged 事件的文本框的文本更改

标签 c# winforms

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

最佳答案

如果没有 TextChangedLeave 事件,就没有(体面的)方法知道键入的内容。

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

如果没有这个,比较旧值和新值就没有意义,因为在不知道某些内容已更改的情况下,您将不知道应该将值设置为什么。

有一个异常(exception):如果您的原始数据来自数据库,您可以使用比较旧/新方法,就像比较来自数据库的文本框一样。

更新:

解决这个评论:

"Because Myform have many textboxes and if no text change ,this will not display the confirm message.If I catch textchanged event for all textboxes, this is so many code."

您可以使用一个通用的处理程序在一个方法中收集所有文本框的更改。如果需要,使用 sender 对象(将其转换为 Textbox)来识别更改了哪个文本框,或者简单地为发生更改的任何文本框设置脏标志。

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 属性进行区分。

关于c# - 我怎么知道没有 Textchanged 事件的文本框的文本更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14191932/

相关文章:

c# - 如何格式化运算符 C++ Visual Studio 之间的空间?

C# CommandLineParser --help 打印然后停止

c# - 通过 <tab> 接收焦点时修改按钮样式,但在单击时不修改

c# - 如何以编程方式滚动面板

c# - 同步两个 DataGridView 的水平滚动事件

c# - 用于查找属性的 Lambda 表达式

c# - SQL QUERY 显示添加到表中的最新数据

c# - 向 numericUpDown 值添加符号(如 %)

c# - 从类更新标签上的文本

c# - 使用 Task.Run 运行时用户控件卡住