В моем приложении есть страница, которая должна выполнять следующие действия: загружать данные, вычислять суммы нижнего колонтитула на основе всех строк, а затем, когда пользователь выбирает строки, приложение будет пересчитывать суммы нижнего колонтитула с выбранным строк. Однако у меня есть проблема, при которой при выборе строки он не будет обновлять суммы до правильного значения. Вместо этого это всегда будет «отставание», так сказать. Например, по умолчанию выбрана первая строка, если я выбрал вторую строку, она все равно будет отображать сумму первых строк. И если я выберу третью строку, она обновит итоговую сумму нижнего колонтитула до суммы второй строки. Кроме того, я проверил свойство SelectedRows через консоль отладки, и оно правильно возвращает и суммирует значения. Он просто не обновит интерфейс с правильным значением.
Вот повторяемые шаги:
- Загрузка страниц
- Обновления сетки с правильными суммами нижнего колонтитула
- Я изменяю выбранную строку в сетке (событие FocusedRowChanged)
- Сетка не обновляется с правильными суммами нижнего колонтитула, если я не щелкну левой кнопкой мыши в приложении Visual Studio или если я не добавлю точку останова в своем коде
К вашему сведению: InvalidateFooter
вызывает grid_CustomDrawFooterCell
, чтобы называться
Вот код:
private void gridInternalUnmatched_FocusedRowChanged (object aSender, FocusedRowChangedEventArgs aEventArgs)
{
gridInternalUnmatched.GridView.InvalidateFooter();
}
private void grid_CustomDrawFooterCell(object sender, FooterCellCustomDrawEventArgs e)
{
DataRow row = null;
if (gridInternalUnmatched.Support.SelectedRowHandles.Any())
row = gridInternalUnmatched.Support.GetDataRow(gridInternalUnmatched.Support.SelectedRowHandles[0]);
decimal value = 0;
//Race condition?
switch (e.Info.SummaryItem.FieldName)
{
case "QuantityTradeDate":
value = gridInternalUnmatched.Support.SelectedDataRows.Sum(aX => (decimal)aX["QuantityTradeDate"]);
break;
case "MarketValue":
value = gridInternalUnmatched.Support.SelectedDataRows.Sum(aX => (decimal)aX["MarketValue"]);
break;
case "InitialNotional":
value = gridInternalUnmatched.Support.SelectedDataRows.Sum(aX => (decimal)aX["InitialNotional"]);
break;
default: throw new InvalidOperationException();
}
e.Info.DisplayText = value.ToString();
}