C# 总价值的计算是错误的

C# 总价值的计算是错误的,c#,datagridview,calculation,C#,Datagridview,Calculation,我有代码,一切都很好,直到我把数字放在3000以上,结果将是负数,请帮助 我不知道为什么会这样,我已经调试过了,或者我用int声明了它 我提到的总价值是int total=数量*成本 顺便问一下,除了数量栏之外,还有什么可以阻止用户类型的吗 private void G2_CellEndEdit(object sender, DataGridViewCellEventArgs e) { try { int quantity, co

我有代码,一切都很好,直到我把数字放在3000以上,结果将是负数,请帮助

我不知道为什么会这样,我已经调试过了,或者我用int声明了它

我提到的总价值是int total=数量*成本

顺便问一下,除了数量栏之外,还有什么可以阻止用户类型的吗

 private void G2_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        try
        {
            int quantity, cost;
            if (int.TryParse(G2.Rows[e.RowIndex].Cells["Quantity"].Value.ToString(), out quantity) && int.TryParse(G2.Rows[e.RowIndex].Cells["Cost2"].Value.ToString(), out cost))
            {
                int total= quantity * cost;
                G2.Rows[e.RowIndex].Cells["Total"].Value = total.ToString();
            }

            int quan, mini;

            quan = Convert.ToInt32(G2.Rows[e.RowIndex].Cells["Quantity"].Value);
            mini = Convert.ToInt32(G2.Rows[e.RowIndex].Cells["MinimumOrder2"].Value);

            if (quan < mini)
            {
                MessageBox.Show("QUANTITY must be GREATER or EQUAL to MINIMUM ORDER", "STOP", MessageBoxButtons.OK, MessageBoxIcon.Error);
                G2.Rows[e.RowIndex].Cells["Quantity"].Value = "";
                G2.Rows[e.RowIndex].Cells["Total"].Value = "";
                return;

            }
            else
            {
                //Sum the Total Column to TOTAL VALUES text box
                decimal TotalValue = 0;
                for (int i = 0; i < G2.Rows.Count; i++)
                {
                    if (G2.Rows[i].Cells["Total"].Value == DBNull.Value)
                    {
                        return;
                    }
                    else
                    {
                        TotalValue += Convert.ToDecimal(G2.Rows[i].Cells["Total"].Value);
                    }
                }

                totalvalue.Text = TotalValue.ToString();
            }

        }
        catch (Exception ex)
        {
            MessageBox.Show("Please Enter Only Number");
            return;
        }

    }
