1

我有一个表单,我对我的文本框执行了验证,如下所示。对于下面的代码,当我按下“清除”按钮时,文本框被清空,然后,当我试图专注于任何文本框时(即,我正在尝试单击任何文本框)输入一些新文本,然后发生 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)"";
            }
        }
    }
4

2 回答 2

4

您注册Dovalidation到控件上的事件,不是强制转换TextBox失败,即btnnextformand btnclear

不要在强制转换失败的情况下显式强制转换(或者这样做并处理可能的异常)。有两种简单的方法可以预先防止无效强制转换:

1)as与空检查一起使用:

TextBox t = sender as TextBox;

if (t != null)
{
    // We have a textbox.
}

Button b = sender as Button; // etc

2)用isdoc)测试类型:

if (sender is TextBox)
{
    TextBox t = (TextBox)sender;
}

但是你需要像往常一样施放,所以我倾向于as在这种情况下坚持下去。

as 运算符类似于显式强制转换,但如果无法进行强制转换,它会返回null而不是抛出异常。

请注意,as 运算符仅执行引用转换、可为空的转换和装箱转换。as 运算符不能执行其他转换,例如用户定义的转换,而应使用强制转换表达式来执行。


或者:

但是,也就是说,如果您需要对按钮和文本框进行不同的验证,您可能只想使用另一种单独的验证方法——这将产生一组更简单、更小的方法,而不是一种方法试图做任何事。

于 2013-06-03T08:07:57.910 回答
1

因为您的验证处理程序希望发件人只是一个文本框,但您也将它附加到按钮

于 2013-06-03T08:08:39.230 回答