1
votes

Rendre une zone de texte visible masque toute la mise en forme

Je crée actuellement une application Windows Form sur Visual Studio en C #. J'ai quelques zones de texte dans lesquelles je veux que l'utilisateur entre des éléments, puis cette information est vérifiée si elle existe, sinon, une erreur est générée et une zone de texte indiquant "Fichier non valide" est censée apparaître, en rouge. Cependant, actuellement, lorsque j'active sa visibilité, elle apparaît simplement comme une boîte vide, sans couleur et sans mise en forme. Voici le code que j'utilisais:

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

C'est ce que je veux ressembler à
Voici à quoi cela ressemble


9 commentaires

textBox9.BackColor = System.Drawing.Color.Red;


1) Ce n'est pas une bonne idée d'utiliser des exceptions pour piloter la logique et 2) Vous ne voulez probablement pas verrouiller votre thread d'interface utilisateur pendant 3 secondes, donc vous ne voulez probablement pas dormir non plus.


La zone de texte est déjà définie sur rouge pour commencer, j'ai ajouté ce que vous avez dit avec le code de visibilité en vain.


Je veux dire, merci pour les conseils mais cela ne m'aide pas vraiment avec le problème


Si vous cachez quoi que ce soit, il disparaîtra. C'est le but de «visible = faux».


où définissez-vous la couleur rouge et le texte?


Juste dans le formulaire Windows au début, la zone de texte est juste rouge pour commencer


@DomBeasley lorsque vous déboguez votre code et définissez le point d'arrêt sur texbox9.Visible, où le formatage change-t-il? avant la méthode Sleep () ou après?


Si vous essayez de mettre à jour le contrôle sur le thread d'interface utilisateur, vous bloquez ce thread avec Sleep. Le contrôle ne sera mis à jour qu'une fois que vous aurez quitté cet événement - à ce moment-là, vous aurez à nouveau masqué le contrôle. C'est un problème similaire à la mise à jour d'une barre de progression sur le fil de l'interface utilisateur - informations ici: stackoverflow.com/questions/30905220/... Il existe une méthode d'extension pour actualiser un contrôle ici: social.msdn.microsoft.com/Forums/vstudio/en-US/...


3 Réponses :


-1
votes

Si je comprends bien, vous essayez de faire fonctionner la zone de texte pendant 3 secondes, puis de disparaître, si tel est le cas, le code dont vous avez besoin ressemblerait à ceci

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

MODIFIER: Ce code est nécessaire parce que vous ne voulez pas suspendre tout le thread, attendez simplement 3 secondes, puis faites-le disparaître, comme vous le faites, vous gelez toute l'application si vous n'utilisez pas de threads

EDIT2: It ne montre rien parce que vous bloquez le fil avant qu'il ne se dessine sur votre écran et que vous définissez la zone de texte masquée. Donc rien ne s'affichera


7 commentaires

C'est un excellent code, mais vous n'avez pas répondu à la question de savoir pourquoi le formatage disparaît lorsque la visibilité est définie sur FALSE.


@BlackFrog j'ai supposé en raison des images que le problème ne montrait rien du tout. Et c'est parce qu'il fige l'interface en utilisant Thread.sleep. Et puis il se termine et son désactivé. J'ajouterai que c'est à cause de la visibilité du message de toute façon. Merci


L'opérateur 'await' ne peut être utilisé que dans une méthode anonyme asynchrone. Pensez à marquer cette méthode anonyme avec le modificateur «async».


vérifiez maintenant s'il vous plaît, si cela ne fonctionne pas, j'aurai besoin de plus de temps pour réviser le code


Je suis un peu dérangé, je posterai celui qui fonctionne


Task.Run exécutera le code sur un thread différent. Vous ne devez pas accéder aux contrôles GUI à partir d'autres threads sur lesquels le formulaire a été créé.


@NineBerry C'est la raison pour laquelle le code utilise l'appel



-1
votes
        private void DisplayError()
    {
        Task.Run(async () => (
                 this.Invoke(new Action(async delegate () {
                     textBox9.Visible = true;
                     await Task.Delay(3000);
                     textBox9.Visible = false;
                 }))));
    }
Thanks to nalnpir for the basis of this. This works for me.

5 commentaires

Compte tenu de ce que vous montrez, j'ai 2 observations à ce sujet. Tout d'abord, l'asynchrone de Task.Run n'est pas nécessaire. Deuxièmement, vous devez modifier la réponse à votre question pour des références futures plus faciles et supprimer celle-ci. Je suis content que vous ayez pu trouver la réponse


@nalnpir Si c'est une réponse, pourquoi devrait-il la supprimer?


N'est-il pas courant lorsque l'OP résout la question d'éditer le message et de le mettre sur la question d'origine?


@nalnpir, non, pas sur StackOverflow. Les questions doivent rester des questions, les réponses doivent être des réponses. Gardez-les séparés.


@nalnpir Je n'ai pas beaucoup d'idée de ce que je fais pour ça, ça marche donc ça me va. Je suis reconnaissant pour votre aide



0
votes

Bien sûr, tout va être exécuté maintenant.

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

Edit:

J'ai vu le commentaire, et c'est vrai Thread bloquera tout le code pendant 3 secondes . J'ai donc une autre option, quelque chose comme ça:

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


1 commentaires

Votre appel de veille (comme la question d'origine) est en cours d'exécution sur le fil de l'interface graphique, il bloquera donc tout pendant 3 secondes.