/// <summary> /// Invoked whenever the user modifies the contents of the grid. /// </summary> /// <param name="sender">Sender object.</param> /// <param name="args">Event arguments.</param> private void OnGridChanged(object sender, GridCellsChangedArgs args) { try { if (args.InvalidValue) { throw new Exception("The value you entered was not valid for its datatype."); } foreach (IGridCell cell in args.ChangedCells) { int index = GetModelIndex(cell.RowIndex); IModel removalType = Apsim.Child(model, grid.GetCell(0, index).Value.ToString()); if (removalType != null) { List <MemberInfo> members = PropertyPresenter.GetMembers(removalType); MemberInfo member = members[cell.RowIndex - index - 1]; IVariable property = null; if (member is PropertyInfo) { property = new VariableProperty(model, member as PropertyInfo); } else if (member is FieldInfo) { property = new VariableField(model, member as FieldInfo); } else { throw new Exception(string.Format("Unable to find property {0} in model {1}", grid.GetCell(0, cell.RowIndex).Value.ToString(), removalType.Name)); } object value = PropertyPresenter.FormatValueForProperty(property, cell.Value); ChangeProperty command = new ChangeProperty(removalType, property.Name, value); presenter.CommandHistory.Add(command); } } } catch (Exception err) { presenter.MainPresenter.ShowError(err); } }