C# 使文本框可见将隐藏所有格式

C# 使文本框可见将隐藏所有格式,c#,winforms,C#,Winforms,我目前正在用C#在Visual studio上制作一个windows窗体应用程序。我有两个文本框,我希望用户在其中输入一些内容,然后检查这些信息是否存在,如果不存在,则抛出一个错误,并显示一个红色的文本框,表示“无效文件”。 然而,目前,当我启用它的可见性时,它只是显示为一个空白框,没有颜色和格式。 以下是我使用的代码: catch { textBox9.Visible = true; System.Threading.Thread.Sleep(3000); textBox9.Vis

我目前正在用C#在Visual studio上制作一个windows窗体应用程序。我有两个文本框,我希望用户在其中输入一些内容,然后检查这些信息是否存在,如果不存在,则抛出一个错误,并显示一个红色的文本框,表示“无效文件”。 然而,目前,当我启用它的可见性时,它只是显示为一个空白框,没有颜色和格式。 以下是我使用的代码:

catch
{
  textBox9.Visible = true;
  System.Threading.Thread.Sleep(3000);
  textBox9.Visible = false;
}


如果我理解正确,您试图使文本框在3秒钟内工作,然后走开,如果是这样,您需要的代码将如下所示

Task.Run(async () => 
  this.Invoke(new Action(delegate (){
    textBox9.Visible = true;
    await Task.Delay(3000)
    textBox9.Visible = false;
}));
编辑:这段代码是必需的,因为你不想挂起整个线程,只需等待3秒钟,然后让它消失,你这样做,如果你不使用线程,你就冻结了整个应用程序

EDIT2:它没有显示任何内容,因为您在线程在屏幕上绘制之前冻结了线程,然后将文本框设置为隐藏。所以什么也看不出来

        private void DisplayError()
    {
        Task.Run(async () => (
                 this.Invoke(new Action(async delegate () {
                     textBox9.Visible = true;
                     await Task.Delay(3000);
                     textBox9.Visible = false;
                 }))));
    }

感谢nalnpir的支持。这对我来说很有用。

它发生的唯一一件事就是txtbox是可见的,所以执行的唯一代码就是catch中的代码

尝试设置catch中的所有属性,如下所示:

catch
{
  textBox9.Text = "Invalid File";
  textBox9.BackColor = Color.Red;
  textBox9.Visible = true;
  int seconds = 3;
        if (seconds < 1) return;
        DateTime _desired = DateTime.Now.AddSeconds(seconds);
        while (DateTime.Now < _desired)
        {
             System.Windows.Forms.Application.DoEvents();
        }
  textBox9.Visible = false;
}
当然,现在所有人都会被处决

catch
{
  textBox9.Text = "Invalid File";
  textBox9.BackColor = Color.Red;
  textBox9.Visible = true;
  Thread.Sleep(3000);
  textBox9.Visible = false;
}
编辑:

我看到了注释,没错,线程将在3秒钟内阻止所有代码。 我还有其他选择,比如:

catch
{
  textBox9.Text = "Invalid File";
  textBox9.BackColor = Color.Red;
  textBox9.Visible = true;
  int seconds = 3;
        if (seconds < 1) return;
        DateTime _desired = DateTime.Now.AddSeconds(seconds);
        while (DateTime.Now < _desired)
        {
             System.Windows.Forms.Application.DoEvents();
        }
  textBox9.Visible = false;
}
catch
{
textBox9.Text=“无效文件”;
textBox9.BackColor=Color.Red;
textBox9.Visible=true;
整数秒=3;
如果(秒<1)返回;
DateTime _desired=DateTime.Now.AddSeconds(秒);
while(DateTime.Now<\u所需)
{
System.Windows.Forms.Application.DoEvents();
}
textBox9.Visible=false;
}

textBox9.BackColor=System.Drawing.Color.Red1)使用异常驱动逻辑不是一个好主意,2)您可能不想在3秒钟内锁定UI线程,因此您可能也不想睡觉。文本框已经设置为红色,我添加了您所说的可见性代码,但没有用。我的意思是,谢谢你的提示,但这并不能真正帮助我解决这个问题。如果你试图更新UI线程上的控件,那么你就用睡眠阻塞了这个线程。只有在退出此事件后,该控件才会被更新-此时您已再次隐藏该控件。这是一个类似于在UI线程上更新progressbar的问题-这里的信息:这里有一个刷新控件的扩展方法:这是一个很棒的代码,但您没有回答的问题是,当可见性设置为FALSE时,为什么格式会消失。@BlackFrog我假设由于图片原因,问题根本没有显示出来。这是因为他使用Thread.sleep冻结了接口。然后它结束了,它被禁用了。我要补充一点,这是因为这篇文章的可见性。Thanks“await”运算符只能在异步匿名方法中使用。考虑用AsiNC修改标记这个匿名方法。现在请检查,如果它不工作,我将需要更多的时间来修改它周围的代码,我将发布一个OnWork提供您所显示的,我有2个观察。首先,不需要Task.Run的异步。第二,你应该编辑问题中的答案,以便于将来参考,并删除此答案。我很高兴你能顺便来answer@nalnpir如果这是一个答案,他为什么要删除它?OP解决问题时编辑帖子并将其放在原始问题上不是很常见吗?@nalnpir,不,不是在StackOverflow上。问题应该是问题,答案应该是答案。把它们分开。@nalnpir我不知道我在做什么,它很有效,所以我很满意。我非常感谢您的帮助您的睡眠呼叫(如原始问题)正在GUI线程上运行,因此它将在3秒钟内阻止所有内容。