Merge pull request #439 from mono-soc-2012/garyb/iconfix
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / DataGridViewRowCollection.cs
index 6770b98b960d3ad598f8b0eb4e85081735c326e7..8261f1f87562ca1964c1110362ff798af0a9224e 100644 (file)
 //
 
 
-#if NET_2_0
-
 using System.ComponentModel;
 using System.Collections;
 using System.ComponentModel.Design.Serialization;
 
-namespace System.Windows.Forms {
-
+namespace System.Windows.Forms
+       {
        [DesignerSerializerAttribute ("System.Windows.Forms.Design.DataGridViewRowCollectionCodeDomSerializer, " + Consts.AssemblySystem_Design,
                                      "System.ComponentModel.Design.Serialization.CodeDomSerializer, " + Consts.AssemblySystem_Design)]
        [ListBindable (false)]
-       public class DataGridViewRowCollection : IList, ICollection, IEnumerable {
-
+       public class DataGridViewRowCollection : IList, ICollection, IEnumerable
+       {
                private ArrayList list;
                private DataGridView dataGridView;
-
                private bool raiseEvent = true;
 
                public DataGridViewRowCollection (DataGridView dataGridView)
@@ -52,8 +49,7 @@ namespace System.Windows.Forms {
                        get { return list.Count; }
                }
 
-               int ICollection.Count
-               {
+               int ICollection.Count {
                        get { return Count; }
                }
 
@@ -100,81 +96,110 @@ namespace System.Windows.Forms {
                [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                public virtual int Add ()
                {
-                       return Add(dataGridView.RowTemplate.Clone() as DataGridViewRow);
+                       return Add (dataGridView.RowTemplateFull as DataGridViewRow);
                }
 
-               int IList.Add(object o)
+               int IList.Add (object value)
                {
-                       return Add(o as DataGridViewRow);
+                       return Add (value as DataGridViewRow);
                }
 
-               internal int AddInternal (DataGridViewRow dataGridViewRow, bool sharable)
+               private int AddCore (DataGridViewRow dataGridViewRow, bool sharable)
                {
-                       if (dataGridView.DataSource != null) {
-                               throw new InvalidOperationException ("DataSource of DataGridView is not null.");
-                       }
-                       if (dataGridView.Columns.Count == 0) {
+                       if (dataGridView.Columns.Count == 0)
                                throw new InvalidOperationException ("DataGridView has no columns.");
+                       
+                       int result;
+                       
+                       dataGridViewRow.SetDataGridView (dataGridView);
+
+                       // 
+                       // Add the row just before the editing row (if there is an editing row).
+                       // 
+                       int editing_index = -1;
+                       if (DataGridView != null && DataGridView.EditingRow != null && DataGridView.EditingRow != dataGridViewRow) {
+                               editing_index = list.Count - 1; // always the last row
+                               DataGridView.EditingRow.SetIndex (list.Count);
                        }
-                       int result = list.Add (dataGridViewRow);
+                       
+                       if (editing_index >= 0) {
+                               list.Insert (editing_index, dataGridViewRow);
+                               result = editing_index;
+                       } else {
+                               result = list.Add (dataGridViewRow);
+                       }
+                       
                        if (sharable && CanBeShared (dataGridViewRow)) {
                                dataGridViewRow.SetIndex (-1);
                        } else {
-                               dataGridViewRow.SetIndex (list.Count - 1);
+                               dataGridViewRow.SetIndex (result);
                        }
-                       dataGridViewRow.SetDataGridView (dataGridView);
 
+                       CompleteRowCells (dataGridViewRow);
                        for (int i = 0; i < dataGridViewRow.Cells.Count; i++) {
                                dataGridViewRow.Cells [i].SetOwningColumn (dataGridView.Columns [i]);
                        }
 
-                       OnCollectionChanged (new CollectionChangeEventArgs (CollectionChangeAction.Add, dataGridViewRow));
                        if (raiseEvent) {
-                               DataGridView.OnRowsAdded (new DataGridViewRowsAddedEventArgs (result, 1));
+                               OnCollectionChanged (new CollectionChangeEventArgs (CollectionChangeAction.Add, dataGridViewRow));
+                               DataGridView.OnRowsAddedInternal (new DataGridViewRowsAddedEventArgs (result, 1));
                        }
+
                        return result;
                }
 
+               // Complete the rows if they are incomplete.
+               private void CompleteRowCells (DataGridViewRow row)
+               {
+                       if (row == null || DataGridView == null)
+                               return;
+
+                       if (row.Cells.Count < DataGridView.ColumnCount) {
+                               for (int i = row.Cells.Count; i < DataGridView.ColumnCount; i++)
+                                       row.Cells.Add ((DataGridViewCell) DataGridView.Columns[i].CellTemplate.Clone ());
+                       }
+               }
+
                public virtual int Add (DataGridViewRow dataGridViewRow)
                {
-                       return AddInternal (dataGridViewRow, true);
+                       if (dataGridView.DataSource != null)
+                               throw new InvalidOperationException ("DataSource of DataGridView is not null.");
+                       return AddCore (dataGridViewRow, true);
                }
                
                private bool CanBeShared (DataGridViewRow row)
                {
-                       foreach (DataGridViewCell cell in row.Cells) {
-                               if (cell.Value != null)
-                                       return false;
-                               
-                               if (cell.ToolTipText != string.Empty)
-                                       return false;
-                                       
-                               if (cell.ContextMenuStrip != null)
-                                       return false;
-                       }       
+                       // We don't currently support shared rows
+                       return false;
                        
-                       return true;
+                       //foreach (DataGridViewCell cell in row.Cells) {
+                       //        if (cell.Value != null)
+                       //                return false;
+                       //        if (cell.ToolTipText != string.Empty)
+                       //                return false;
+                       //        if (cell.ContextMenuStrip != null)
+                       //                return false;
+                       //}
+
+                       //return true;
                }
                
 
                [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                public virtual int Add (int count)
                {
-                       if (count <= 0) {
+                       if (count <= 0)
                                throw new ArgumentOutOfRangeException("Count is less than or equeal to 0.");
-                       }
-                       if (dataGridView.DataSource != null) {
+                       if (dataGridView.DataSource != null)
                                throw new InvalidOperationException("DataSource of DataGridView is not null.");
-                       }
-                       if (dataGridView.Columns.Count == 0) {
+                       if (dataGridView.Columns.Count == 0)
                                throw new InvalidOperationException("DataGridView has no columns.");
-                       }
+
                        raiseEvent = false;
                        int result = 0;
-                       for (int i = 0; i < count; i++) {
-                               result = Add(dataGridView.RowTemplate.Clone() as DataGridViewRow);
-                       }
-                       DataGridView.OnRowsAdded(new DataGridViewRowsAddedEventArgs(result - count + 1, count));
+                       for (int i = 0; i < count; i++)
+                               result = Add (dataGridView.RowTemplateFull as DataGridViewRow);
+                       DataGridView.OnRowsAddedInternal (new DataGridViewRowsAddedEventArgs (result - count + 1, count));
                        raiseEvent = true;
                        return result;
                }
@@ -182,15 +207,13 @@ namespace System.Windows.Forms {
                [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                public virtual int Add (params object[] values)
                {
-                       if (values == null) {
+                       if (values == null)
                                throw new ArgumentNullException("values is null.");
-                       }
-                       if (dataGridView.VirtualMode) {
+                       if (dataGridView.VirtualMode)
                                throw new InvalidOperationException("DataGridView is in virtual mode.");
-                       }
+
                        DataGridViewRow row = (DataGridViewRow)dataGridView.RowTemplateFull;
-                       
-                       int result = AddInternal (row, false);
+                       int result = AddCore (row, false);
                        row.SetValues(values);
                        return result;
                }
@@ -199,70 +222,95 @@ namespace System.Windows.Forms {
                {
                        raiseEvent = false;
                        int lastIndex = 0;
-                       for (int i = 0; i < count; i++) {
+                       for (int i = 0; i < count; i++)
                                lastIndex = AddCopy(indexSource);
-                       }
-                       DataGridView.OnRowsAdded(new DataGridViewRowsAddedEventArgs(lastIndex - count + 1, count));
+                       DataGridView.OnRowsAddedInternal (new DataGridViewRowsAddedEventArgs (lastIndex - count + 1, count));
                        raiseEvent = true;
                        return lastIndex;
                }
 
                public virtual int AddCopy (int indexSource)
                {
-                       return Add((list[indexSource] as DataGridViewRow).Clone() as DataGridViewRow);
+                       return Add ((list [indexSource] as DataGridViewRow).Clone () as DataGridViewRow);
                }
 
                [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
-               public virtual void AddRange (params DataGridViewRow[] dataGridViewRows)
+               public virtual void AddRange (params DataGridViewRow [] dataGridViewRows)
                {
-                       raiseEvent = false;
+                       if (dataGridView.DataSource != null)
+                               throw new InvalidOperationException ("DataSource of DataGridView is not null.");
+
                        int count = 0;
                        int lastIndex = -1;
+                       raiseEvent = false;
                        foreach (DataGridViewRow row in dataGridViewRows) {
-                               lastIndex = Add(row);
+                               lastIndex = Add (row);
                                count++;
                        }
-                       DataGridView.OnRowsAdded(new DataGridViewRowsAddedEventArgs(lastIndex - count + 1, count));
                        raiseEvent = true;
+
+                       DataGridView.OnRowsAddedInternal (new DataGridViewRowsAddedEventArgs (lastIndex - count + 1, count));
+                       OnCollectionChanged (new CollectionChangeEventArgs (CollectionChangeAction.Add, dataGridViewRows));
                }
 
                public virtual void Clear ()
                {
-                       list.Clear();
+                       int total = list.Count;
+                       
+                       DataGridView.OnRowsPreRemovedInternal (new DataGridViewRowsRemovedEventArgs (0, total));
+
+                       for (int i = 0; i < total; i++) {
+                               DataGridViewRow row = (DataGridViewRow)list[0];
+                               
+                               // We can exit because the NewRow is always last
+                               if (row.IsNewRow)
+                                       break;
+
+                               row.SetDataGridView (null);
+                               list.Remove (row);
+                               ReIndex ();
+                       }
+
+                       DataGridView.OnRowsPostRemovedInternal (new DataGridViewRowsRemovedEventArgs (0, total));
+                       OnCollectionChanged (new CollectionChangeEventArgs (CollectionChangeAction.Refresh, null));
+               }
+
+               internal void ClearInternal ()
+               {
+                       list.Clear ();
                }
 
-               bool IList.Contains (object o)
+               bool IList.Contains (object value)
                {
-                       return Contains(o as DataGridViewRow);
+                       return Contains (value as DataGridViewRow);
                }
 
                public virtual bool Contains (DataGridViewRow dataGridViewRow)
                {
-                       return list.Contains(dataGridViewRow);
+                       return list.Contains (dataGridViewRow);
                }
 
                void ICollection.CopyTo (Array array, int index)
                {
-                       list.CopyTo(array, index);
+                       list.CopyTo (array, index);
                }
 
                public void CopyTo (DataGridViewRow[] array, int index)
                {
-                       list.CopyTo(array, index);
+                       list.CopyTo (array, index);
                }
 
                IEnumerator IEnumerable.GetEnumerator ()
                {
-                       return list.GetEnumerator();
+                       return list.GetEnumerator ();
                }
 
                public int GetFirstRow (DataGridViewElementStates includeFilter)
                {
                        for (int i = 0; i < list.Count; i++) {
-                               DataGridViewRow row = (DataGridViewRow) list[i];
-                               if ((row.State & includeFilter) != 0) {
+                               DataGridViewRow row = (DataGridViewRow) list [i];
+                               if ((row.State & includeFilter) != 0)
                                        return i;
-                               }
                        }
                        return -1;
                }
@@ -270,10 +318,9 @@ namespace System.Windows.Forms {
                public int GetFirstRow (DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter)
                {
                        for (int i = 0; i < list.Count; i++) {
-                               DataGridViewRow row = (DataGridViewRow) list[i];
-                               if (((row.State & includeFilter) != 0) && ((row.State & excludeFilter) == 0)) {
+                               DataGridViewRow row = (DataGridViewRow) list [i];
+                               if (((row.State & includeFilter) != 0) && ((row.State & excludeFilter) == 0))
                                        return i;
-                               }
                        }
                        return -1;
                }
@@ -281,10 +328,9 @@ namespace System.Windows.Forms {
                public int GetLastRow (DataGridViewElementStates includeFilter)
                {
                        for (int i = list.Count - 1; i >= 0; i--) {
-                               DataGridViewRow row = (DataGridViewRow) list[i];
-                               if ((row.State & includeFilter) != 0) {
+                               DataGridViewRow row = (DataGridViewRow) list [i];
+                               if ((row.State & includeFilter) != 0)
                                        return i;
-                               }
                        }
                        return -1;
                }
@@ -292,10 +338,9 @@ namespace System.Windows.Forms {
                public int GetNextRow (int indexStart, DataGridViewElementStates includeFilter)
                {
                        for (int i = indexStart + 1; i < list.Count; i++) {
-                               DataGridViewRow row = (DataGridViewRow) list[i];
-                               if ((row.State & includeFilter) != 0) {
+                               DataGridViewRow row = (DataGridViewRow) list [i];
+                               if ((row.State & includeFilter) != 0)
                                        return i;
-                               }
                        }
                        return -1;
                }
@@ -303,10 +348,9 @@ namespace System.Windows.Forms {
                public int GetNextRow (int indexStart, DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter)
                {
                        for (int i = indexStart + 1; i < list.Count; i++) {
-                               DataGridViewRow row = (DataGridViewRow) list[i];
-                               if (((row.State & includeFilter) != 0) && ((row.State & excludeFilter) == 0)) {
+                               DataGridViewRow row = (DataGridViewRow) list [i];
+                               if (((row.State & includeFilter) != 0) && ((row.State & excludeFilter) == 0))
                                        return i;
-                               }
                        }
                        return -1;
                }
@@ -314,10 +358,9 @@ namespace System.Windows.Forms {
                public int GetPreviousRow (int indexStart, DataGridViewElementStates includeFilter)
                {
                        for (int i = indexStart - 1; i >= 0; i--) {
-                               DataGridViewRow row = (DataGridViewRow) list[i];
-                               if ((row.State & includeFilter) != 0) {
+                               DataGridViewRow row = (DataGridViewRow) list [i];
+                               if ((row.State & includeFilter) != 0)
                                        return i;
-                               }
                        }
                        return -1;
                }
@@ -325,10 +368,9 @@ namespace System.Windows.Forms {
                public int GetPreviousRow (int indexStart, DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter)
                {
                        for (int i = indexStart - 1; i >= 0; i--) {
-                               DataGridViewRow row = (DataGridViewRow) list[i];
-                               if (((row.State & includeFilter) != 0) && ((row.State & excludeFilter) == 0)) {
+                               DataGridViewRow row = (DataGridViewRow) list [i];
+                               if (((row.State & includeFilter) != 0) && ((row.State & excludeFilter) == 0))
                                        return i;
-                               }
                        }
                        return -1;
                }
@@ -336,132 +378,148 @@ namespace System.Windows.Forms {
                public int GetRowCount (DataGridViewElementStates includeFilter)
                {
                        int result = 0;
-                       foreach (DataGridViewRow row in list) {
-                               if ((row.State & includeFilter) != 0) {
+                       foreach (DataGridViewRow row in list)
+                               if ((row.State & includeFilter) != 0)
                                        result ++;
-                               }
-                       }
                        return result;
                }
 
                public int GetRowsHeight (DataGridViewElementStates includeFilter)
                {
                        int result = 0;
-                       foreach (DataGridViewRow row in list) {
-                               if ((row.State & includeFilter) != 0) {
+                       foreach (DataGridViewRow row in list)
+                               if ((row.State & includeFilter) != 0)
                                        result += row.Height;
-                               }
-                       }
                        return result;
                }
 
                public virtual DataGridViewElementStates GetRowState (int rowIndex)
                {
-                       return (list[rowIndex] as DataGridViewRow).State;
+                       return (list [rowIndex] as DataGridViewRow).State;
                }
 
-               int IList.IndexOf (object o)
+               int IList.IndexOf (object value)
                {
-                       return IndexOf(o as DataGridViewRow);
+                       return IndexOf (value as DataGridViewRow);
                }
 
                public int IndexOf (DataGridViewRow dataGridViewRow)
                {
-                       return list.IndexOf(dataGridViewRow);
+                       return list.IndexOf (dataGridViewRow);
                }
 
-               void IList.Insert (int rowIndex, object o)
+               void IList.Insert (int index, object value)
                {
-                       Insert(rowIndex, o as DataGridViewRow);
+                       Insert (index, value as DataGridViewRow);
                }
 
+               // FIXME: Do *not* allow insertation *after* the editing row!
                public virtual void Insert (int rowIndex, DataGridViewRow dataGridViewRow)
                {
-                       dataGridViewRow.SetIndex(rowIndex);
-                       dataGridViewRow.SetDataGridView(dataGridView);
-                       list[rowIndex] = dataGridViewRow;
-                       OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Add, dataGridViewRow));
-                       if (raiseEvent) {
-                               DataGridView.OnRowsAdded(new DataGridViewRowsAddedEventArgs(rowIndex, 1));
-                       }
+                       dataGridViewRow.SetIndex (rowIndex);
+                       dataGridViewRow.SetDataGridView (dataGridView);
+                       CompleteRowCells (dataGridViewRow);
+                       list.Insert (rowIndex, dataGridViewRow);
+                       ReIndex ();
+                       OnCollectionChanged (new CollectionChangeEventArgs (CollectionChangeAction.Add, dataGridViewRow));
+                       if (raiseEvent)
+                               DataGridView.OnRowsAddedInternal (new DataGridViewRowsAddedEventArgs (rowIndex, 1));
                }
 
                public virtual void Insert (int rowIndex, int count)
                {
                        int index = rowIndex;
                        raiseEvent = false;
-                       for (int i = 0; i < count; i++) {
-                               Insert(index++, dataGridView.RowTemplate.Clone());
-                       }
-                       DataGridView.OnRowsAdded(new DataGridViewRowsAddedEventArgs(rowIndex, count));
+                       for (int i = 0; i < count; i++)
+                               Insert (index++, dataGridView.RowTemplateFull);
+                       DataGridView.OnRowsAddedInternal (new DataGridViewRowsAddedEventArgs (rowIndex, count));
                        raiseEvent = true;
                }
 
                public virtual void Insert (int rowIndex, params object[] values)
                {
-                       if (values == null) {
-                               throw new ArgumentNullException("Values is null.");
-                       }
-                       if (dataGridView.VirtualMode || dataGridView.DataSource != null) {
-                               throw new InvalidOperationException();
-                       }
-                       DataGridViewRow row = new DataGridViewRow();
-                       row.SetValues(values);
-                       Insert(rowIndex, row);
+                       if (values == null)
+                               throw new ArgumentNullException ("Values is null.");
+                       if (dataGridView.VirtualMode || dataGridView.DataSource != null)
+                               throw new InvalidOperationException ();
+                       DataGridViewRow row = dataGridView.RowTemplateFull;
+                       row.SetValues (values);
+                       Insert (rowIndex, row);
                }
 
                public virtual void InsertCopies (int indexSource, int indexDestination, int count)
                {
                        raiseEvent = false;
                        int index = indexDestination;
-                       for (int i = 0; i < count; i++) {
-                               InsertCopy(indexSource, index++);
-                       }
-                       DataGridView.OnRowsAdded(new DataGridViewRowsAddedEventArgs(indexDestination, count));
+                       for (int i = 0; i < count; i++)
+                               InsertCopy (indexSource, index++);
+                       DataGridView.OnRowsAddedInternal (new DataGridViewRowsAddedEventArgs (indexDestination, count));
                        raiseEvent = true;
                }
 
                public virtual void InsertCopy (int indexSource, int indexDestination)
                {
-                       Insert(indexDestination, (list[indexSource] as DataGridViewRow).Clone());
+                       Insert (indexDestination, (list [indexSource] as DataGridViewRow).Clone());
                }
 
-               public virtual void InsertRange (int rowIndex, params DataGridViewRow[] dataGridViewRows)
+               public virtual void InsertRange (int rowIndex, params DataGridViewRow [] dataGridViewRows)
                {
                        raiseEvent = false;
                        int index = rowIndex;
                        int count = 0;
                        foreach (DataGridViewRow row in dataGridViewRows) {
-                               Insert(index++, row);
+                               Insert (index++, row);
                                count++;
                        }
-                       DataGridView.OnRowsAdded(new DataGridViewRowsAddedEventArgs(rowIndex, count));
+                       DataGridView.OnRowsAddedInternal (new DataGridViewRowsAddedEventArgs (rowIndex, count));
                        raiseEvent = true;
                }
 
-               void IList.Remove (object o)
+               void IList.Remove (object value)
                {
-                       Remove(o as DataGridViewRow);
+                       Remove (value as DataGridViewRow);
                }
 
                public virtual void Remove (DataGridViewRow dataGridViewRow)
                {
-                       list.Remove(dataGridViewRow);
-                       OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Remove, dataGridViewRow));
-                       DataGridView.OnRowsRemoved(new DataGridViewRowsRemovedEventArgs(dataGridViewRow.Index, 1));
+                       if (dataGridViewRow.IsNewRow)
+                               throw new InvalidOperationException ("Cannot delete the new row");
+                               
+                       DataGridView.OnRowsPreRemovedInternal (new DataGridViewRowsRemovedEventArgs (dataGridViewRow.Index, 1));
+                       dataGridViewRow.SetDataGridView (null);
+                       list.Remove (dataGridViewRow);
+                       ReIndex ();
+                       OnCollectionChanged (new CollectionChangeEventArgs (CollectionChangeAction.Remove, dataGridViewRow));
+                       DataGridView.OnRowsPostRemovedInternal (new DataGridViewRowsRemovedEventArgs (dataGridViewRow.Index, 1));
                }
 
+               internal virtual void RemoveInternal (DataGridViewRow dataGridViewRow)
+               {
+                       DataGridView.OnRowsPreRemovedInternal (new DataGridViewRowsRemovedEventArgs (dataGridViewRow.Index, 1));
+                       dataGridViewRow.SetDataGridView (null);
+                       list.Remove (dataGridViewRow);
+                       ReIndex ();
+                       OnCollectionChanged (new CollectionChangeEventArgs (CollectionChangeAction.Remove, dataGridViewRow));
+                       DataGridView.OnRowsPostRemovedInternal (new DataGridViewRowsRemovedEventArgs (dataGridViewRow.Index, 1));
+               }
+               
                public virtual void RemoveAt (int index)
                {
-                       DataGridViewRow row = this[index];
-                       list.RemoveAt(index);
-                       OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Remove, row));
-                       DataGridView.OnRowsRemoved(new DataGridViewRowsRemovedEventArgs(index, 1));
+                       DataGridViewRow row = this [index];
+                       
+                       Remove (row);
+               }
+
+               internal void RemoveAtInternal (int index)
+               {
+                       DataGridViewRow row = this [index];
+                       
+                       RemoveInternal (row);
                }
 
                public DataGridViewRow SharedRow (int rowIndex)
                {
-                       return (DataGridViewRow) list[rowIndex];
+                       return (DataGridViewRow) list [rowIndex];
                }
 
                internal int SharedRowIndexOf (DataGridViewRow row)
@@ -479,18 +537,15 @@ namespace System.Windows.Forms {
 
                protected virtual void OnCollectionChanged (CollectionChangeEventArgs e)
                {
-                       if (CollectionChanged != null) {
+                       if (CollectionChanged != null)
                                CollectionChanged (this, e);
-                       }
                }
 
-               /************************/
-
-               internal void InternalAdd (DataGridViewRow dataGridViewRow)
+               internal void AddInternal (DataGridViewRow dataGridViewRow, bool sharable)
                {
-                       dataGridViewRow.SetIndex(list.Count);
-                       dataGridViewRow.SetDataGridView(dataGridView);
-                       list.Add(dataGridViewRow);
+                       raiseEvent = false;
+                       AddCore (dataGridViewRow, sharable);
+                       raiseEvent = true;
                }
 
                internal ArrayList RowIndexSortedArrayList {
@@ -500,29 +555,40 @@ namespace System.Windows.Forms {
                                return result;
                        }
                }
+               
+               internal void ReIndex ()
+               {
+                       for (int i = 0; i < Count; i++)
+                               (list[i] as DataGridViewRow).SetIndex (i);
+               }
+               
+               internal void Sort (IComparer comparer)
+               {
+                       // Note: you will probably want to call
+                       // invalidate after using this.
+                       if (DataGridView != null && DataGridView.EditingRow != null)
+                               list.Sort (0, Count - 1, comparer);
+                       else
+                               list.Sort (comparer);
+                       
+                       for (int i = 0; i < list.Count; i++)
+                               (list[i] as DataGridViewRow).SetIndex (i);
+               }
 
-               private class RowIndexComparator : IComparer {
-
-                       public int Compare (object o1, object o2) {
+               private class RowIndexComparator : IComparer 
+               {
+                       public int Compare (object o1, object o2)
+                       {
                                DataGridViewRow row1 = (DataGridViewRow) o1;
                                DataGridViewRow row2 = (DataGridViewRow) o2;
                                if (row1.Index < row2.Index) {
                                        return -1;
-                               }
-                               else if (row1.Index > row2.Index) {
+                               } else if (row1.Index > row2.Index) {
                                        return 1;
-                               }
-                               else {
+                               } else {
                                        return 0;
                                }
                        }
-
                }
-
-               /************************/
-
        }
-
 }
-
-#endif