Событие изменения вычисляемого поля winforms datagridview

У меня есть datagridview, привязанный к таблице данных. У меня есть вычисляемый столбец linetotal, который умножает цену за единицу * количество.

У меня также есть метка totalprice, в которой я хотел бы содержать сумму столбца linetotal в представлении сетки данных.

Когда пользователь вносит какие-либо изменения в цену за единицу или количество, значение linetotal для этой строки должно обновляться, а метка totalprice должна суммировать столбец linetotal.

Кажется, я не могу найти правильное событие для расчета метки totalprice. Я пробовал cellvaluechanged, currentcelldirtystatechanged, rowleave. Кажется, ни один из них не работает правильно. Думаю, мне нужно событие, которое срабатывает после расчета всех столбцов linetotal.

Мой псевдокод:

dt = getallitems(itemnumber);
dt.Columns.Add("LineTotal", typeof(double));
dt.Columns["Linetotal"].Expression = "[unitprice] * [quantity]";

dgv.DataSource = dt;

private void dgv_WhatEventToUse???(object sender, DataGridViewCellEventArgs e)
{
    //method to iterate the rows of the datagridview, and sum linetotal column
}

Должно быть какое-то событие, которое срабатывает при изменении значения вычисляемого столбца.


person muhan    schedule 10.08.2009    source источник


Ответы (3)


Кажется, ваша проблема связана с тем, что ваш вычисляемый столбец является частью DataTable, а не частью DataGridView. Я не уверен, что DataGridView предоставляет событие всякий раз, когда изменяется базовый источник данных dgv. Существует событие DataGridView.DataSourceChanged, но оно, кажется, срабатывает только тогда, когда вы фактически устанавливаете свойство DataSource, а не когда DataTable изменяется с вашими вычислениями.

Если вы хотите, чтобы это работало без изменения структуры вашего кода, подпишитесь на событие DataTable RowChanged, и вы сможете отсканировать dgv и обновить свою метку оттуда. Это не совсем чистое решение, но оно работает. Я бы подумал о переключении на вычисляемый столбец в DataGridView, если это возможно.

person Kyle Gagnet    schedule 10.08.2009

Каждый раз, когда вам нужно обновить столбец вычисляемых данных, просто снова используйте назначение выражения. Меня устраивает.

dt.Columns["Linetotal"].Expression = "[unitprice] * [quantity]"

verbi gratia в моем коде

private void malla18_Mask_Validated(object sender, EventArgs e)
{
  analisis_Tabla_Lote.Columns["SUMA_MALLAS"].Expression = "100 - (Malla12 + Malla14 + Malla15 + Malla16 + Malla17 + Malla18 )";
  analisis_BindingSource.ResetBindings(false);
}

Это все, что вам нужно!

person Jair    schedule 21.04.2012

Обычно я проверяю свои ответы, прежде чем дать их, но я работаю вдали от своего ПК для разработчиков, поэтому я не уверен на 100%, какой маршрут лучше, но вот несколько идей, которые можно попробовать.

В DataGridView вы можете использовать CellEndEdit событие, чтобы сообщить, когда ячейка была отредактирована. также есть событие CellLeave, но я не использовал его, и вам, возможно, придется поэкспериментировать с ним.

В DataGrid можно использовать CurrentCellChanged< /а> событие.

Однако для выполнения каких-либо вычислений вам потребуется извлечь значения из базового объекта Dataable или DataView (в зависимости от того, к чему привязан элемент управления). Я также обнаружил, что использование события DataGrid.CurrentCellChanged является ошибочным и выбрасывается, когда DataGrid находится в базе данных, а не только тогда, когда пользователь редактирует содержимое, поэтому вам может потребоваться бороться с этим... Я полагаю, что CellLeave DataGridView событие может иметь аналогичные проблемы. Как я уже сказал, я не уверен на 100%, поэтому вам нужно будет поэкспериментировать.

Кроме того, как предложил Кайл, вы можете попробовать использовать события из базового источника данных.

Я бы начал с событий DataTable.RowChanged или DataView.ListChanged.

Как я уже сказал, я не могу проверить это сам, но, надеюсь, одна из этих идей укажет вам правильное направление.

person David    schedule 11.08.2009