Когда текстовое поле становится видимым, скрывает все форматирование - PullRequest
0 голосов
/ 14 января 2019

В настоящее время я делаю приложение формы Windows на Visual Studio в C #. У меня есть пара текстовых полей, в которые я хочу, чтобы пользователь ввел некоторые данные, и затем эта информация проверяется, существует ли она, если нет, выдается ошибка и появляется текстовое поле с надписью «Invalid File», выделенное красным цветом. Однако в настоящее время, когда я включаю его видимость, он просто отображается как пустое поле, без цвета и без форматирования. Вот код, который я использовал:

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

This is what I want it to look like
This is what it does look like

Ответы [ 3 ]

0 голосов
/ 14 января 2019
        private void DisplayError()
    {
        Task.Run(async () => (
                 this.Invoke(new Action(async delegate () {
                     textBox9.Visible = true;
                     await Task.Delay(3000);
                     textBox9.Visible = false;
                 }))));
    }

Благодаря nalnpir за это. Это работает для меня.

0 голосов
/ 14 января 2019

Единственное, что происходит, это то, что txtbox будет видимым, поэтому единственный исполняемый код - это код внутри catch ...

Попробуйте установить все свойства в catch, что-то вроде этого:

Наверняка все будет выполнено сейчас.

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

Edit:

Я видел комментарий, и все верно. Поток заблокирует весь код на 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;
}
0 голосов
/ 14 января 2019

Если я правильно понимаю, вы пытаетесь заставить текстовое поле работать более 3 секунд, а затем уходите, если это так, то код, который вам нужен, будет выглядеть следующим образом

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

РЕДАКТИРОВАТЬ: Этот код необходим, потому что вы не хотите повесить весь поток, просто подождите 3 секунды и затем заставьте его уйти, как вы это делаете, вы замораживаете все приложение, если вы не используете потоки

РЕДАКТИРОВАТЬ 2: Он ничего не показывает, потому что вы замораживаете поток перед тем, как он появится на вашем экране, а затем вы устанавливаете текстовое поле скрытым. Так что ничего не покажет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...