【问题标题】:Unable to solve this exception when performing calculation执行计算时无法解决此异常
【发布时间】:2020-07-07 02:01:11
【问题描述】:

我在文本框 2 中有这段代码,它将文本框 1 和 2 的值相乘,将结果添加到文本框 3:

private void textBox2_TextChanged(object sender, EventArgs e)
        {
            textBox3.Text = Convert.ToString(Convert.ToInt32(textBox1.Text) * Convert.ToInt32(textBox2.Text));
        }

当我通过这个在数据库中插入数据时

code private void button1_Click(object sender, EventArgs e)
        {
            con.Open();
            SqlCommand cmd = con.CreateCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "Insert into Receipts(Qty,ItemName,Price,Amount) values('" + textBox2.Text + "','" + textBox4.Text + "','" + textBox1.Text + "','" + textBox3.Text + "')";
            cmd.ExecuteNonQuery();

            con.Close();
            this.receiptsTableAdapter.Fill(this.shopDataSet.Receipts);
            textBox4.Clear();
            textBox1.Clear();
            textBox2.Clear();
            textBox3.Clear();


            //MessageBox.Show("Data Inserted !");
        }

我在 textBox2.Clear() 上遇到错误; (异常处理但数据插入成功) 没有这个程序可以正常工作,

textBox4.Clear();
            textBox1.Clear();
            textBox2.Clear();
            textBox3.Clear();

我想清除文本框,我只在 textbox2 上遇到错误,其中包含将文本框 1 和 2 的值相乘的代码将结果添加到文本框 3。

谢谢:)

【问题讨论】:

  • 始终使用参数化 sql 并避免字符串连接向 sql 语句添加值。这可以缓解 SQL 注入漏洞并确保将值正确传递给语句。请参阅 How can I add user-supplied input to an SQL statement?Exploits of a Mom
  • 异常可能源自textBox2_TextChanged,并且很可能是 FormatException,因为您正在尝试将空字符串转换为 int。调试您的代码,以更好地了解如何解决异常和意外结果。
  • 我不是调试等方面的专家。你能分享一下解决方案吗?

标签: c# visual-studio winforms desktop-application windows-forms-designer


【解决方案1】:

我在 textBox2.Clear() 上遇到错误; (异常处理但数据插入成功)没有这个程序可以正常工作,

 textBox4.Clear();
 textBox1.Clear(); // This is the first problem
 textBox2.Clear(); // This is the second problem
 textBox3.Clear();

这个错误的原因是因为事件textBox2_TextChanged。在里面你试图使用Text 属性来执行计算,这会失败,因为Text 属性是空的并且它无法转换它。

 textBox3.Text = Convert.ToString(Convert.ToInt32(textBox1.Text) * Convert.ToInt32(textBox2.Text));

要解决此问题,您可以先检查 Text 属性是否可以在使用 Int.TryParse Method 和 out 变量之前成功解析;仅适用于定位 C# >= 7.0。例如:

 private void textBox2_TextChanged(object sender, EventArgs e)
 {
    if(int.TryParse(textBox1.Text, out int txt1) && int.TryParse(textBox2.Text, out int txt2))
    {
       textBox3.Text = (txt1 * txt2).ToString();
    }
 }

如果定位早于 C# 7.0 的版本,您也许可以使用另一个版本:

 private void textBox2_TextChanged(object sender, EventArgs e)
 {
    int txt1;
    int txt2;
    if(int.TryParse(textBox1.Text, out txt1) && int.TryParse(textBox2.Text, out txt2))
    {
       textBox3.Text = (txt1 * txt2).ToString();
    }
 }

【讨论】:

  • 这段代码在 txt , int1, int2 下显示红色下划线
  • 在什么代码下,上面的代码中没有int1int2。你是说txt1 还是txt2?如果是这样,您可能使用的是旧版本的c#,我会更新代码。
  • txt1txt2int
  • 无法将类型'int'隐式转换为'string'
  • 或者与其尝试TryParse,不如检查if(string.IsNullOrEmpty() ),然后尝试解析您的int。
【解决方案2】:

正如其他人所说,您遇到的问题与 textBox2_TextChanged 有关,每次您更改 textBox2 中的任何内容时都会调用此 void

在我看来,您应该检查您的文本框以确保它们不为空,然后尝试解析您的整数。

这里有一些东西可以帮助您入门。

https://dotnetfiddle.net/lyNnQY

【讨论】:

  • 对不起,小提琴不正确。他们没有添加值,检查 Text 属性是否为 null 或者不需要为空,因为 TryParse 会处理这个问题;这一步不需要。
  • TryParse 将返回一个bool。我这样做的唯一原因是为了更好地处理错误。如果您使用TryParse 并且您的文本框为空,它将返回 false。如果您的文本框不为空,并且您的值无效;它也将返回 false。我的方法是检查NullOrEmpty,这样用户就有机会验证输入并转换为int,如果它无效则返回不同的错误消息。这是不同的,没有错。
  • so the user then has a chance to validate the input and convert to an int 当然,我会同意如果这是用户正在做的事情,但事实并非如此。小提琴计算呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 2018-04-12
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多