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コントロールのイベントに登録すると、キャストが失敗します。つまり、 とです。TextBoxbtnnextformbtnclear

キャストが失敗するインスタンスで明示的にキャストしないでください (またはそうして、可能な例外を処理します)。事前に無効なキャストを防ぐ簡単な方法が 2 つあります。

1) asnull チェックで使用します。

TextBox t = sender as TextBox;

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

Button b = sender as Button; // etc

is2) ( doc )で型をテストします。

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

ただし、通常どおりキャストする必要があるためas、この状況に固執する傾向があります.

as 演算子は明示的なキャストに似ていますが、キャストが不可能な場合はnull、例外をスローする代わりに戻ります。

as 演算子は、参照変換、null 許容変換、およびボックス化変換のみを実行することに注意してください。as 演算子は、代わりにキャスト式を使用して実行する必要がある、ユーザー定義の変換などの他の変換を実行できません。


または:

ただし、ボタンに対してテキスト ボックスとは異なる検証を行う必要がある場合は、別の検証方法が必要な場合があります。これにより、1 つの方法ですべてを行います。

于 2013-06-03T08:07:57.910 に答える
1

検証ハンドラーは送信者がテキストボックスのみであることを期待していますが、ボタンにも添付するためです

于 2013-06-03T08:08:39.230 に答える