private void CancelAddNew() { if (this.isEditableObject) { ((IEditableObjectEvents)this.newItemPending).Ended -= new EventHandler(editableListItem_Ended); ((IEditableObjectEvents)this.newItemPending).Cancelled -= new EventHandler(editableListItem_Cancelled); } ObjectView temp = this.newItemPending; this.newItemPending = null; this.Remove(temp.Object); }
/// <summary> /// Adds a new item to the list. /// </summary> /// <returns>The item added to the list (wrapped in an <see cref="ObjectView"/>).</returns> /// <exception cref="T:System.Data.DataException"><see cref="P:System.ComponentModel.IBindingList.AllowNew"></see> is false. </exception> public object AddNew() { Lock(); ObjectView wrapper = null; try { if (!this.allowNew) throw new DataException("AllowNew is set to false."); AddingNewEventArgs args = new AddingNewEventArgs(); OnAddingNew(args); object newItem = args.NewObject; if (newItem == null) { if (this.itemType == null) throw new InvalidOperationException("The list item type must be set first."); newItem = Activator.CreateInstance(this.itemType); } else { if (this.ItemType == null) this.ItemType = newItem.GetType(); else if (newItem.GetType() != this.ItemType) throw new ArgumentException("Added item type is different from list item type."); } wrapper = new ObjectView(newItem); // If an item was previously added with AddNew() but has not yet been committed with item.EndEdit(), commit it now. if (newItemPending != null) FinishAddNew(); this.newItemPending = wrapper; // If the item type is IEditable object, a newly added item will be removed from the list if IEditableObject.CancelEdit is called before // the next call to AddNew(). When IEditableObject.EndEdit() is called, ListChanged+ItemAdded is raised again for the same item. if (this.isEditableObject) { ((IEditableObjectEvents)this.newItemPending).Ended += new EventHandler(editableListItem_Ended); ((IEditableObjectEvents)this.newItemPending).Cancelled += new EventHandler(editableListItem_Cancelled); } this.Add(newItem); } finally { Unlock(); } RaiseEvents(); return wrapper; }
private void FinishAddNew() { if (this.isEditableObject) { ((IEditableObjectEvents)this.newItemPending).Ended -= new EventHandler(editableListItem_Ended); ((IEditableObjectEvents)this.newItemPending).Cancelled -= new EventHandler(editableListItem_Cancelled); } // Raise the second ListItemChanged / ItemAdded event. if (this.isEditableObject) { int index = this.IndexOf(this.newItemPending.Object); this.QueueEvent(new ListChangedEventArgs(ListChangedType.ItemAdded, index)); } this.newItemPending = null; // Now that the item is committed, reposition it in the sort, and potentially filter it out of the list. if (this.IsFiltered) ApplyFilter(); if (this.IsSorted) ApplySortCore(); }