diff options
Diffstat (limited to 'mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewRowCollection.cs')
-rw-r--r-- | mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewRowCollection.cs | 434 |
1 files changed, 434 insertions, 0 deletions
diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewRowCollection.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewRowCollection.cs new file mode 100644 index 00000000000..72d361bc8d1 --- /dev/null +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewRowCollection.cs @@ -0,0 +1,434 @@ +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +// Copyright (c) 2005 Novell, Inc. (http://www.novell.com) +// +// Author: +// Pedro MartÃnez Juliá <pedromj@gmail.com> +// + + +#if NET_2_0 + +using System.ComponentModel; +using System.Collections; + +namespace System.Windows.Forms { + + public class DataGridViewRowCollection : IList, ICollection, IEnumerable { + + private ArrayList list; + private DataGridView dataGridView; + + private bool raiseEvent = true; + + public DataGridViewRowCollection (DataGridView dataGridView) { + if (dataGridView == null) { + throw new ArgumentException("DataGridView is null."); + } + this.dataGridView = dataGridView; + list = new ArrayList(); + } + + public int Count { + get { return list.Count; } + } + + public bool IsFixedSize { + get { return list.IsFixedSize; } + } + + public bool IsReadOnly { + get { return list.IsReadOnly; } + } + + public bool IsSynchronized { + get { return list.IsSynchronized; } + } + + object IList.this [int index] { + get { + Console.WriteLine("acceso"); + return this[index]; + } + set { list[index] = value as DataGridViewRow; } + } + + public DataGridViewRow this [int index] { + get { + // Accessing a System.Windows.Forms.DataGridViewRow with this indexer causes the row to become unshared. To keep the row shared, use the System.Windows.Forms.DataGridViewRowCollection.SharedRow method. For more information, see Best Practices for Scaling the Windows Forms DataGridView Control. + return (DataGridViewRow) list[index]; + } + } + + public object SyncRoot { + get { return list.SyncRoot; } + } + + public event CollectionChangeEventHandler CollectionChange; + + public virtual int Add () { + return Add(dataGridView.RowTemplate.Clone() as DataGridViewRow); + } + + int IList.Add(object o) { + return Add(o as DataGridViewRow); + } + + public virtual int Add (DataGridViewRow dataGridViewRow) { + if (dataGridView.DataSource != null) { + throw new InvalidOperationException("DataSource of DataGridView is not null."); + } + if (dataGridView.Columns.Count == 0) { + throw new InvalidOperationException("DataGridView has no columns."); + } + dataGridViewRow.SetIndex(list.Count); + dataGridViewRow.SetDataGridView(dataGridView); + int result = list.Add(dataGridViewRow); + OnCollectionChange(new CollectionChangeEventArgs(CollectionChangeAction.Add, dataGridViewRow)); + if (raiseEvent) { + DataGridView.OnRowsAdded(new DataGridViewRowsAddedEventArgs(result, 1)); + } + return result; + } + + public virtual int Add (int count) { + if (count <= 0) { + throw new ArgumentOutOfRangeException("Count is less than or equeal to 0."); + } + if (dataGridView.DataSource != null) { + throw new InvalidOperationException("DataSource of DataGridView is not null."); + } + 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)); + raiseEvent = true; + return result; + } + + public virtual int Add (params object[] values) { + if (values == null) { + throw new ArgumentNullException("values is null."); + } + if (dataGridView.VirtualMode) { + throw new InvalidOperationException("DataGridView is in virtual mode."); + } + DataGridViewRow row = new DataGridViewRow(); + int result = Add(row); + row.SetValues(values); + return result; + } + + public virtual int AddCopies (int indexSource, int count) { + raiseEvent = false; + int lastIndex = 0; + for (int i = 0; i < count; i++) { + lastIndex = AddCopy(indexSource); + } + DataGridView.OnRowsAdded(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); + } + + public virtual void AddRange (params DataGridViewRow[] dataGridViewRows) { + raiseEvent = false; + int count = 0; + int lastIndex = -1; + foreach (DataGridViewRow row in dataGridViewRows) { + lastIndex = Add(row); + count++; + } + DataGridView.OnRowsAdded(new DataGridViewRowsAddedEventArgs(lastIndex - count + 1, count)); + raiseEvent = true; + } + + public virtual void Clear () { + list.Clear(); + } + + bool IList.Contains (object o) { + return Contains(o as DataGridViewRow); + } + + public virtual bool Contains (DataGridViewRow dataGridViewRow) { + return list.Contains(dataGridViewRow); + } + + public void CopyTo (Array array, int index) { + list.CopyTo(array, index); + } + + public void CopyTo (DataGridViewRow[] array, int index) { + list.CopyTo(array, index); + } + + public IEnumerator 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) { + 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)) { + 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) { + 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) { + 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)) { + 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) { + 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)) { + return i; + } + } + return -1; + } + + public int GetRowCount (DataGridViewElementStates includeFilter) { + int result = 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) { + result += row.Height; + } + } + return result; + } + + public virtual DataGridViewElementStates GetRowState (int rowIndex) { + return (list[rowIndex] as DataGridViewRow).State; + } + + int IList.IndexOf (object o) { + return IndexOf(o as DataGridViewRow); + } + + public int IndexOf (DataGridViewRow dataGridViewRow) { + return list.IndexOf(dataGridViewRow); + } + + void IList.Insert (int rowIndex, object o) { + Insert(rowIndex, o as DataGridViewRow); + } + + public virtual void Insert (int rowIndex, DataGridViewRow dataGridViewRow) { + dataGridViewRow.SetIndex(rowIndex); + dataGridViewRow.SetDataGridView(dataGridView); + list[rowIndex] = dataGridViewRow; + OnCollectionChange(new CollectionChangeEventArgs(CollectionChangeAction.Add, dataGridViewRow)); + if (raiseEvent) { + DataGridView.OnRowsAdded(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)); + 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); + } + + 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)); + raiseEvent = true; + } + + public virtual void InsertCopy (int indexSource, int indexDestination) { + Insert(indexDestination, (list[indexSource] as DataGridViewRow).Clone()); + } + + 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); + count++; + } + DataGridView.OnRowsAdded(new DataGridViewRowsAddedEventArgs(rowIndex, count)); + raiseEvent = true; + } + + void IList.Remove (object o) { + Remove(o as DataGridViewRow); + } + + public virtual void Remove (DataGridViewRow dataGridViewRow) { + list.Remove(dataGridViewRow); + OnCollectionChange(new CollectionChangeEventArgs(CollectionChangeAction.Remove, dataGridViewRow)); + DataGridView.OnRowsRemoved(new DataGridViewRowsRemovedEventArgs(dataGridViewRow.Index, 1)); + } + + public virtual void RemoveAt (int index) { + DataGridViewRow row = this[index]; + list.RemoveAt(index); + OnCollectionChange(new CollectionChangeEventArgs(CollectionChangeAction.Remove, row)); + DataGridView.OnRowsRemoved(new DataGridViewRowsRemovedEventArgs(index, 1)); + } + + public DataGridViewRow SharedRow (int rowIndex) { + return (DataGridViewRow) list[rowIndex]; + } + + protected DataGridView DataGridView { + get { return dataGridView; } + } + + protected ArrayList List { + get { return list; } + } + + protected virtual void OnCollectionChange (CollectionChangeEventArgs e) { + if (CollectionChange != null) { + CollectionChange(this, e); + } + } + + /************************/ + + internal void InternalAdd (DataGridViewRow dataGridViewRow) { + dataGridViewRow.SetIndex(list.Count); + dataGridViewRow.SetDataGridView(dataGridView); + list.Add(dataGridViewRow); + } + + internal ArrayList RowIndexSortedArrayList { + get { + ArrayList result = (ArrayList) list.Clone(); + result.Sort(new RowIndexComparator()); + return result; + } + } + + 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) { + return 1; + } + else { + return 0; + } + } + + } + + /************************/ + + } + +} + +#endif |