如何防止多次执行加载事件
问题描述:
在我的表单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("يرجى مراجعة الإشعارات");
}
}
答
一个非常简单的解决方案是使用标志字段。 只需将private bool _messageWasAlreadyShown;
添加到您的表单即可。在你Form1_Load
情况下,您必须将其设置为true,是展示的MessageBox后:
if (!_messageWasAlreadyShown && (debt == true || upComing == true))
{
_messageWasAlreadyShown = true;
MessageBox.Show("يرجى مراجعة الإشعارات");
}
答
bool MessageShown = false;
private void Form1_Load(object sender, EventArgs e)
{
if (MessageShown == false)
{
//Code here
}
MessageShown = true;
}
你是如何“隐藏”的形式?使用'Form.Hide()'?以及你如何再次展示它。你能分享这些代码段吗?因为通常当你隐藏一个表单,然后再次显示它时,它不应该触发Load事件。 –
这是一个非常好的暗示,你在你的程序中有一个错误。像再次创建表单对象而不是使用现有的表单对象。使用调试器,在Load事件处理程序中设置中断,并在第二次触发时在Call Stack窗口中查看。它向您显示恶码所在的位置。不要使用Hide(),几乎总是一个坏主意,考虑只是关闭一个你不再需要的表单。 [这段代码](https://stackoverflow.com/a/10769349/17034)应该有助于阻止终止程序。 –
糟糕,我的意思是构造函数,而不是Load事件。 –