c# - 需要更改 TextChanged 中的 TextBox.Text,有些东西会强制关闭

标签 c# winforms textbox

我正在使 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 没有帮助!)并且不明白是什么导致了它。也没有错误消息(我没有做 try-catch)。

我的逻辑,当我做 Text=""。 OnTextChanged 应该触发,它应该调用我的 TextChanged 并且它会看到 _preventTextBoxEvents 为真并退出,所以不会有堆栈溢出/无限递归。

这是怎么回事?

最佳答案

应该是这样(假设你的文本框叫做input)

if (NullMode) 
    input.Text = ""; 

单独的文本是指当前表单标题,而不是 input.Text 属性。
但是让我说你的方法很危险。如果出于某种原因,您的 ValidateInput 抛出异常,您将退出事件处理程序而不将全局 _preventTextBoxEvents 恢复为 false;

添加一个try-catch-finally

    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);
}

关于c# - 需要更改 TextChanged 中的 TextBox.Text,有些东西会强制关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10153274/

相关文章:

c# - 如何在 WPF 中使用左右键在 tabitem 之间导航

c# - 传递控件的正确方法是什么?

javascript - 使用 jquery 进行条件验证

vb.net - 我怎样才能 DoubleBuffer 一个 winforms Treeview?

.net - 使用类似 IE 的着色和折叠节点在 WinForms 应用程序中显示 XML 文件

css - Angular JS 中搜索文本中的 Material 图标

c# winforms events 在转义时恢复文本框内容

c# - 什么时候缓存任务?

c# - 使用.NET加密库在c#中使用.pem文件的私钥解密

c# - 如何使Unity中的C#与Python通信