【问题标题】:How can I know Text changes for textboxes without Textchanged event我如何知道没有 Textchanged 事件的文本框的文本更改
【发布时间】:2013-01-07 07:54:28
【问题描述】:

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

【问题讨论】:

  • 比较新旧值
  • 你还没有真正解释为什么你不能使用TextChanged事件。
  • 因为 Myform 有很多文本框,如果没有文本更改,这将不会显示确认消息。如果我捕获所有文本框的 textchanged 事件,这就是这么多代码。
  • 您可以编写 one 处理程序,然后当您的表单初始化时,您可以循环遍历表单上的所有控件,并且每个控件都是 TextBox ,您可以将相同的处理程序附加到它们。这不是很多代码。
  • 所以..你的答案对我有帮助。你能给我这个示例代码吗?谢谢....

标签: c# winforms


【解决方案1】:

如果没有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 属性来区分。

【讨论】:

  • 感谢您的回答。现在我正在为多个控件示例代码寻找一个处理程序。我认为这会对我有所帮助。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这是一个使用计时器 Tick 事件检测文本框中的文本是否更改的简单示例。 private void timer1_Tick(object sender, EventArgs e) { if (textBox1.Text != "") { MessageBox.Show("Not Empty"); } }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多