0

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

3 回答 3

0

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

于 2013-01-12T11:18:13.653 回答
0

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

于 2013-01-12T11:41:59.563 回答
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 个或更多错误值,每个错误行也只有一条消息。

于 2013-01-12T11:44:28.813 回答