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

本文关键字:一次 消息 循环 | 更新日期: 2023-09-27 17:51:23

我有这个小方法弹出一个消息框警告,问题是它弹出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();
}

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

用于执行if测试和构建错误消息的值始终是索引为0的行中的值,您应该使用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个或更多的错误值,每个错误行也只有一条消息。

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

在消息框后面使用"break;"您的程序将跳出循环。