我怎样才能获得焦点再次对文本框没有例外,我下面的代码
本文关键字:代码 焦点 文本 | 更新日期: 2023-09-27 18:16:27
我有一个表单,我执行验证我的文本框如下所述..对于下面的代码,当我按下'clear'按钮,文本框被清空,然后,当我试图专注于任何文本框(即,我试图点击任何文本框)输入一些新的文本,然后InvalidCastException发生。为什么?
namespace ex_validation
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
txtuserid.Validating += new CancelEventHandler(Dovalidation);
txtpassword.Validating += new CancelEventHandler(Dovalidation);
txtage.Validating += new CancelEventHandler(Dovalidation);
btnnextform.Validating += new CancelEventHandler(Dovalidation);
btnclear.Validating += new CancelEventHandler(Dovalidation);
}
public void Dovalidation(object sender, CancelEventArgs e)
{
TextBox t = (TextBox)sender;// " EXCEPTION OCCURS AT THIS LINE "
if (t.Text=="")
{
t.BackColor = System.Drawing.Color.Yellow;// sets the backcolor of the textbox if found empty
e.Cancel = true;// cancel all other events unless user enters something in that relevant textbox
}
else
t.BackColor = System.Drawing.Color.White;
}
private void txtage_KeyPress(object sender, KeyPressEventArgs e)
{
if (!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar))
{
e.Handled = true;
}
}
private void txtage_Leave(object sender, EventArgs e)
{
if (txtage.Text == "")
MessageBox.Show("Age field cannot be left blank");
else
{
int x = System.Convert.ToInt16(txtage.Text);
if (x < 1 || x > 100)
{
MessageBox.Show("Age cannot be above 100 OR below 1", "Prompt Box", MessageBoxButtons.OK, MessageBoxIcon.Information);
txtage.Clear();
txtage.Focus();
}
}
}
private void btnnextform_Click(object sender, EventArgs e)
{
Form2 f = new Form2();
f.Show();
}
private void btnclear_Click(object sender, EventArgs e)
{
txtuserid.Text = (string)"";
txtpassword.Text = (string)"";
txtage.Text = (string)"";
}
}
}
您将Dovalidation
注册到控件上的事件,而不是TextBox
,因此cast失败,即btnnextform
和btnclear
。
不要在强制转换失败的实例中显式强制转换(或者强制转换失败并处理可能的异常)。有两种简单的方法可以预先防止无效强制转换:
1)使用带有null检查的as
:
TextBox t = sender as TextBox;
if (t != null)
{
// We have a textbox.
}
Button b = sender as Button; // etc
2)用is
(doc):
if (sender is TextBox)
{
TextBox t = (TextBox)sender;
}
但是你需要像正常的那样进行cast,所以在这种情况下我倾向于坚持使用as
。
as
操作符类似于显式强制转换,但如果强制转换不可行,则返回null
而不是抛出异常。
注意,as操作符只执行引用转换,可空转换和装箱转换。as运算符不能执行其他转换,如用户定义转换,其中应该使用强制转换表达式来执行。
另外:
但是,如果您需要对按钮和文本框进行不同的验证,您可能只想要另一个单独的验证方法—这将产生更简单和更小的方法集,而不是一个方法试图做所有事情。
因为您的验证处理程序期望发送方仅是一个文本框,但您也将其附加到按钮