C# 如何防止C中无效输入的崩溃

C# 如何防止C中无效输入的崩溃,c#,.net,winforms,error-handling,int,C#,.net,Winforms,Error Handling,Int,我做了一个简单的应用程序,把两个数字加在一起,但当我把两个字母加在一起或一个无效符号时,程序就会崩溃。当有人插入一封信时,如何创建一个显示“请输入一个数字”的消息框 这是我的密码: public partial class frmAdd : Form { string first; string second; public frmAdd() { InitializeComponent(); } private void btnF

我做了一个简单的应用程序,把两个数字加在一起,但当我把两个字母加在一起或一个无效符号时,程序就会崩溃。当有人插入一封信时,如何创建一个显示“请输入一个数字”的消息框

这是我的密码:

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();
    }
}
改用:

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

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();
    }
}
改用:

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

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();
    }
}
您可以使用NumericUpDown控件而不是TextBox-它将不允许用户输入无效数据

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

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控件而不是TextBox-它将不允许用户输入无效数据

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

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
}
验证看起来像:


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

对于MessageBox,您可以使用MessageBox Cals

例如:

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();
}

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

对于MessageBox,您可以使用MessageBox Cals

例如:

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();
}

实际上,您可以使用Int32.tryParseString,out int,而不是Convert.ToInt32string,如下所示:

int a, b;

a = Int32.tryParse(first, out a);
b = Int32.tryParse(second, out b);
如果转换失败,tryParse方法将导致零。如果成功,它将为您提供在字符串中找到的数字


希望它对您有所帮助,在我学习C的前几天,我也必须找到这个。您可以使用Int32.tryParseString,out int,而不是使用Convert.ToInt32string,如下所示:

int a, b;

a = Int32.tryParse(first, out a);
b = Int32.tryParse(second, out b);
如果转换失败,tryParse方法将导致零。如果成功,它将为您提供在字符串中找到的数字


希望它能帮到你,我在C的前几天也发现了这一点。

NumericUpDown做什么?@user2705420,NumericUpDown只是另一种类型的输入控件,就像文本框一样,但这个控件只允许你输入带或不带小数的数字。“向上”和“向下”按钮来自控件中的“向上”和“向下”按钮。谢谢,您可以看到im的级别非常低,但是.SetError是否创建了一个消息框,或者它是否会显示在消息框中txtNumber@user2705420它将显示错误图标和带有错误消息的工具提示,请参见示例屏幕快照NumericUpDown做什么?@user2705420,NumericUpDown只是另一种类型的输入控件,就像文本框一样,但此控件只允许您键入带或不带小数的数字。“向上”和“向下”按钮来自控件中的“向上”和“向下”按钮。谢谢,您可以看到im的级别非常低,但是.SetError是否创建了一个消息框,或者它是否会显示在消息框中txtNumber@user2705420它将显示错误图标和带有错误消息的工具提示,请参见示例screenshot@user2705420这就是问题所在。它将首先尝试解析,如果成功,则将尝试解析第二个。如果两者都成功,它将执行内容If块;否则,它将执行else块。@user2705420这是命令。它将首先尝试解析,如果成功,则将尝试解析第二个。如果两者都成功,它将执行内容If块;否则它将执行else-block。请尝试此代码尝试此代码