焦点离开文本框

本文关键字:文本 离开 焦点 | 更新日期: 2023-09-27 18:31:10

我有一个文本框TB和一个处理程序EH,用于事件焦点/离开。

另外,我有一个按钮BT单击时退出程序,只有dispose();如果我离开TB框中没有适当的数据,则会触发焦点离开事件处理程序以检查数据,它会警告我并将焦点返回到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();
}

焦点离开文本框

保留一个指示符,说明是否发出了退出请求。

private bool _isQuitRequested = false;

在 BT 点击事件中添加

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

在事件处理程序的开头EH添加

if (_isQuitRequested) return;

不要忘记在TB_TextChanged中将_isQuitRequest改回 false

您可以尝试创建一个全局字段来存储程序退出的权限,如下所示;

bool Quit=false;

现在,当您完成一些是否退出程序的检查后,您可以将此变量设置为 truefalse以防遗留问题。从现在开始,每当触发BT_Click事件(退出事件)时,将此变量设置为 true,如下所示;

private void BT_Click(object sender, EventArgs e) //--- PROGRAM END ---
{
    Quit = true;//Flag to exit the program.
    Dispose();
}

当你穿上这个时,在EH的最开头添加这段代码;

private void EH(object sender, EventArgs e) // event handler EH
{
 if(Quit)//If Quit is true,means exit the program.
 {
   return;//No processing,just return.
 }
   //Run regular logic,if the function doesn't need to return.
}

但是为了确保EH中的逻辑运行,Quit设置为TextChangedEvent中的false,就像这样;

private void TB_TextChanged(object sender, EventArgs e) // change text in TB
{
Quit=false;//Set this to false to make sure `EH` event's code is executed.
if (TB.Text == "")
    btgo.Enabled = false;
else
    btgo.Enabled = true;
}