datagridview单元格结束编辑未触发

时间:2016-03-29 04:38:46

标签: c# winforms

我有数据,价格和净价格的数据网格视图。默认情况下,数量为1,相关价格为。我想编辑数量,所以净价将根据那个来。例如,如果我将数量编辑为2,则netprice将为2.它将从价格列中获取价格并计算

这是我的代码。

 private void grvItems_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        foreach (DataGridViewRow row in grvItems.Rows)
        {
            if (e.ColumnIndex == grvItems.Columns["Quantity"].Index)
            {
                grvItems.EndEdit();
                decimal quantity = Convert.ToDecimal(row.Cells["Quantity"].Value);
                decimal price = Convert.ToDecimal(row.Cells["Amt"].Value);
                decimal netprice = (quantity * price);
                row.Cells["netprice"].Value = Math.Round((netprice), 2);
            }


        }
        CalculateTotal();

    }

但是,evnt没有开火。如果我编辑数量,则不会重新选择净价。请提出建议。

2 个答案:

答案 0 :(得分:0)

只有在细胞失去焦点后,您的更改才会反映出来。 如果要在编辑期间查看更改,可以使用其他事件:

dataGridView1_CellBeginEdit

您可以从MSDN获得帮助,其中有一个简单的例子:CellBeginEdit and CellEndEdit

<强>更新

正如已经提到的,让我们确保您已经注册了您的活动。 在表单构造函数中,写如下:

public Form1()  // Constructor
    {
        InitializeComponent();

        grvItems.CellBeginEdit += grvItems_CellBeginEdit;
        grvItems.CellEndEdit += grvItems_CellEndEdit;
    }

<强>更新

以这种方式帮助你很难。我创建了一个类似的例子。打开一个新的Windows窗体应用程序,粘贴以下代码。 您需要在窗体(Form1)上添加DataGridView。 这个例子运行正常。完成后,尝试查看与您的代码有什么不同。

 public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        System.Data.DataTable dt = new System.Data.DataTable();

        dt.Columns.Add("Quantity", Type.GetType("System.Decimal")); // You can change it to Int32
        dt.Columns.Add("Amt", Type.GetType("System.Decimal"));
        dt.Columns.Add("netprice", Type.GetType("System.Decimal"));

        var row = dt.NewRow();
        row["Quantity"] = 1;
        row["Amt"] = 2.5;
        row["netprice"] = 0;

        dt.Rows.Add(row);
        dataGridView1.DataSource = dt;
    }

    private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (e.ColumnIndex == dataGridView1.Columns["Quantity"].Index)
            {
                dataGridView1.EndEdit();
                decimal quantity = Convert.ToDecimal(row.Cells["Quantity"].Value);
                decimal price = Convert.ToDecimal(row.Cells["Amt"].Value);
                decimal netprice = (quantity * price);
                row.Cells["netprice"].Value = Math.Round((netprice), 2);
            }
        }


        // My suggestion:
        // No need to go through all the rows, just the current one
        /*
        if (e.ColumnIndex == dataGridView1.Columns["Quantity"].Index)
        {
            // dataGridView1.EndEdit(); // No need this line, you are already in CellEndEdit event

            var currentRow = dataGridView1.Rows[e.RowIndex];
            decimal quantity = Convert.ToDecimal(currentRow.Cells["Quantity"].Value);
            decimal price = Convert.ToDecimal(currentRow.Cells["Amt"].Value);
            decimal netprice = (quantity * price);
            currentRow.Cells["netprice"].Value = Math.Round((netprice), 2);
        }
        */
    }

}

enter image description here

答案 1 :(得分:0)

您可能想尝试使用CellValueChanged事件作为CellEndEdit的替代方法,并查看它是否满足您的要求。

此外,考虑让DataGridView进行大部分工作:

Principal

enter image description here