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.Collections.Generic;
33 namespace System.Windows.Forms
35 [ListBindable (false)]
36 public class DataGridViewColumnCollection : BaseCollection, IList, ICollection, IEnumerable
38 private DataGridView dataGridView;
39 private List<DataGridViewColumn> display_index_sorted;
41 public DataGridViewColumnCollection (DataGridView dataGridView)
43 this.dataGridView = dataGridView;
44 RegenerateSortedList ();
47 bool IList.IsFixedSize {
48 get { return base.List.IsFixedSize; }
51 object IList.this [int index] {
52 get { return this [index]; }
53 set { throw new NotSupportedException(); }
56 public DataGridViewColumn this [int index] {
57 get { return (DataGridViewColumn) base.List[index]; }
60 public DataGridViewColumn this [string columnName] {
62 foreach (DataGridViewColumn col in base.List) {
63 if (col.Name == columnName) {
71 public event CollectionChangeEventHandler CollectionChanged;
73 int IList.Add (object value)
75 return Add(value as DataGridViewColumn);
78 public virtual int Add (DataGridViewColumn dataGridViewColumn)
80 dataGridViewColumn.SetIndex(base.List.Count);
81 dataGridViewColumn.SetDataGridView(dataGridView);
82 int result = base.List.Add(dataGridViewColumn);
83 OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Add, dataGridViewColumn));
87 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
88 public virtual int Add (string columnName, string headerText)
90 DataGridViewColumn col = new DataGridViewTextBoxColumn ();
91 col.Name = columnName;
92 col.HeaderText = headerText;
96 public virtual void AddRange (params DataGridViewColumn[] dataGridViewColumns)
98 foreach (DataGridViewColumn col in dataGridViewColumns)
102 public virtual void Clear ()
105 RegenerateSortedList ();
108 bool IList.Contains (object value)
110 return Contains (value as DataGridViewColumn);
113 public virtual bool Contains (DataGridViewColumn dataGridViewColumn)
115 return base.List.Contains (dataGridViewColumn);
118 public virtual bool Contains (string columnName)
120 foreach (DataGridViewColumn col in base.List)
121 if (col.Name == columnName)
126 public void CopyTo (DataGridViewColumn [] array, int index)
128 base.List.CopyTo (array, index);
131 public int GetColumnCount (DataGridViewElementStates includeFilter)
136 public int GetColumnsWidth (DataGridViewElementStates includeFilter)
141 public DataGridViewColumn GetFirstColumn (DataGridViewElementStates includeFilter)
146 public DataGridViewColumn GetFirstColumn (DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter)
151 public DataGridViewColumn GetLastColumn (DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter)
156 public DataGridViewColumn GetNextColumn (DataGridViewColumn dataGridViewColumnStart, DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter)
161 public DataGridViewColumn GetPreviousColumn (DataGridViewColumn dataGridViewColumnStart, DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter)
166 int IList.IndexOf (object value)
168 return IndexOf (value as DataGridViewColumn);
171 public int IndexOf (DataGridViewColumn dataGridViewColumn)
173 return base.List.IndexOf (dataGridViewColumn);
176 void IList.Insert (int index, object value)
178 Insert (index, value as DataGridViewColumn);
181 public virtual void Insert (int columnIndex, DataGridViewColumn dataGridViewColumn)
183 dataGridViewColumn.SetIndex (columnIndex);
184 dataGridViewColumn.SetDataGridView (dataGridView);
185 base.List.Insert (columnIndex, dataGridViewColumn);
186 OnCollectionChanged (new CollectionChangeEventArgs (CollectionChangeAction.Add, dataGridViewColumn));
189 void IList.Remove (object value)
191 Remove (value as DataGridViewColumn);
194 public virtual void Remove (DataGridViewColumn dataGridViewColumn)
196 base.List.Remove (dataGridViewColumn);
197 OnCollectionChanged (new CollectionChangeEventArgs (CollectionChangeAction.Remove, dataGridViewColumn));
200 public virtual void Remove (string columnName) {
201 foreach (DataGridViewColumn col in base.List) {
202 if (col.Name == columnName) {
209 public virtual void RemoveAt (int index)
211 DataGridViewColumn col = this [index];
215 protected DataGridView DataGridView {
216 get { return dataGridView; }
219 protected virtual void OnCollectionChanged (CollectionChangeEventArgs e)
221 RegenerateSortedList ();
223 if (CollectionChanged != null)
224 CollectionChanged(this, e);
227 protected override ArrayList List {
228 get { return base.List; }
231 internal List<DataGridViewColumn> ColumnDisplayIndexSortedArrayList {
232 get { return display_index_sorted; }
235 internal void RegenerateSortedList ()
237 DataGridViewColumn[] array = (DataGridViewColumn[])base.List.ToArray (typeof (DataGridViewColumn));
238 List<DataGridViewColumn> result = new List<DataGridViewColumn> (array);
240 result.Sort (new ColumnDisplayIndexComparator ());
242 for (int i = 0; i < result.Count; i++)
243 result[i].DisplayIndex = i;
245 display_index_sorted = result;
248 internal void ClearAutoGeneratedColumns ()
250 for (int i = list.Count - 1; i >= 0; i--)
251 if ((list[i] as DataGridViewColumn).AutoGenerated)
255 private class ColumnDisplayIndexComparator : IComparer<DataGridViewColumn>
257 public int Compare (DataGridViewColumn o1, DataGridViewColumn o2)
259 return o1.DisplayIndex - o2.DisplayIndex;