【问题标题】:How can I get the label to display the errors [duplicate]如何让标签显示错误[重复]
【发布时间】:2011-11-10 13:46:59
【问题描述】:

可能重复:
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!";
        }
    }
}

【问题讨论】:

  • 这就是为什么会有验证事件。

标签: c# if-statement


【解决方案1】:

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

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

以上只是一个检查的示例。

我建议将通用逻辑提取到它自己的方法中并重用它(例如,只需将错误消息和要检查的控件作为参数传递)。

【讨论】:

  • 谢谢,您的示例如何与姓氏的文本框联系起来?我的意思是代码行如何知道姓氏文本框是否为空白?感谢您的宝贵时间。
  • 我正在if 中测试它:string.IsNullOrWhiteSpace
  • 所以我会为每个文本框使用复制的相同代码?
  • @Mike - 你可以。或者您可以将通用代码提取到方法中,正如我在答案末尾所建议的那样。
  • 对不起,我正在尝试对此进行一些研究,但我不明白。我是编码新手,这对我来说有点困难。我不确定如何通过将公共代码提取到方法来进行设置。
【解决方案2】:

你可以这样做。

添加 += 例如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!";
    }
  }
}

确实,我建议您考虑使用验证控件。它们很容易添加到您的表单中。在这种情况下会帮助你

【讨论】:

    【解决方案3】:

    你可以 -

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        一个想法是声明一个IDisposable 类来收集所有验证错误。
        此类负责收集错误消息并在释放上下文时抛出它们(如果有)。 (即当 using 到达右括号时)

        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{} 添加到您的 UI 并从您的应用程序/库的所有部分调用 ValidationContext.Current.AddError()

        【讨论】:

          【解决方案6】:

          主要问题是您的方法引发了异常,这就是为什么您只能获取在 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 根据需要附加消息,然后将其应用于消息末尾的错误标签。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-06-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-13
            • 1970-01-01
            相关资源
            最近更新 更多