2017-10-14 152 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; 
}