winforms datagridview рассчитанное событие изменения поля - PullRequest
4 голосов
/ 11 августа 2009

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

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

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

Я не могу найти правильное событие, которое можно использовать для вычисления метки итоговой цены. Я попытался изменить значение в ячейке, изменить текущую ячейку, оставить в строке. Ни один из них, кажется, не работает правильно. Я думаю, мне нужно событие, которое срабатывает после того, как все столбцы 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
}

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

Ответы [ 3 ]

1 голос
/ 21 апреля 2012

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

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);
}

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

1 голос
/ 11 августа 2009

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

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

0 голосов
/ 11 августа 2009

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

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

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

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

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

События DataTable.RowChanged или DataView.ListChanged будут с того места, где я начну.

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

...