1

テキスト ボックスと、 Focus / Leave イベントTBのハンドラーがあります。EH

また、BTクリックするとプログラムを終了するボタンがあり、dispose(); のみです。適切なデータを入れずにボックスを離れるTBと、データをチェックするために focus leave イベント ハンドラーがトリガーされ、警告が表示され、フォーカスが に戻りますTB

TBしかし、フォーカスを持ってクリックしているときにプログラムを終了したい場合BT、再びEHトリガーされてフォーカスが戻りTB、プログラムは終了しません。

どうすればこの問題を解決できますか? コードは次のとおりです。

public Form1()
{
    InitializeComponent();
}

private void EH(object sender, EventArgs e) // event handler EH
{
    double temp;
    if (TB.Text == "")
    {
        MessageBox.Show("Must enter a valid distance for d1!\r\n" +
            "The valid range is ( 10,32 )",
            "Wake up!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            TB.Focus();
            return;
    }
    else
    try
    {
        temp = Convert.ToDouble(TB.Text);
        if (temp < 10 || temp > 32)
        {
            MessageBox.Show("Invalid distance for d1!\r\n" +
            "The valid range is ( 10,32 )",
            "Again! Wake up!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                TB.Text = "";
                TB.Focus();
                return;
        }
        minh1 = 1 / 8 * temp; // sets minimum h1
            if (minh1 < 10)
                minh1 = 10;
    }
    catch (Exception) // can't convert
    {
        MessageBox.Show("Invalid numeric entry!\r\n" +
        "Please enter a valid number!",
        "Hey! Wake up!", MessageBoxButtons.OK, MessageBoxIcon.Error);
         TB.Text = "";
         TB.Focus();
    }
}

private void TB_TextChanged(object sender, EventArgs e) // change text in TB
{
    if (TB.Text == "")
        btgo.Enabled = false;
    else
        btgo.Enabled = true;
}
private void btgo_Click(object sender, EventArgs e) // Execute!
{
    say.Text = "Minimum height h1 has been calculated to be " +
    string.Format("{0:#0.00}", minh1) + " Fts";
    BT.Focus();
}
private void BT_Click(object sender, EventArgs e) // --- PROGRAM END ---
{
    Dispose();
}
4

2 に答える 2

1

退出要求が行われたかどうかを示すインジケーターを保持します。

private bool _isQuitRequested = false;

BTクリックイベントで追加

private void BT_Click(object sender, EventArgs e) // --- PROGRAM END ---
{
    _isQuitRequested = true;
    Dispose();
}

イベントハンドラの先頭にEH追加

if (_isQuitRequested) return;

_isQuitRequestで false に戻すことを忘れないでくださいTB_TextChanged

于 2013-09-12T20:47:30.563 に答える