2011-11-10 41 views
0

可能重複:
Text box validation not working我怎樣才能標籤顯示錯誤

現在我有5個文本框,當領域中的任何一個都留空事實該框爲黃色並在我的標籤中輸出語句「lblError」,出現以下錯誤「」請輸入有效數據!「這在我的catch語句中列出。我希望lblError輸出我爲每個文本列出的文本語句所以如果名字和姓氏都是空白的,那麼lblError就會ou輸入這兩個消息。我是C#的新手,所以對我來說有點困惑。

public partial class frmPersonnel : System.Web.UI.Page 
{ 
    protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      DateTime dt1; 
      DateTime dt2; 

      if (txtFirstName.Text == "") 
      { 
       txtFirstName.BackColor = System.Drawing.Color.Yellow; 
       lblError.Text = "Please enter first name"; 
      } 
      if (txtLastName.Text == "") 
      { 
       txtLastName.BackColor = System.Drawing.Color.Yellow; 
       lblError.Text = "Please enter last name!"; 
      } 
      if (txtPayRate.Text == "") 
      { 
       txtPayRate.BackColor = System.Drawing.Color.Yellow; 
       lblError.Text = "Please enter pay rate!"; 
      } 
      if (txtStartDate.Text == "") 
      { 
       txtStartDate.BackColor = System.Drawing.Color.Yellow; 
       lblError.Text = "Please enter start date!"; 
      } 
      if (txtEndDate.Text == "") 
      { 
       txtEndDate.BackColor = System.Drawing.Color.Yellow; 
       lblError.Text = "Please enter end date!"; 
      } 
      dt1 = DateTime.Parse(txtStartDate.Text); 
      dt2 = DateTime.Parse(txtEndDate.Text); 


      if (DateTime.Compare(dt1, dt2) > 0) 
      { 
       txtStartDate.BackColor = System.Drawing.Color.Yellow; 
       txtEndDate.BackColor = System.Drawing.Color.Yellow; 
       lblError.Text = "Start Date must not be greater than End Date."; 
      } 

      else 
      { 
       Session["txtFirstName"] = txtFirstName.Text; 
       Session["txtLastName"] = txtLastName.Text; 
       Session["txtPayRate"] = txtPayRate.Text; 
       Session["txtStartDate"] = txtStartDate.Text; 
       Session["txtEndDate"] = txtEndDate.Text; 
       Server.Transfer("frmPersonalVerified.aspx"); 
      } 
     } 
     catch (Exception) 
     { 
      lblError.Text = "Please enter valid data!"; 
     } 
    } 
} 
+1

這就是爲什麼有驗證事件。 – LarsTech

回答

1

你可以這樣做。

加+ =例如lblError.Text += "Please enter first name "; 這將附加到已經在文本框中的文本。

public partial class frmPersonnel : System.Web.UI.Page 
{ 
    protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
    try 
    { 
     DateTime dt1; 
     DateTime dt2; 

     // Add this 
     lblError.Text = ""; 

     if (txtFirstName.Text == "") 
     { 
      txtFirstName.BackColor = System.Drawing.Color.Yellow; 
      lblError.Text += "Please enter first name "; 
     } 
     if (txtLastName.Text == "") 
     { 
      txtLastName.BackColor = System.Drawing.Color.Yellow; 
      lblError.Text += "Please enter last name! "; 
     } 
     if (txtPayRate.Text == "") 
     { 
      txtPayRate.BackColor = System.Drawing.Color.Yellow; 
      lblError.Text += "Please enter pay rate! "; 
     } 
     if (txtStartDate.Text == "") 
     { 
      txtStartDate.BackColor = System.Drawing.Color.Yellow; 
      lblError.Text += "Please enter start date! "; 
     } 
     if (txtEndDate.Text == "") 
     { 
      txtEndDate.BackColor = System.Drawing.Color.Yellow; 
      lblError.Text += "Please enter end date! "; 
     } 
     dt1 = DateTime.Parse(txtStartDate.Text); 
     dt2 = DateTime.Parse(txtEndDate.Text); 


     if (DateTime.Compare(dt1, dt2) > 0) 
     { 
      txtStartDate.BackColor = System.Drawing.Color.Yellow; 
      txtEndDate.BackColor = System.Drawing.Color.Yellow; 
      lblError.Text += "Start Date must not be greater than End Date. "; 
     } 

     else 
     { 
      Session["txtFirstName"] = txtFirstName.Text; 
      Session["txtLastName"] = txtLastName.Text; 
      Session["txtPayRate"] = txtPayRate.Text; 
      Session["txtStartDate"] = txtStartDate.Text; 
      Session["txtEndDate"] = txtEndDate.Text; 
      Server.Transfer("frmPersonalVerified.aspx"); 
     } 
    } 
    catch (Exception) 
    { 
     lblError.Text = "Please enter valid data!"; 
    } 
    } 
} 

