如何让标签显示错误

时间:2011-11-10 13:46:59

标签: c# if-statement

  

可能重复:
  Text box validation not working

现在我有5个文本框,当任何一个字段留空时它会将框变为黄色并输出我的标签中名为“lblError”的语句以下错误“”请输入有效数据!“这是列出的在我的catch语句中。我希望lblError输出我为每个文本框列出的文本语句。所以如果第一个名字和姓氏是空白的,那么lblError将输出两个消息。我是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!";
        }
    }
}

6 个答案:

答案 0 :(得分:2)

您需要连接错误消息 - 如果发现错误,连接并添加新行,如果没有,只需使用新的错误消息:

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

以上只是一个支票的一个例子。

我建议将常用逻辑解压缩到自己的方法并重用它(例如,只需将错误消息和控件作为参数传递给。)

答案 1 :(得分: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 :(得分:0)

你可以 -

  • 存储StringBuilder中每个无效字段的错误消息
  • 如果StringBuilder在进程结束时包含任何内容 将收集的错误消息输出到lblError控件

答案 3 :(得分:0)

主要问题是你的方法抛出一个异常,这就是为什么你只得到catch块中定义的消息。我怀疑这段代码会引发错误:

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

如果作为参数传入的文本字符串不能完全解析为DateTime值,则DateTime.Parse()将引发异常。
对此的修复可能是使用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在需要时附加消息,然后将其应用于消息末尾的错误标签。

答案 4 :(得分:0)

检查空字符串时,最好使用String.IsNullOrEmpty。

标签,假设它是单行标签,只能显示一件事。无论何时分配Text属性,都会覆盖之前存储的任何文本。如果必须显示多个内容,则应使用显示更多文本的控件并将其附加。如果在try块中抛出异常,你只会命中你的catch块。

答案 5 :(得分: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()