2017-10-14 6 views
-2

Dans mon formulaire Charger un événement, je vérifie deux conditions et donne un message si l'une d'entre elles ou les deux sont vraies mais chaque fois que le formulaire principal est masqué, le message réapparaît et cela se produit chaque fois que le formulaire principal est affiché après qu'il a été caché afin que l'événement Load soit exécuté chaque fois .. Je veux juste que ce message soit montré une fois si les conditions sont vraies
Ceci est mes codes d'événement LoadComment empêcher l'exécution simultanée de plusieurs événements

private void Form1_Load(object sender, EventArgs e) 
     { 
       try 
       { 
        if (cn.State == ConnectionState.Closed) 
        { 
         cn.Open(); 
        } 
        SqlCommand cmd = new SqlCommand("select clientData.Id,clientData.clientName,clientData.clientPhone,clientData.clientMobile,clientData.clientEmail,clientData.clientPage,marketingData.marketingBy,marketingData.marketingFor,marketingData.marketingCities,marketingData.marketingDurations,marketingData.marketingStartsFrom,marketingData.marketingEndsIn,marketingData.adDate,marketingData.adImage,priceAndProfits.marketingCost from clientData inner join marketingData on clientData.Id = marketingData.m_Id inner join priceAndProfits on clientData.Id = priceAndProfits.p_Id where marketingData.marketingStartsFrom >= getdate()", cn); 
        SqlDataAdapter da = new SqlDataAdapter(cmd); 
        da.Fill(dt); 
        if (dt.Rows.Count > 0) 
        { 
         upComing = true; 
        } 
       } 
       catch (SqlException ex) 
       { 
        MessageBox.Show(ex.Message); 
       } 

       if (DateTime.Now.Day >= 25 && DateTime.Now.Day < 31) 
       { 
        try 
        { 
         if (cn.State == ConnectionState.Closed) 
         { 
          cn.Open(); 
         } 
         SqlCommand cmd = new SqlCommand("select clientData.Id,clientData.clientName,clientData.clientMobile,clientData.clientPage,marketingData.marketingBy,priceAndProfits.marketingCost,priceAndProfits.marketingPrice,priceAndProfits.marketingProfit,priceAndProfits.dollarPrice,priceAndProfits.payment from clientData inner join marketingData on clientData.Id = marketingData.m_Id inner join priceAndProfits on clientData.Id = priceAndProfits.p_Id where clientData.isDebtor=1", cn); 
         SqlDataAdapter da = new SqlDataAdapter(cmd); 
         da.Fill(dt2); 
         if (dt2.Rows.Count > 0) 
         { 
          debt = true; 
         } 
        } 
        catch (SqlException ex) 
        { 
         MessageBox.Show(ex.Message); 
        } 
       } 
       if (debt == true || upComing == true) 
       { 
        MessageBox.Show("يرجى مراجعة الإشعارات"); 
       } 
     } 
+2

Comment avez-vous « cacher » la forme? En utilisant 'Form.Hide()'? et comment le montrez-vous à nouveau. Pouvez-vous partager ces morceaux de code. Parce que normalement, lorsque vous masquez un formulaire, puis le montrer à nouveau, il ne doit pas déclencher l'événement Load. –

+1

C'est un bon indice que vous avez un bug dans votre programme. Comme créer à nouveau l'objet formulaire au lieu d'utiliser l'objet existant. Utilisez le débogueur, définissez une pause sur le gestionnaire d'événements Load et quand il frappe la deuxième fois, regardez dans la fenêtre Call Stack. Il vous montre où se trouve le code pervers. Au lieu d'utiliser Hide(), presque toujours une mauvaise idée, considérez juste de fermer un formulaire dont vous n'avez plus besoin. [Cet extrait] (https://stackoverflow.com/a/10769349/17034) devrait être utile pour empêcher cela de mettre fin à votre programme. –

+0

Oups, je voulais dire le constructeur, pas l'événement Load. –

Répondre

1

Une solution très simple serait de travailler avec un champ de drapeau. Ajoutez private bool _messageWasAlreadyShown; à votre formulaire. Dans votre cas Form1_Load vous devez définir vrai, après votre MessageBox a été affiché:

if (!_messageWasAlreadyShown && (debt == true || upComing == true)) 
{ 
    _messageWasAlreadyShown = true; 
    MessageBox.Show("يرجى مراجعة الإشعارات"); 
} 
+0

J'ai déjà essayé mais le message continue de s'afficher :( – Huda

+0

Comme dans votre question, je suppose que votre objet Form est réinitialisé chaque fois qu'il sera affiché après qu'il a été masqué Ma solution devrait fonctionner de toute façon tant que vous définissez la variable à statique, mais je suggère que vous fassiez une analyse de cause racine au lieu de le mettre en statique. – ChW

0
bool MessageShown = false; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    if (MessageShown == false) 
    { 
     //Code here 
    } 
    MessageShown = true; 
}