private void G2\u CellEndEdit(对象发送方,DataGridViewCellEventArgs e)
{
尝试
{
整数数量、成本;
if(int.TryParse(G2.Rows[e.RowIndex].Cells[“Quantity”].Value.ToString(),out Quantity)和&int.TryParse(G2.Rows[e.RowIndex].Cells[“Cost2”].Value.ToString(),out cost))
{
整数合计=数量*成本;
G2.行[e.RowIndex]。单元格[“总计”]。值=总计。ToString();
}
小泉,;
quan=Convert.ToInt32(G2.Rows[e.RowIndex].单元格[“数量”].Value);
mini=Convert.ToInt32(G2.Rows[e.RowIndex].Cells[“MinimumOrder2”].Value);
如果(全
一个问题是“总循环”。我认为
返回
应该是
继续

if (G2.Rows[i].Cells["Total"].Value == DBNull.Value)
{
    continue;
}
另一个问题是,为单击的行计算的
total
被计算为
int
而不是
deciminal
。将代码更改为:

int quantity;
decimal cost;
if(int.TryParse(G2.Rows[e.RowIndex].Cells["Quantity"].Value.ToString(), out quantity) && 
   decimal.TryParse(G2.Rows[e.RowIndex].Cells["Cost2"].Value.ToString(), out cost))
        {
            int total= quantity * cost;
            G2.Rows[e.RowIndex].Cells["Total"].Value = total.ToString();
        }

另一个问题可能是允许用户总共输入值。下面是仅允许数量字段中的数字的代码

private void G2_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        String sCellName = G2.Columns[G2.CurrentCell.ColumnIndex].Name.ToUpper();
        if (sCellName == "QUANTITY") //----change with yours
        {

            e.Control.KeyPress +=  new KeyPressEventHandler(Control_KeyPress);


        }
    }

    private void Control_KeyPress(object sender, KeyPressEventArgs e)
    {

        if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.')
        {
            e.Handled = true;
        }

        // only allow one decimal point
        if (e.KeyChar == '.'
            && (sender as TextBox).Text.IndexOf('.') > -1)
        {
            e.Handled = true;
        }
    }

[已解决]不再使用int,将其更改为decimal

private void G2_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    try
    {
        decimal quantity, cost;
        if (decimal .TryParse(G2.Rows[e.RowIndex].Cells["Quantity"].Value.ToString(), out quantity) && decimal .TryParse(G2.Rows[e.RowIndex].Cells["Cost2"].Value.ToString(), out cost))
        {
            decimal total= quantity * cost;
            G2.Rows[e.RowIndex].Cells["Total"].Value = total.ToString();
        }

        int quan, mini;

        quan = Convert.ToInt32(G2.Rows[e.RowIndex].Cells["Quantity"].Value);
        mini = Convert.ToInt32(G2.Rows[e.RowIndex].Cells["MinimumOrder2"].Value);

        if (quan < mini)
        {
            MessageBox.Show("QUANTITY must be GREATER or EQUAL to MINIMUM ORDER", "STOP", MessageBoxButtons.OK, MessageBoxIcon.Error);
            G2.Rows[e.RowIndex].Cells["Quantity"].Value = "";
            G2.Rows[e.RowIndex].Cells["Total"].Value = "";
            return;

        }
        else
        {
            //Sum the Total Column to TOTAL VALUES text box
            decimal TotalValue = 0;
            for (int i = 0; i < G2.Rows.Count; i++)
            {
                if (G2.Rows[i].Cells["Total"].Value == DBNull.Value)
                {
                    return;
                }
                else
                {
                    TotalValue += Convert.ToDecimal(G2.Rows[i].Cells["Total"].Value);
                }
            }

            totalvalue.Text = TotalValue.ToString();
        }

    }
    catch (Exception ex)
    {
        MessageBox.Show("Please Enter Only Number");
        return;
    }

}
private void G2\u CellEndEdit(对象发送方,DataGridViewCellEventArgs e)
{
尝试
{
十进制数量、成本;
if(decimal.TryParse(G2.Rows[e.RowIndex].Cells[“Quantity”].Value.ToString(),out Quantity)和&decimal.TryParse(G2.Rows[e.RowIndex].Cells[“Cost2”].Value.ToString(),out cost))
{
小数总数=数量*成本;
G2.行[e.RowIndex]。单元格[“总计”]。值=总计。ToString();
}
小泉,;
quan=Convert.ToInt32(G2.Rows[e.RowIndex].单元格[“数量”].Value);
mini=Convert.ToInt32(G2.Rows[e.RowIndex].Cells[“MinimumOrder2”].Value);
如果(全
您还可以显示datagrid的代码吗?@Mixxiphoid除此之外一切正常。为什么不尝试使用调试器检查代码中发生的情况?这似乎与您的实际数据有关。@Steve我刚刚为您编辑了一些易于理解的内容understand@Steve就像我说的,我已经调试过了,我用它来防止错误对象不能从DBNull转换为其他类型。所以如果为空,返回,让用户完成他们的输入,该行是错误的**int total=数量*成本**我不能总共键入int,因为成本是小数对不起,我的“复制和粘贴”错误。应为<代码>十进制合计=数量*成本我仍然可以在单元格中键入“hhh”“aaaa”,我已经将EditingControlShowing添加到事件datagridview中关于控件的按键,我在哪里添加这个?您能验证数量字段名称是否与提供的相同吗?
字符串sCellName=G2.Columns[G2.CurrentCell.ColumnIndex].name.ToUpper();如果(sCellName==“Quantity”)/--change with yours{e.Control.KeyPress+=new KeyPressEventHandler(Control_KeyPress);}
是,数量字段名为Quantity在datagridview G2事件中,在表单中的方法下方添加控制_KeyPress的代码?按键事件?