none
[Besoin d'aide] Les Controles imbriqués et les problemes de LostFocus RRS feed

  • Question

  • Bonjour à tous,

    Je me permets de venir vers vous pour présenter un probleme rencontré lors de la mise en place d'un client .Net C#.
    Voici le probleme simplifié (tests effectués pour comprendre le probleme) :

    Nous avons défini un premier UserControl composé d'un comboBox et d'un TextBox organisés à l'aide d'un TableLayoutPanel. L'application est abonné à l'évènement Leave du ComboBox. Un messageBox contenant "mauvais mot" est affiché si le mot "ohe" n'est pas entré dans le comboBox lors de sa sortie, et le focus est redonné au comboBox.

    public partial class MyFirstUserControl : UserControl
    {
    private const string _passString = "ohe";

    public MyFirstUserControl()
    {
    InitializeComponent();
    }

    private comboBox1_Leave(object sender, EventArgs e)
    {
    if (comboBox1.Text != passString)
    {
    MessageBox.Show("Mauvais mot !");
    comboBox1.Focus();
    }
    }
    }


    Nous avons ensuite défini un second UserControl Contenant uniquement une instance du premier UserControl (cela ne sert effectivement à rien de faire ça, mais c'est pour l'exemple, afin d'éviter à avoir à expliquer l'ensemble du fonctionnement de notre application...).

    Pour terminer la mise en place de l'exemple, nous avons déposé sur un formulaire vierge une instance du premier UserControl (MyFirstUserControl) ainsi qu'une instance du second (MySecondUserControl). Le focus est préalablement donné au MyFirstUserControl.

    Un clic dans le second UserControl (sans saisie dans le premier au préalable), entraine bien l'affichage du message "mauvais mot" et le focus est bien redonné au premier UserControl. Seulement, lorsque l'on clique une seconde fois, l'évènement Leave du premier UserControl n'est plus levé ...

    Quelqu'un a-t-il déjà rencontré ce probleme ? La solution est-elle d'éviter de définir des UserControl contenant des instances d'autres UserControl ?

    Si vous pouvez nous aider ... C'est à s'en arracher les cheveux !! et si vous le souhaiter, je peux vous faire parvenir la solution test que nous avons développé.
    mercredi 23 janvier 2008 12:42

Toutes les réponses

  • Bonjour,

    Le problème vient de l'utilisation d'une MessageBox qui "casse" les évènements standard de enter/leave gotfocus/lostfocus.

    Faites un tests en affichant par exemple dans une textbox multiligne ces 4 évènements à chaque fois qu'ils sont levés.

    Les seules solutions que je vois sont :

    • Utiliser l'évènement Validating en annulant l'évènement (e.Cancel = true) si cela correspond à vos besoin.
    • Ou, ne pas utiliser de MessageBox mais d'afficher votre message dans un Label par exemple. (faite le test en affichant votre message dans la textbox au lieu de la MessageBox, tout marche très bien).

    Guillaume

    mercredi 23 janvier 2008 14:51
  • Merci Guillaume pour cette réponse très rapide !

    Nous avions effectivement tester l'affichage dans une textBox plutot que l'affichage dans un MessageBox. Mais malheureusement, ce n'est pas le souhait de notre client ... Et nous devons valider l'ensemble des composants d'un écran sur la perte du focus, afficher un message d'erreur si la validation est incorrecte et redonner le focus au composant.

    Un ensemble de UserControl de ce type sont fonctionnels mais le dernier, composés de composants du frameWork et de deux de ces UserControls a ce comportement singulier ... Les composants du framework réagissent bien mais pas les UserControls.

    Pour la méthode utilisant l'évènement Validating, le comportement est le même que pour l'abonnement à OnLeave. Cela va faire maintenant une semaine que je retourne ce composant dans tous les sens, sans avancée notoire ...

    Merci encore pour cet essai !

    Arnaud
    mercredi 23 janvier 2008 15:15
  • Bonjour,

     

    Pourquoi vous n'utilisez pas l'événement LostFocus ?

    mercredi 6 février 2008 09:34