1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
23 // Pedro MartÃnez Juliá <pedromj@gmail.com>
29 using System.ComponentModel;
30 using System.Collections;
31 using System.ComponentModel.Design.Serialization;
33 namespace System.Windows.Forms {
35 [DesignerSerializerAttribute ("System.Windows.Forms.Design.DataGridViewRowCollectionCodeDomSerializer, " + Consts.AssemblySystem_Design,
36 "System.ComponentModel.Design.Serialization.CodeDomSerializer, " + Consts.AssemblySystem_Design)]
37 [ListBindable (false)]
38 public class DataGridViewRowCollection : IList, ICollection, IEnumerable {
40 private ArrayList list;
41 private DataGridView dataGridView;
43 private bool raiseEvent = true;
45 public DataGridViewRowCollection (DataGridView dataGridView)
47 if (dataGridView == null) {
48 throw new ArgumentException("DataGridView is null.");
50 this.dataGridView = dataGridView;
51 list = new ArrayList();
55 get { return list.Count; }
58 bool IList.IsFixedSize {
59 get { return list.IsFixedSize; }
62 bool IList.IsReadOnly {
63 get { return list.IsReadOnly; }
66 bool ICollection.IsSynchronized {
67 get { return list.IsSynchronized; }
70 object IList.this [int index] {
74 set { list[index] = value as DataGridViewRow; }
77 public DataGridViewRow this [int index] {
79 // 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.
80 return (DataGridViewRow) list[index];
84 object ICollection.SyncRoot {
85 get { return list.SyncRoot; }
88 public event CollectionChangeEventHandler CollectionChanged;
90 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
91 public virtual int Add ()
93 return Add(dataGridView.RowTemplate.Clone() as DataGridViewRow);
96 int IList.Add(object o)
98 return Add(o as DataGridViewRow);
101 public virtual int Add (DataGridViewRow dataGridViewRow)
103 if (dataGridView.DataSource != null) {
104 throw new InvalidOperationException("DataSource of DataGridView is not null.");
106 if (dataGridView.Columns.Count == 0) {
107 throw new InvalidOperationException("DataGridView has no columns.");
109 dataGridViewRow.SetIndex(list.Count);
110 dataGridViewRow.SetDataGridView(dataGridView);
111 int result = list.Add(dataGridViewRow);
112 OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Add, dataGridViewRow));
114 DataGridView.OnRowsAdded(new DataGridViewRowsAddedEventArgs(result, 1));
119 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
120 public virtual int Add (int count)
123 throw new ArgumentOutOfRangeException("Count is less than or equeal to 0.");
125 if (dataGridView.DataSource != null) {
126 throw new InvalidOperationException("DataSource of DataGridView is not null.");
128 if (dataGridView.Columns.Count == 0) {
129 throw new InvalidOperationException("DataGridView has no columns.");
133 for (int i = 0; i < count; i++) {
134 result = Add(dataGridView.RowTemplate.Clone() as DataGridViewRow);
136 DataGridView.OnRowsAdded(new DataGridViewRowsAddedEventArgs(result - count + 1, count));
141 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
142 public virtual int Add (params object[] values)
144 if (values == null) {
145 throw new ArgumentNullException("values is null.");
147 if (dataGridView.VirtualMode) {
148 throw new InvalidOperationException("DataGridView is in virtual mode.");
150 DataGridViewRow row = new DataGridViewRow();
151 int result = Add(row);
152 row.SetValues(values);
156 public virtual int AddCopies (int indexSource, int count)
160 for (int i = 0; i < count; i++) {
161 lastIndex = AddCopy(indexSource);
163 DataGridView.OnRowsAdded(new DataGridViewRowsAddedEventArgs(lastIndex - count + 1, count));
168 public virtual int AddCopy (int indexSource)
170 return Add((list[indexSource] as DataGridViewRow).Clone() as DataGridViewRow);
173 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
174 public virtual void AddRange (params DataGridViewRow[] dataGridViewRows)
179 foreach (DataGridViewRow row in dataGridViewRows) {
180 lastIndex = Add(row);
183 DataGridView.OnRowsAdded(new DataGridViewRowsAddedEventArgs(lastIndex - count + 1, count));
187 public virtual void Clear ()
192 bool IList.Contains (object o)
194 return Contains(o as DataGridViewRow);
197 public virtual bool Contains (DataGridViewRow dataGridViewRow)
199 return list.Contains(dataGridViewRow);
202 void ICollection.CopyTo (Array array, int index)
204 list.CopyTo(array, index);
207 public void CopyTo (DataGridViewRow[] array, int index)
209 list.CopyTo(array, index);
212 IEnumerator IEnumerable.GetEnumerator ()
214 return list.GetEnumerator();
217 public int GetFirstRow (DataGridViewElementStates includeFilter)
219 for (int i = 0; i < list.Count; i++) {
220 DataGridViewRow row = (DataGridViewRow) list[i];
221 if ((row.State & includeFilter) != 0) {
228 public int GetFirstRow (DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter)
230 for (int i = 0; i < list.Count; i++) {
231 DataGridViewRow row = (DataGridViewRow) list[i];
232 if (((row.State & includeFilter) != 0) && ((row.State & excludeFilter) == 0)) {
239 public int GetLastRow (DataGridViewElementStates includeFilter)
241 for (int i = list.Count - 1; i >= 0; i--) {
242 DataGridViewRow row = (DataGridViewRow) list[i];
243 if ((row.State & includeFilter) != 0) {
250 public int GetNextRow (int indexStart, DataGridViewElementStates includeFilter)
252 for (int i = indexStart + 1; i < list.Count; i++) {
253 DataGridViewRow row = (DataGridViewRow) list[i];
254 if ((row.State & includeFilter) != 0) {
261 public int GetNextRow (int indexStart, DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter)
263 for (int i = indexStart + 1; i < list.Count; i++) {
264 DataGridViewRow row = (DataGridViewRow) list[i];
265 if (((row.State & includeFilter) != 0) && ((row.State & excludeFilter) == 0)) {
272 public int GetPreviousRow (int indexStart, DataGridViewElementStates includeFilter)
274 for (int i = indexStart - 1; i >= 0; i--) {
275 DataGridViewRow row = (DataGridViewRow) list[i];
276 if ((row.State & includeFilter) != 0) {
283 public int GetPreviousRow (int indexStart, DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter)
285 for (int i = indexStart - 1; i >= 0; i--) {
286 DataGridViewRow row = (DataGridViewRow) list[i];
287 if (((row.State & includeFilter) != 0) && ((row.State & excludeFilter) == 0)) {
294 public int GetRowCount (DataGridViewElementStates includeFilter)
297 foreach (DataGridViewRow row in list) {
298 if ((row.State & includeFilter) != 0) {
305 public int GetRowsHeight (DataGridViewElementStates includeFilter)
308 foreach (DataGridViewRow row in list) {
309 if ((row.State & includeFilter) != 0) {
310 result += row.Height;
316 public virtual DataGridViewElementStates GetRowState (int rowIndex)
318 return (list[rowIndex] as DataGridViewRow).State;
321 int IList.IndexOf (object o)
323 return IndexOf(o as DataGridViewRow);
326 public int IndexOf (DataGridViewRow dataGridViewRow)
328 return list.IndexOf(dataGridViewRow);
331 void IList.Insert (int rowIndex, object o)
333 Insert(rowIndex, o as DataGridViewRow);
336 public virtual void Insert (int rowIndex, DataGridViewRow dataGridViewRow)
338 dataGridViewRow.SetIndex(rowIndex);
339 dataGridViewRow.SetDataGridView(dataGridView);
340 list[rowIndex] = dataGridViewRow;
341 OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Add, dataGridViewRow));
343 DataGridView.OnRowsAdded(new DataGridViewRowsAddedEventArgs(rowIndex, 1));
347 public virtual void Insert (int rowIndex, int count)
349 int index = rowIndex;
351 for (int i = 0; i < count; i++) {
352 Insert(index++, dataGridView.RowTemplate.Clone());
354 DataGridView.OnRowsAdded(new DataGridViewRowsAddedEventArgs(rowIndex, count));
358 public virtual void Insert (int rowIndex, params object[] values)
360 if (values == null) {
361 throw new ArgumentNullException("Values is null.");
363 if (dataGridView.VirtualMode || dataGridView.DataSource != null) {
364 throw new InvalidOperationException();
366 DataGridViewRow row = new DataGridViewRow();
367 row.SetValues(values);
368 Insert(rowIndex, row);
371 public virtual void InsertCopies (int indexSource, int indexDestination, int count)
374 int index = indexDestination;
375 for (int i = 0; i < count; i++) {
376 InsertCopy(indexSource, index++);
378 DataGridView.OnRowsAdded(new DataGridViewRowsAddedEventArgs(indexDestination, count));
382 public virtual void InsertCopy (int indexSource, int indexDestination)
384 Insert(indexDestination, (list[indexSource] as DataGridViewRow).Clone());
387 public virtual void InsertRange (int rowIndex, params DataGridViewRow[] dataGridViewRows)
390 int index = rowIndex;
392 foreach (DataGridViewRow row in dataGridViewRows) {
393 Insert(index++, row);
396 DataGridView.OnRowsAdded(new DataGridViewRowsAddedEventArgs(rowIndex, count));
400 void IList.Remove (object o)
402 Remove(o as DataGridViewRow);
405 public virtual void Remove (DataGridViewRow dataGridViewRow)
407 list.Remove(dataGridViewRow);
408 OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Remove, dataGridViewRow));
409 DataGridView.OnRowsRemoved(new DataGridViewRowsRemovedEventArgs(dataGridViewRow.Index, 1));
412 public virtual void RemoveAt (int index)
414 DataGridViewRow row = this[index];
415 list.RemoveAt(index);
416 OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Remove, row));
417 DataGridView.OnRowsRemoved(new DataGridViewRowsRemovedEventArgs(index, 1));
420 public DataGridViewRow SharedRow (int rowIndex)
422 return (DataGridViewRow) list[rowIndex];
425 protected DataGridView DataGridView {
426 get { return dataGridView; }
429 protected ArrayList List {
433 protected virtual void OnCollectionChanged (CollectionChangeEventArgs e)
435 if (CollectionChanged != null) {
436 CollectionChanged (this, e);
440 /************************/
442 internal void InternalAdd (DataGridViewRow dataGridViewRow)
444 dataGridViewRow.SetIndex(list.Count);
445 dataGridViewRow.SetDataGridView(dataGridView);
446 list.Add(dataGridViewRow);
449 internal ArrayList RowIndexSortedArrayList {
451 ArrayList result = (ArrayList) list.Clone();
452 result.Sort(new RowIndexComparator());
457 private class RowIndexComparator : IComparer {
459 public int Compare (object o1, object o2) {
460 DataGridViewRow row1 = (DataGridViewRow) o1;
461 DataGridViewRow row2 = (DataGridViewRow) o2;
462 if (row1.Index < row2.Index) {
465 else if (row1.Index > row2.Index) {
475 /************************/