or
public class EntityStateCollection<T> : IList<T> where T : new(){ #region Membres private List<EntityState<T>> _entityStates; private Enumerator<T> _innerEnumerator; public event EventHandler ItemAdded; public event EventHandler ItemDeleted; public event EventHandler ItemModified; #endregion #region Enumerator [Serializable, StructLayout(LayoutKind.Sequential)] public struct Enumerator<T> : IEnumerator<T>, IDisposable, IEnumerator where T : new() { private List<EntityState<T>> list; private int index; private T current; internal Enumerator(List<EntityState<T>> list) { this.list = list; this.index = 0; this.current = default(T); } public void Dispose() { } public bool MoveNext() { List<EntityState<T>> list = this.list; if (this.index < list.Count) { this.current = list[this.index].InnerObject; this.index++; return true; } else { this.current = default(T); return false; } } public T Current { get { return this.current; } } object IEnumerator.Current { get { return this.Current; } } void IEnumerator.Reset() { this.index = 0; this.current = default(T); } } #endregion Enumerator public EntityStateCollection() { _entityStates = new List<EntityState<T>>(); _innerEnumerator = new Enumerator<T>(_entityStates); } public void SetModified(T item) { EntityState<T> entity = _entityStates[this.IndexOf(item)]; if (entity.ObjectState != State.Added) { entity.ObjectState = State.Modified; this.ItemModified(entity, null); } } /// <summary> /// Returns true if all T entities are at Current state. /// </summary> /// <returns></returns> public bool IsInCurrentState() { for (int i = 0; i < _entityStates.Count; i++) { if (_entityStates[i].ObjectState != State.Current) { return false; } } return true; } public EntityState<T> GetEntityState(int i) { return _entityStates[i]; } /// <summary> /// Add a list of T objects to the collection with the Current state /// </summary> /// <param name="lst"></param> public void AddRange(List<T> lst) { foreach (T item in lst) { _entityStates.Add(new EntityState<T>(State.Current, item)); //this.ItemAdded(_entityStates[this.IndexOf(item)], null); } } #region IList<T> Membres public int IndexOf(T item) { int itemIndex = -1; for (int i = 0; i < _entityStates.Count; i++) { if (_entityStates[i].InnerObject.Equals(item)) { itemIndex = i; break; } } return itemIndex; } public void Insert(int index, T item) { _entityStates.Insert(index, new EntityState<T>(State.Added, item)); this.ItemAdded(_entityStates[index], null); } public void RemoveAt(int index) { _entityStates[index].ObjectState = State.Deleted; this.ItemDeleted(_entityStates[index], null); } public T this[int index] { get { return _entityStates[index].InnerObject; } set { _entityStates[index].InnerObject = value; } } #endregion #region ICollection<T> Membres public void Add(T item) { _entityStates.Add(new EntityState<T>(State.Added, item)); this.ItemAdded(_entityStates[this.IndexOf(item)], null); } public void Clear() { _entityStates.Clear(); } public bool Contains(T item) { for (int i = 0; i < _entityStates.Count; i++) { if (_entityStates[i].InnerObject.Equals(item)) { return true; } } return false; } public void CopyTo(T[] array, int arrayIndex) { throw new NotImplementedException(); } public int Count { get { return _entityStates.Count; } } public bool IsReadOnly { get { return false; } } public bool Remove(T item) { for (int i = 0; i < _entityStates.Count; i++) { if (_entityStates[i].InnerObject.Equals(item)) { _entityStates[i].ObjectState = State.Deleted; this.ItemDeleted(_entityStates[i], null); return true; } } return false; } #endregion #region IEnumerable et IEnumerable<T> Membres public IEnumerator<T> GetEnumerator() { return this._innerEnumerator; } IEnumerator IEnumerable.GetEnumerator() { return this._innerEnumerator; } #endregionprivate void ra_Load(object sender, EventArgs e) { List<string> firstname = new List<string>(); firstname.Add("SAM"); firstname.Add("TAYLOR"); firstname.Add("ROSE"); GridViewDataRowInfo row; for (int i = 0; i < firstname.Count; i++) { row = radGridView1.Rows.AddNew(); row.Cells[0].Value = firstname[i]; } } private void btnNext_Click(object sender, EventArgs e) { //this.Close(); ra newra = new ra(); newra.ShowDialog(); }