private void PortfolioData_DataChanged(object sender, DataEventArgs <RowChangeBase[]> e) { PortfolioData portfolioData = (PortfolioData)sender; decimal portfolioPnl; lock (this._summary) { decimal[] pnl = this._pnls[portfolioData.PortfolioId]; DataRow summaryRow = this._summary.Rows.Find(portfolioData.PortfolioId); portfolioPnl = summaryRow.Field <decimal>("Pnl"); int portfolioDataPnlOrdinal = PositionData.SchemaTable.Columns.IndexOf("Pnl"); foreach (RowChangeBase rowChange in e.Data) { string ticker = (string)rowChange.RowKey; int index = Array.BinarySearch(this._tickers, ticker); if (rowChange.ChangeType == RowChangeType.Added) { decimal rowPnl = (decimal)((RowAdded)rowChange).Data[portfolioDataPnlOrdinal]; portfolioPnl += (pnl[index] = rowPnl); } else { decimal currentRowPnl = pnl[index]; switch (rowChange.ChangeType) { case RowChangeType.Removed: portfolioPnl -= currentRowPnl; pnl[index] = 0m; break; case RowChangeType.ColumnsChanged: ColumnChange columnChange = ((RowColumnsChanged)rowChange).ColumnChanges.FirstOrDefault(change => change.ColumnOrdinal == portfolioDataPnlOrdinal); if (columnChange == null) { continue; } decimal newRowPnl = (decimal)columnChange.Value; pnl[index] = newRowPnl; portfolioPnl += newRowPnl - currentRowPnl; break; } } } summaryRow.SetField("Pnl", portfolioPnl); summaryRow.AcceptChanges(); } lock (this._rowChanges) { int index = this._rowChanges.BinarySearchByValue(portfolioData.PortfolioId, change => (string)change.RowKey); if (index < 0) { this._rowChanges.Insert(~index, new RowColumnsChanged { RowKey = portfolioData.PortfolioId, ColumnChanges = { new ColumnChange { ColumnOrdinal = this._summary.Columns.IndexOf("Pnl"), Value = portfolioPnl } } }); } else { RowColumnsChanged rowChange = (RowColumnsChanged)this._rowChanges[index]; rowChange.ColumnChanges[0].Value = portfolioPnl; } } }