焦点离开文本框
本文关键字:文本 离开 焦点 | 更新日期: 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;
现在,当您完成一些是否退出程序的检查后,您可以将此变量设置为 true
或 false
以防遗留问题。从现在开始,每当触发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;
}