我正在使 TextBox 的行为就像它可以存储空值一样。为了做到这一点,我有一个变量 NullMode 指示存储的值是否为 Null,在 TextChanged 中我将其设置为 false,在特定的用户操作中我将其设置为 true,将 Text 设置为指示存在的值文本框内为空。然后,基于 NullMode,以不同的方式绘制文本框。
现在,我有一种类似信号量的方法,以防止在我不需要事件句柄时触发它。这是它的外观:
private void input_TextChanged(object sender, EventArgs e)
{
if (_preventTextBoxEvents)
return;
_preventTextBoxEvents = true;
//if (NullMode)
// Text = "";
NullMode = false;
ValidateInput();
_preventTextBoxEvents = false;
}
现在,如果我需要将文本框文本设置为在 null 模式下应该显示的内容,我只需在执行之前将 _preventTextBoxEvents 设置为 true,它就可以正常工作。
但!当用户尝试在文本框中输入内容时,我还需要删除文本!所以我需要将文本设置为“”。问题是,如果我取消注释,表单在事件处理程序退出后关闭。我无法阻止它(FormClosing 中的 e.Cancel = true 无济于事!)并且不明白是什么原因造成的。也没有错误消息(而且我没有尝试捕获)。
我的逻辑,当我做 Text="" 时。OnTextChanged 应该触发,它应该调用我的 TextChanged 并且它会看到 _preventTextBoxEvents 为真并退出,因此不会有堆栈溢出/无限递归。
到底是怎么回事?