需要更改文本框.文本中的文本更改,某些东西强制形式关闭
本文关键字:文本 | 更新日期: 2023-09-27 18:31:11
我正在使文本框的行为就像它可以存储空值一样。为了做到这一点,我有一个变量 NullMode 指示存储的值是否为 Null,在 TextChanged 中我将其设置为 false,在特定用户操作中,我将其设置为 true,将文本设置为指示文本框内有 null 的值。然后,基于空模式,文本框的绘制方式不同。
现在,我有一种类似信号量的方法,以防止在不需要事件句柄时触发它。下面是它的外观:
private void input_TextChanged(object sender, EventArgs e)
{
if (_preventTextBoxEvents)
return;
_preventTextBoxEvents = true;
//if (NullMode)
// Text = "";
NullMode = false;
ValidateInput();
_preventTextBoxEvents = false;
}
现在,如果我需要将文本框文本设置为在 null 模式下应该显示的内容,我只需在 true 之前将_preventTextBoxEvents设置为 true,它就可以正常工作。
但!当用户尝试在文本框中输入内容时,我还需要删除文本!所以我需要将文本设置为"。问题是,如果我取消注释,则在事件处理程序退出后表单将关闭。我无法阻止它(e.Cancel = true in FormClose无济于事!)并且不明白是什么原因造成的。也没有错误消息(而且我没有做 try-catch)。
我的逻辑,当我做文本="时。OnTextChanged 应该触发,它应该调用我的 TextChanged,它会看到_preventTextBoxEvents是真的并退出,所以不会有堆栈溢出/无限递归。
这是怎么回事?
应该是这样(假设您的文本框被称为input
)
if (NullMode)
input.Text = "";
文本本身是指当前表单标题,而不是输入。文本属性。
但是,我要说,你的做法是危险的。如果由于某种原因,您的 ValidateInput 引发异常,您将退出事件处理程序,而不会将全局_preventTextBoxEvents恢复为 false;
添加尝试 - 捕获 - 最后
private void input_TextChanged(object sender, EventArgs e)
{
if (_preventTextBoxEvents)
return;
_preventTextBoxEvents = true;
try
{
if (NullMode) input.Text = "";
NullMode = false;
ValidateInput();
}
catch(Exception ex)
{
// Inform user of the exception occurred inside your ValidateInput
MessageBox.Show(ex.Message);
}
finally
{
// Be sure to restore this global to a functioning value.
_preventTextBoxEvents = false;
}
}
此外,您可以删除_preventTextBoxEvents程序输入事件代码时简单地断开 TextChanged 事件的逻辑:
try
{
input.TextChanged -= new EventArgs(input_TextChanged);
// Now, the input textbox is no more connected to this code, you
// could happily change the textbox text without worry to reenter in this code
}
...
finally
{
// Work finished, reconnect this code to the event TextChanged
input.TextChanged += new EventArgs(input_TextChanged);
}