【问题标题】:How to prevent crashing from a invalid input in C#如何防止 C# 中的无效输入导致崩溃
【发布时间】:2013-08-24 12:18:41
【问题描述】:

我制作了一个简单的应用程序来将 2 个数字相加,但是当我将两个字母或无效符号相加时,程序会崩溃。当有人插入一个字母时,如何创建一个显示“请输入一个数字”的消息框

这是我的代码:

public partial class frmAdd : Form
{
    string first;
    string second;
    public frmAdd()
    {
        InitializeComponent();
    }

    private void btnFirst_Click(object sender, EventArgs e)
    {
        first = txtNumber.Text;
    }

    private void btnSecond_Click(object sender, EventArgs e)
    {
        second = txtNumber.Text;
    }

    private void btnResult_Click(object sender, EventArgs e)
    {
        int a = Convert.ToInt32(first);
        int b = Convert.ToInt32(second);
        int c = a + b;
        txtResult.Text = c.ToString();
    }
}

【问题讨论】:

标签: c# .net winforms error-handling int


【解决方案1】:

改用TryParse

private void btnResult_Click(object sender, EventArgs e)
{
    int a, b;
    if (int.TryParse(first, out a) && int.TryParse(second, out b))
    {
        int c = a + b;
        txtResult.Text = c.ToString();
    } 
    else
    {
        MessageBox.Show("Invalid Input!");
    }
}

或者更好的方法是在用户首次输入数据时捕获错误:

public partial class frmAdd : Form 
{ 
    int first;   // changed to int
    int second;

    private void btnFirst_Click(object sender, EventArgs e)
    {
        if (!int.TryParse(txtNumber.Text, out this.first))
        {
            MessageBox.Show("Invalid Input!");
        }
    }

    private void btnSecond_Click(object sender, EventArgs e)
    {
        if (!int.TryParse(txtNumber.Text, out this.second))
        {
            MessageBox.Show("Invalid Input!");
        }
    }

    private void btnResult_Click(object sender, EventArgs e)
    {
        int c = first + second;
        txtResult.Text = c.ToString();
    }
}

【讨论】:

  • @user2705420 那是conditional-AND operator。它将尝试解析first,如果成功,将尝试解析second。如果两者都成功,它将执行内容if-block;否则它将执行else-block。
【解决方案2】:

您可以使用NumericUpDown 控件代替TextBox - 它不允许用户输入无效数据。

或者您可以在用户输入内容后向TextBox 值添加验证。将ErrorProvider 添加到您的表单中。并订阅txtNumber 文本框的Validating 事件。当文本框失去焦点时会发生此事件。如果输入的文本不是整数,则在texbox附近会显示错误,并且您的按钮不会被点击:

private void txtNumber_Validating(object sender, CancelEventArgs e)
{
    int value;
    if (!Int32.TryParse(txtNumber.Text, out value))
    {
        errorProvider1.SetError(txtNumber, "Value is not an integer");
        return;
    }

    errorProvider1.SetError(txtNumber, "");
    first = value; // it's better to save integer value than text
}

验证看起来像:

【讨论】:

  • NumericUpDown 是做什么的?
  • @user2705420,NumericUpDown 只是另一种类型的输入控件,就像文本框一样,但此控件只允许您输入数字(带或不带小数)。 “Up Down”来自控件内的向上和向下按钮。
  • 谢谢,你可以看到我的级别很低,但是 .SetError 是创建一个消息框还是会显示在 txtNumber 中
  • @user2705420 它将显示错误图标和带有错误消息的工具提示,请参见示例截图
【解决方案3】:

您可以添加一些验证来检查是否可以从传入的string 值创建intint.TryParse 是一种简单的方法。

对于MessageBox,您可以使用MessageBox calss

例子:

private void btnResult_Click(object sender, EventArgs e)
{

    int a = 0;
    int b = 0;
    if (!int.TryParse(first, out a))
    {
        MessageBox.Show("first is not a number");
        return;
    }
    if (!int.TryParse(second, out b))
    {
        MessageBox.Show("second is not a number");
        return;
    }
    int c = a + b;
    txtResult.Text = c.ToString();
}

【讨论】:

    【解决方案4】:

    你可能实际上使用 Int32.tryParse(String, out int),而不是使用 Convert.ToInt32(string),如下所示:

    int a, b;
    
    a = Int32.tryParse(first, out a);
    b = Int32.tryParse(second, out b);
    

    如果转换失败,tryParse 方法将返回零。如果成功,它将为您提供要在字符串中找到的数字。

    希望它对你有所帮助,我在 C# 的前几天也必须找到这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 2021-04-19
      • 2011-11-25
      • 1970-01-01
      相关资源
      最近更新 更多