//
-#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)
get { return list.Count; }
}
- int ICollection.Count
- {
+ int ICollection.Count {
get { return Count; }
}
[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;
}
[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;
}
{
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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)
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 {
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