說真的,我建議你看看使用驗證控件。他們很容易添加到您的表單。並會幫助你在這種情況下

2

您將需要連接的錯誤信息 - 如果發現錯誤,串接,並添加一個新行,如果沒有,只是用新的錯誤消息:

if(string.IsNullOrWhiteSpace(lblError.Text)) 
{ 
    lblError.Text = "Please enter last name!"; 
} 
else 
{ 
    lblError.Text += "Please enter last name!" + Environment.NewLine; 
} 

以上僅僅是的一個例子是的檢查。

我建議將通用邏輯提取到自己的方法並重用它(只需傳遞錯誤消息和要檢查的控件等參數)。

+0

謝謝,您的示例如何與名字的文本框綁定?我的意思是,代碼行如何知道姓氏文本框是否爲空?謝謝你的時間。 – Mike

+0

我正在用'string.IsNullOrWhiteSpace'在'if'中測試它。 – Oded

+0

因此,我會使用爲每個文本框複製相同的代碼? – Mike

0

你可以 -

  • 存儲每個無效的字段在一個StringBuilder
  • 如果StringBuilder的包含在過程 輸出端的任何內容的錯誤消息,您的收集到的錯誤信息到lblError控制
0

的主要問題是,你的方法拋出一個異常,這就是爲什麼你在catch塊定義只得到了消息。我會懷疑錯誤是由這個代碼拋出:

dt1 = DateTime.Parse(txtStartDate.Text); 
dt2 = DateTime.Parse(txtEndDate.Text); 

DateTime.Parse()將拋出一個異常,如果傳遞的參數的文本字符串不完全解析爲DateTime值。
對此的修復可能是使用DateTime。的TryParse()方法來代替,這將不會拋出異常:

DateTime dt1 = DateTime.MinValue; 
DateTime dt2 = DateTime.MinValue; 

if (DateTime.TryParse(txtStartDate.Text, out dt1) && 
    DateTime.TryParse(txtEndDate.Text, out dt2)) 
{ 
    if (DateTime.Compare(dt1, dt2) > 0) 
    { 
    .... 
    } 
    else 
    { 
    .... 
    } 
} 
else 
{ 
    // set error stating date time values are not in a parsable format 
} 

你必須是你每次都重寫你的錯誤標籤,用下面的代碼的第二個問題:

避免這種的
lblError.Text = "Please enter first name"; 

的一種方式就是用:

lblError.Text += "Please enter first name<br />"; 

另外,您可以使用StringBuilder,因爲他們被要求追加的消息,然後在郵件的末尾應用此錯誤的標籤。

0

檢查空字符串時,最好使用String.IsNullOrEmpty。

標籤,假設它是單行標籤,只能顯示一件事。無論何時指定Text屬性,覆蓋之前存儲的任何文本都將被覆蓋。如果你必須顯示多個東西,你應該使用一個顯示更多文本並追加它的控件。如果在try塊中拋出異常,你只會打你的catch塊。

0

一個想法是宣佈IDisposable類來收集所有驗證錯誤。
此類負責收集錯誤消息並在處理上下文時拋出它們(如果有的話)。 (即使用已經達到了右括號時)

try 
{ 
    using (var cx = new ValidationContext()) 
    { 
     if (this) cx.AddError("Please provide a value for ..."); 
     if (that) cx.AddError("Please provide a value for ..."); 
    } 
} 
catch (Exception ex) 
{ 
    lblError.Text = ex.Message; 
} 

和如下定義ValidationContext

public class ValidationContext : IDisposable 
{ 
    StringBuilder Builder { get; set; } 

    public ValidationContext() 
    { 
     Builder = new StringBuilder(); 
    } 

    public void AddError(string message) { Builder.AppendLine(message); } 

    public void Dispose() 
    { 
     var total = Builder.ToString().Trim(); 
     if (total.Length > 0) 
     { 
      throw new Exception(total); 
     } 
    } 
} 

這是這個概念的最簡單的實現,您可以添加更多的功能,它支持添加錯誤從你代碼中的任何地方(甚至嵌套方法))到ValidationContext.Current)。
如果你這樣做,你將只能添加一個using{}到您的用戶界面,並從應用程序/庫的所有部分調用ValidationContext.Current.AddError()