我有这个小方法弹出一个消息框警告,问题是它弹出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();
}
答案 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个或更多错误值,则每个错误行只有一条消息。