2012-11-22 75 views
2

嘿所以我有下面的代碼應該拋出錯誤,如果文本框是空的,但它不只是繼續與它會做什麼,他們不是,並添加一個項目0或其他任何東西,而不是我的代碼有問題嗎?嘗試捕獲驗證空文本框

private void BtnAdd_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      theVisit.name = txtName.Text; 
      theVisit.address = txtAddress.Text; 
      theVisit.arrival = DateTime.Parse(txtArrival.Text); 
      //Update theVisit object to reflect any changes made by the user 

      this.Hide(); 
      //Hide the form 
     } 
     catch (Exception) 
     { 
      if (txtName.Text == "") 
       MessageBox.Show("please enter a customer name"); 

      if(txtAddress.Text == "") 
       MessageBox.Show("Please enter a customer address"); 

      if(txtArrival.Text == "") 
       MessageBox.Show("Please enter an arrival time"); 
     } 

if (txtName.Text == "" || txtAddress.Text == "" || txtArrival.Text == "") 
      MessageBox.Show(" Please enter a value into all boxes"); 
     else 
     theVisit.name = txtName.Text; 
     theVisit.address = txtAddress.Text; 
     theVisit.arrival = DateTime.Parse(txtArrival.Text); 
     //Update theVisit object to reflect any changes made by the user 
+0

那裏可能拋出的唯一事情是DateTime.Parse()。空文本框上的'.Text'不會引發異常,它只是返回一個空字符串。使用'string.IsNullOrEmpty(txtName.Text)'檢查空值。 – drch

+0

您的theVisit對象的setter是否會拋出異常?你能否顯示你的theVisit對象的類實現? –

+0

theVisit是一個列表,但我想我通過把它放在try not catch部分 – TAM

回答

4

在try-catch語句用於捕獲並處理異常。如果索引超出範圍,設置爲null的變量的成員被訪問,並且在許多其他情況下,則可以拋出異常。空着的TextBox本身不是錯誤,並且不會引發異常。

我建議你使用完全不同的方法。將ErrorProvider添加到您的表單中。您可以在「組件」部分的工具箱中找到它。現在,您可以將下面的代碼添加到您的形式:

private HashSet<Control> errorControls = new HashSet<Control>(); 

private void ValidateTextBox(object sender, EventArgs e) 
{ 
    var textBox = sender as TextBox; 
    if (textBox.Text == "") { 
     errorProvider1.SetError(textBox, (string)textBox.Tag); 
     errorControls.Add(textBox); 
    } else { 
     errorProvider1.SetError(textBox, null); 
     errorControls.Remove(textBox); 
    } 
    btnAdd.Enabled = errorControls.Count == 0; 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    txtName.Tag = "Please enter a customer name"; 
    txtAddress.Tag = "Please enter a customer address"; 
    errorProvider1.BlinkStyle = ErrorBlinkStyle.NeverBlink; 

    ValidateTextBox(txtName, EventArgs.Empty); 
    ValidateTextBox(txtAddress, EventArgs.Empty); 
} 

選擇ValidateTextBox方法作爲TextChanged事件的所有您的文本框的錯誤處理程序。將所需的消息插入文本框的Tag屬性中。將ErrorProviderBlinkStyle屬性設置爲ErrorBlinkStyle.NeverBlink。您可以在代碼或表單設計器中執行這些設置。

現在紅色錯誤符號將出現在空白文本框旁邊。如果將鼠標懸停在它們上面,將出現帶有錯誤消息的工具提示。


UPDATE

我更新了上面的代碼自動禁用或啓用 「添加」 按鈕上。因此我添加了一個HashSet,其中包含當前處於錯誤狀態的所有控件。如果該設置爲空,則該按鈕被啓用,否則被禁用。

+0

嘿,這是好的,但如果文本框是空的,紅色的符號在那裏,我仍然按添加,它仍然將它添加到列表 – TAM

+0

是否有避免這種情況?只有在所有文本框中都有內容時纔會添加它 – TAM

+0

我添加了自動啓用或禁用按鈕的代碼。請注意,對於相同的值,可以調用'Add'和'Remove'方法多次,而不會產生錯誤。 –

2

你應該總是避免嘗試捕捉如果可能的話,因爲性能命中見下面的例子:

 //set name 
     if(string.IsNullOrEmpty(txtName.Text)) MessageBox.Show("please enter a customer name"); 
     else theVisit.name = txtName.Text; 

     //set address 
     if(string.IsNullOrEmpty(txtAddress.Text)) MessageBox.Show("please enter a customer address"); 
     else theVisit.address = txtAddress.Text; 

     //set arrival time 
     if(string.IsNullOrEmpty(txtArrival.Text)) MessageBox.Show("please enter an arrival time"); 
     else { 

      DateTime dt = default(DateTime); 
      bool successParse = DateTime.TryParse(txtArrival.Text, out dt); 

      if(!successParse) MessageBox.Show("please enter a valid arrival time"); 
      else theVisit.arrival = dt; 

     } 
+1

謝謝工作更容易 – TAM

+0

@TAM沒問題。不太清楚爲什麼我會因此而失望? –