2017-10-14 123 views
-2

在我的表单Load事件中,我检查两个条件并给出一条消息,如果其中一个或两者都为真,但每当隐藏主窗体,然后显示消息再次出现并且这种情况发生在主表单被隐藏后显示,因此Load事件每次都会被执行。如果条件为真,我只希望该消息仅显示一次。
这是我的Load事件代码如何防止多次执行加载事件

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

你是如何“隐藏”的形式?使用'Form.Hide()'?以及你如何再次展示它。你能分享这些代码段吗?因为通常当你隐藏一个表单,然后再次显示它时,它不应该触发Load事件。 –

+1

这是一个非常好的暗示,你在你的程序中有一个错误。像再次创建表单对象而不是使用现有的表单对象。使用调试器,在Load事件处理程序中设置中断,并在第二次触发时在Call Stack窗口中查看。它向您显示恶码所在的位置。不要使用Hide(),几乎总是一个坏主意,考虑只是关闭一个你不再需要的表单。 [这段代码](https://stackoverflow.com/a/10769349/17034)应该有助于阻止终止程序。 –

+0

糟糕,我的意思是构造函数,而不是Load事件。 –

回答

1

一个非常简单的解决方案是使用标志字段。 只需将private bool _messageWasAlreadyShown;添加到您的表单即可。在你Form1_Load情况下,您必须将其设置为true,是展示的MessageBox后:

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

我之前尝试过,但消息仍然显示:( – Huda

+0

像在你的问题中评论我猜你的Form对象每次被隐藏后都会重新显示,只要你设置了变量,我的解决方案应该可以工作静态,但我会建议你做一个根本原因分析,而不是将其设置为静态。 – ChW

0
bool MessageShown = false; 

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