尝试捕获验证空文本框异常

3

嘿,我有以下代码,如果文本框为空应该会出现错误,但它并没有,它只是继续执行,并向列表中添加一个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

唯一可能会出现问题的是DateTime.Parse()。在空文本框上使用.Text不会抛出异常,它只会返回一个空字符串。使用string.IsNullOrEmpty(txtName.Text)来检查空值。 - drch
你的 theVisit 对象的设置器是否抛出异常?能否展示一下你的 theVisit 对象的类实现? - Hamlet Hakobyan
theVisit是一个列表,但我认为将其放在try not catch部分中可以使其正常工作。 - TAM
"theVisit是一个列表"是什么意思?List类没有名称、地址和到达时间属性/字段。 - Hamlet Hakobyan
我搞混了,而且我很蠢,因为错误没有显示到到达时间是因为它有一个默认值,也许我需要休息一下,我可以在上面的帖子中添加类代码吗?虽然我现在已经解决了这两个错误。 - TAM
我已经编辑了我的代码以展示我尝试过的东西,我的新问题是为什么它会抛出错误但仍然将该项添加到列表中而不让您对错误进行排序。 - TAM
2个回答

5
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。您可以在代码或表单设计器中进行这些设置。
现在,空文本框旁边将显示红色错误符号。如果您将鼠标悬停在它们上面,将出现带有错误消息的工具提示。
更新:
我更新了上面的代码以自动禁用或启用“添加”按钮。因此,我添加了一个包含当前处于错误状态的所有控件的 HashSet。如果集合为空,则启用该按钮,否则禁用它。

嘿,这很好,但如果文本框为空且出现红色符号,我仍然按添加按钮,它仍会将其添加到列表中。 - TAM
有没有办法避免这种情况?只有当所有文本框都有内容时才添加它。 - TAM
我添加了代码,可以自动启用或禁用按钮。请注意,AddRemove方法可以为相同的值调用任意次数而不会产生错误。 - Olivier Jacot-Descombes

2

尽可能避免使用try catch,因为会影响性能,如下面的例子所示:

        //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;

        }

@TAM 没问题。不太确定为什么我因此被踩了? - Pierluc SS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接