2013-06-03 27 views
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)""; 
      } 
     } 
    } 
+0

btnnextform和btnclear不是一個文本框-ES我想和你仍然嘗試驗證,如果它是。這是根本原因... – rene

回答

4

您註冊Dovalidation對控件的事件其他TextBox所以轉換失敗,即btnnextformbtnclear

不要在投影失敗的情況下顯式投射(或者這樣做並處理可能的異常)。有兩種簡單的方法來防範無效蒙上前期:

1)使用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; 
} 

但是你需要像平常一樣施放,所以我傾向於在這種情況下堅持使用as

asoperator與顯式轉換類似,但如果轉換不可行,它將返回null而不是拋出異常。

注意的是,作爲運營商只執行基準轉換, 可空轉換和裝箱轉換。 as運算符不能執行其他轉換,例如用戶定義的轉換,其中 應改爲使用轉換表達式執行。


或者:

然而,這就是說,如果你需要做不同的驗證對按鈕作爲對文本框,你可能只是想有另一種不同的驗證方法 - 這將產生一個更簡單和更小的一套方法,而不是一個方法試圖做所有事情。

+0

你已經回答了20秒前:) – Demarsch

+0

哦耶!我不應該分配一個EventHandler按鈕..(btnclear&btnnextform是按鈕)..現在它的工作很好.. thnks fr d幫助.. –

1

因爲您的驗證處理預計發送者只有一個文本框,但其附加到按鈕太

+0

是的正確!我剛剛刪除了這兩行 - btnnextform.Validating + = new CancelEventHandler(Dovalidation); btnclear.Validating + = new CancelEventHandler(Dovalidation); 現在它的wrking正確.. –

相關問題