如何在循环中只弹出一次消息框?

时间:2013-01-12 11:14:28

标签: c# asp.net c#-4.0 popup messagebox

我有这个小方法弹出一个消息框警告,问题是它弹出3个消息框而不是一个! 我已经尝试了几种方法来解决这个问题(包括代码中的bool变量和在sql查询中使用Distinct,尽管数据库不包含任何可重复的行)。

这个想法是让违反if条件的每一行都弹出一次消息框,而不是每行3次。 那么,为什么这个消息框会弹出3次而不是一次?以及如何解决它?

    void msds_update()
{
    SqlConnection con = new SqlConnection();
    con.ConnectionString = "server=(local);database=PhilipsMaterials;Integrated Security=SSPI;";
    con.Open();
    DataSet ds = new DataSet();
    DataTable dt = new DataTable();
    string sql = "Select * from [PhilipsMaterials].[dbo].[Materials]";
    SqlDataAdapter da = new SqlDataAdapter(sql, con);
    da.Fill(ds);
    dt = ds.Tables[0];

    DateTime longupdate;
    DateTime shortupdate;
   foreach (DataRow row in dt.Rows)
    {
        longupdate = Convert.ToDateTime(dt.Rows[0]["Long MSDS Update"]);
        shortupdate = Convert.ToDateTime(dt.Rows[0]["Short MSDS Update"]);
        TimeSpan longsince = DateTime.Now.Subtract(longupdate);
        int longyears = (int)(longsince.Days / 365.25);
        TimeSpan shortsince = DateTime.Now.Subtract(shortupdate);
        int shortyears = (int)(shortsince.Days / 365.25);
        bool flag = false ;
        bool shown = false;
        if (longyears > 4.5) { flag = true; }
        if (flag && !shown)
        {
            string longmsdsname = Convert.ToString(dt.Rows[0]["Name"]);
            string msg = "Long Msds " + longmsdsname + " must be updated";
            MessageBox.Show(msg);
            shown = true;
        }
        flag = false;
        shown = false;
        if (shortyears > 4.5) { flag = true; }
        if (flag && !shown)
        {
            string shortmsdsname = Convert.ToString(dt.Rows[0]["Name"]);
            string msg = "Short Msds " + shortmsdsname + " must be updated";
            MessageBox.Show(msg);
            shown = true;
        }
    } 
    con.Close();
}

3 个答案:

答案 0 :(得分:0)

在if语句之前设置显示为false的变量,移动显示在for循环之外。

答案 1 :(得分:0)

使用“休息”;在你的消息框之后。你的程序将退出循环。

答案 2 :(得分:0)

用于执行if测试和构建错误消息的值始终是索引为零的行中的值,您应该使用foreach循环中使用的当前行索引器

此外,不要立即对错误条件作出反应,而是建立错误消息,等待结束一个循环并仅在出现错误时显示消息。无需使用并保持更新的两个状态变量。

   StringBuilder sb = new StringBuilder();
   int rowCounter = 0;
   foreach (DataRow row in dt.Rows)
   {
        rowCounter++;

        longupdate = Convert.ToDateTime(row["Long MSDS Update"]);
        shortupdate = Convert.ToDateTime(row["Short MSDS Update"]);
        TimeSpan longsince = DateTime.Now.Subtract(longupdate);
        int longyears = (int)(longsince.Days / 365.25);
        TimeSpan shortsince = DateTime.Now.Subtract(shortupdate);
        int shortyears = (int)(shortsince.Days / 365.25);
        if (longyears <= 4.5) 
        {
            string longmsdsname = Convert.ToString(row["Name"]);
            sb.AppendFormat("Long Msds {0}  must be updated\r\n", longmsdsname);
        }
        if (shortyears <= 4.5)
        {
            string shortmsdsname = Convert.ToString(row["Name"]);
            sb.AppendFormat("Short Msds {0}  must be updated\r\n", shortmsdsname);
        }

        // If we have errors, show them and reset the builder for the next loop
        if(sb.Length > 0)
        {
             string msg = string.Format("Error in row {0}\r\n{1}", 
                                         rowCounter.ToString(), sb.ToString());
             MessageBox.Show(msg);
             sb.Length = 0;
        }
    }

这样,如果存在2个或更多错误值,则每个错误行只有一条消息。