0

メッセージ ボックスの警告をポップアップするこの小さなメソッドがあります。問題は、1 つではなく 3 つのメッセージ ボックスがポップアップすることです! この問題に対処するためにいくつかの方法を試しました (データベースには繰り返し可能な行が含まれていませんが、コード内の bool 変数や sql query で Distinct を使用するなど)。

アイデアは、行ごとに3回ではなく、if条件に違反する行ごとにメッセージボックスを1回ポップアップさせることです。では、このメッセージ ボックスが 1 回ではなく 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

「break;」を使用します メッセージボックスの後。プログラムはループから抜け出します。

于 2013-01-12T11:41:59.563 に答える
0

if テストの実行とエラー メッセージの作成に使用される値は、常にインデックス 0 の行の値です。foreach ループで使用される現在の行インデクサーを使用する必要があります。

また、エラー状態にすぐに反応するのではなく、エラー メッセージを作成し、1 つのループが終了するのを待って、エラーが発生した場合にのみメッセージを表示します。2 つのステータス変数を使用して更新し続ける必要はありません。

   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つ以上ある場合でも、間違った行ごとに1つのメッセージしかありません。

于 2013-01-12T11:44:28.813 に答える
0

if ステートメントの前に、示されている変数を false に設定し、for ループの外側に示されているように移動します。

于 2013-01-12T11:18:13.653 に答える