如何在循环中只弹出一次消息框
本文关键字:一次 消息 循环 | 更新日期: 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;"您的程序将跳出循环。