使用if语句选择了错误的条件

时间:2018-11-06 14:25:27

标签: c# asp.net

这里我们使用if语句,并且第一次可以正常工作

然后,当我输入条形码并再次按Enter时,它将直接指向else语句 它的意思是向我显示错误消息,就像我们在else语句上看到的一样,我认为它不会像新过程一样重复整个语句,因为我从条件上确定它是真实的并且不应该转到else语句 但是第三次​​当我尝试输入条形码并从条件开始检查时,它像第一次一样工作正常,然后第四次再次显示错误

为什么第二次显示错误

 private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        if (checkBox1.Checked)
        {

            if (qtystate == true)
            {
                DataTable dt;
                barcode = textBox1.Text;
                dt = pro.GetProdcutBar(textBox1.Text);

                if (dt.Rows.Count > 0)
                {
                    foreach (DataRow row in dt.Rows)
                    {
                        barcode = row[0].ToString();
                        itemno = row[1].ToString();
                        itemname = row[2].ToString();
                        salespric = row[3].ToString();
                        costprice = row[4].ToString();
                    }
                    cont.addprodcuttocount(Convert.ToString(barcode), Convert.ToString(itemno), Convert.ToString(itemname),
                        Convert.ToString(salespric), Convert.ToString(costprice), "1", DateTime.Now, SystemInformation.ComputerName);
                    refershgridview();

                    //sum qty
                    try
                    {
                        int sum = 0;
                        for (int i = 0; i < dataGridView1.Rows.Count; ++i)
                        {
                            if (Convert.ToString(dataGridView1.Rows[i].Cells[1].Value) == textBox1.Text)
                            {
                                sum += Convert.ToInt32(dataGridView1.Rows[i].Cells[6].Value);
                            }

                        }
                        label3.Text = "Barcode " + barcode + " - " + "Item NO" + itemno + " - " + "item name " + itemname + " - " + "qty  " + sum.ToString();
                    }

                    catch
                    {

                    }

                    barcode = "";
                    itemno = "";
                    itemname = "";
                    salespric = "";
                    costprice = "";
                    qtyitem = "";
                    textBox1.Clear();
                    textBox1.Focus();
                }

                else
                {
                    MessageBox.Show("00barcode not found", "barcode", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    barcode = "";
                    itemno = "";
                    itemname = "";
                    salespric = "";
                    costprice = "";
                    qtyitem = "";
                    textBox1.Clear();
                    textBox1.Focus();
                }

            }

        }

    }
}

1 个答案:

答案 0 :(得分:0)

if...else块的判别符是此行:

if (dt.Rows.Count > 0)

对函数的其他每次调用都将执行if子句的主体。对于其余的调用,将执行else子句。

基于这些症状,似乎有些东西正在改变此行的结果:

dt = pro.GetProdcutBar(textBox1.Text)

在一半的通话中,您至少得到一行;在其他情况下,您得到零行。您的问题是,为什么结果每次其他呼叫都会改变?

引起人们注意的几个原因:

  1. 您的GetProdcutBar方法不会简单地检索数据,而是会修改数据(副作用)。这是不可取的,因为它掩盖了您的结果集随每次调用而变化的事实。

  2. 程序中的另一种方法是更改​​数据。这可能是对用户活动(例如,单击鼠标)的响应。

  3. 检索数据的基础代码以这样的方式编写,即它返回无法可靠预测的一组数据(即,它是不确定的)。选择标准之一可能使用一天中的时间或时钟滴答,线程ID或其他一些易失性值。

如果出现上述任何一种情况,则您的数据可能会从一个调用更改为下一个调用,可能不会返回任何结果。检查该函数,并确保它在每次调用时都可靠地返回您期望的数据,并且您没有使用可变函数参数(除非绝对必要)。

此外,作为一个离别的想法:如果查询未返回任何记录,这是否真的是错误条件?在大多数情况下,不是这样(除非查询用于所需的查找数据)。关键要做的是处理所有可用的行,如果没有要处理的数据,则什么也不做。