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

C# 如何让消息框在循环中只弹出一次?,c#,asp.net,c#-4.0,popup,messagebox,C#,Asp.net,C# 4.0,Popup,Messagebox,我有一个弹出消息框警告的小方法,问题是它会弹出3个消息框而不是一个! 我尝试了几种方法来解决这个问题(包括代码中的bool变量和在sql查询中使用Distinct,尽管数据库不包含任何可重复的行) 这样做的想法是,对于违反我的if条件的每一行,messagebox弹出一次,而不是每一行弹出3次。 那么,为什么这个消息框会弹出三次而不是一次?如何修复它 void msds_update() { SqlConnection con = new SqlConnection();

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

这样做的想法是,对于违反我的if条件的每一行,messagebox弹出一次,而不是每一行弹出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语句之前将显示的变量设置为false,则将显示的变量移到for循环之外。

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

用于执行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;
        }
    }
StringBuilder sb=新建StringBuilder();
int rowCounter=0;
foreach(数据行中的数据行)
{
行计数器++;
longupdate=Convert.ToDateTime(行[“长MSDS更新”]);
shortupdate=Convert.ToDateTime(行[“短MSDS更新”]);
TimeSpan longsince=DateTime.Now.Subtract(longupdate);
int longyears=(int)(longince.Days/365.25);
TimeSpan shortsince=DateTime.Now.Subtract(shortupdate);
int shortyears=(int)(shortfrom.Days/365.25);

如果(很抱歉,我应该更清楚。我希望messagebox在违反我的条件的每一行显示一次。现在,它在符合if条件的每一行显示3次。在这种情况下,Daniel的答案有效。在循环顶部初始化显示的标志,在循环中不要将其重置为false。一旦设置为一个消息框,它无论如何都不会显示其他消息框。我的问题是,同一个消息框中有相同的文本显示3次,而不是一次。例如:如果我有两个消息框通知,但有不同的文本,那就可以了,但我不希望相同的消息显示3次(我不知道为什么会这样)。是否要显示一个包含所有消息文本的消息框?还是要显示第一个消息框,然后退出此循环?我对问题进行了编辑以使其更清晰。我只想显示一个消息框(如果两个条件都成立,则预访问2)对于每一行。现在我得到了3个messagebox,每一行都有相同的文本。尝试了它,但它仍然显示3条messagebox消息,而不是每一个违规显示一条消息。我不确定是否正确理解了您的问题。您有N行,并在其中循环。在一个循环中,您检查当前循环行的两个字段中的值。如果有一个或两个字段包含错误的数据(已获取)。您在邮件中不使用当前行,但始终使用第[0]行。立即更改答案我不想中断循环,我希望每违反我的条件的行都有一个消息框通知。