如何在更新任何datagridview单元时触发计算

时间:2018-05-18 20:55:08

标签: c# datagridview

我创建了这个计算,当单击一个按钮时会触发它,它将乘以2个datagridview列并将结果显示在第三个,然后将总共2列相加并将结果发送到2个文本框

现在我想在数据网格视图中输入一个值或编辑(其中一列是产品数量)时就会发生这种情况,因此在输入时它应该重做计算...所以我应该将此代码添加到哪个空格中?

private void btnClearPN_Click(object sender, EventArgs e)
{
    for (int i = 0; i < dataGridView1.Rows.Count; i++)
    {
        decimal a = Convert.ToInt32(dataGridView1.Rows[i].Cells[2].Value);
        decimal b = Convert.ToInt32(dataGridView1.Rows[i].Cells[3].Value);

        decimal c = a * b;

        dataGridView1.Rows[i].Cells[4].Value = c.ToString();


    }
    GrandTotal();
    Qty();
}

1 个答案:

答案 0 :(得分:1)

第一个选项 - 用户完成编辑后更新单元格值

如果要在用户完成编辑值时更新DataGridView,则应该处理DataGridView的CellEndEdit事件(这取决于用户移动到下一个Cell或移动到窗体上的另一个控件)。有关详细信息,请参阅MSDN - DataGridView.CellEndEdit Event

  

当编辑模式停止当前选定的单元格时发生。

    private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs dataGridViewCellEventArgs)
    {
        for (int i = 0; i < dataGridView1.Rows.Count; i++)
        {
            decimal a = Convert.ToDecimal(dataGridView1.Rows[i].Cells[2].Value);
            decimal b = Convert.ToDecimal(dataGridView1.Rows[i].Cells[3].Value);

            decimal c = a * b;

            dataGridView1.Rows[i].Cells[4].Value = c.ToString();
        }

        GrandTotal();
        Qty();
    }

第二个选项 - 在用户输入时更新单元格值

使用此方法需要更多参与,并且需要正确处理EditControlShowing事件,并且TextBox它是TextChanged事件。

如果要在用户键入时更新DataGridView,则应该处理DataGridView的EditControlShowing事件。此事件将允许您访问编辑控件。对于简单的DataGridView设置,这是一个TextBox。虽然这可以很容易地成为ComboBox,CheckBox或任何其他控件。

有关详细信息,请参阅MSDN - DataGridView.EditingControlShowing Event

  

在显示用于编辑单元格的控件时发生..

    private DataGridViewRow CurrentRow;
    private void DataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs dataGridViewEditingControlShowingEventArgs)
    {
        CurrentRow = dataGridView1.CurrentRow;
        TextBox textBox = dataGridViewEditingControlShowingEventArgs.Control as TextBox;
        if (textBox != null)
        {
            textBox.TextChanged -= textBox_TextChanged;
            textBox.TextChanged += textBox_TextChanged;
        }
    }

    private void textBox_TextChanged(object sender, EventArgs eventArgs)
    {
        TextBox textBox = (TextBox)sender;
        decimal a = Convert.ToDecimal(CurrentRow.Cells[2].Value);
        decimal b = Convert.ToDecimal(CurrentRow.Cells[3].Value);

        decimal c = a * b;

        CurrentRow.Cells[4].Value = c.ToString();
    }

注意:必须包含以下行:

textBox.TextChanged -= textBox_TextChanged;

由于处理程序是在运行时添加的,因此每次显示编辑控件时,都必须删除任何以前添加的处理程序,否则将多次调用它。