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>
27 using System.ComponentModel;
28 using System.Collections;
29 using System.Collections.Generic;
31 namespace System.Windows.Forms
33 [ListBindable (false)]
34 public class DataGridViewColumnCollection : BaseCollection, IList, ICollection, IEnumerable
36 private DataGridView dataGridView;
37 private List<DataGridViewColumn> display_index_sorted;
39 public DataGridViewColumnCollection (DataGridView dataGridView)
41 this.dataGridView = dataGridView;
42 RegenerateSortedList ();
45 bool IList.IsFixedSize {
46 get { return base.List.IsFixedSize; }
49 object IList.this [int index] {
50 get { return this [index]; }
51 set { throw new NotSupportedException(); }
54 public DataGridViewColumn this [int index] {
55 get { return (DataGridViewColumn) base.List[index]; }
58 public DataGridViewColumn this [string columnName] {
60 foreach (DataGridViewColumn col in base.List) {
61 if (col.Name == columnName) {
69 public event CollectionChangeEventHandler CollectionChanged;
71 int IList.Add (object value)
73 return Add(value as DataGridViewColumn);
76 public virtual int Add (DataGridViewColumn dataGridViewColumn)
78 int result = base.List.Add(dataGridViewColumn);
79 if (dataGridViewColumn.DisplayIndex == -1)
80 dataGridViewColumn.DisplayIndexInternal = result;
81 dataGridViewColumn.SetIndex(result);
82 dataGridViewColumn.SetDataGridView(dataGridView);
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 ()
106 // When we clear the column collection, all rows get deleted
107 dataGridView.Rows.Clear ();
108 dataGridView.RemoveEditingRow ();
110 RegenerateSortedList ();
112 OnCollectionChanged (new CollectionChangeEventArgs (CollectionChangeAction.Refresh, null));
115 bool IList.Contains (object value)
117 return Contains (value as DataGridViewColumn);
120 public virtual bool Contains (DataGridViewColumn dataGridViewColumn)
122 return base.List.Contains (dataGridViewColumn);
125 public virtual bool Contains (string columnName)
127 foreach (DataGridViewColumn col in base.List)
128 if (col.Name == columnName)
133 public void CopyTo (DataGridViewColumn [] array, int index)
135 base.List.CopyTo (array, index);
138 public int GetColumnCount (DataGridViewElementStates includeFilter)
143 public int GetColumnsWidth (DataGridViewElementStates includeFilter)
148 public DataGridViewColumn GetFirstColumn (DataGridViewElementStates includeFilter)
153 public DataGridViewColumn GetFirstColumn (DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter)
158 public DataGridViewColumn GetLastColumn (DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter)
163 public DataGridViewColumn GetNextColumn (DataGridViewColumn dataGridViewColumnStart, DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter)
168 public DataGridViewColumn GetPreviousColumn (DataGridViewColumn dataGridViewColumnStart, DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter)
173 int IList.IndexOf (object value)
175 return IndexOf (value as DataGridViewColumn);
178 public int IndexOf (DataGridViewColumn dataGridViewColumn)
180 return base.List.IndexOf (dataGridViewColumn);
183 void IList.Insert (int index, object value)
185 Insert (index, value as DataGridViewColumn);
188 public virtual void Insert (int columnIndex, DataGridViewColumn dataGridViewColumn)
190 base.List.Insert (columnIndex, dataGridViewColumn);
191 if (dataGridViewColumn.DisplayIndex == -1)
192 dataGridViewColumn.DisplayIndexInternal = columnIndex;
193 dataGridViewColumn.SetIndex (columnIndex);
194 dataGridViewColumn.SetDataGridView (dataGridView);
195 OnCollectionChanged (new CollectionChangeEventArgs (CollectionChangeAction.Add, dataGridViewColumn));
198 void IList.Remove (object value)
200 Remove (value as DataGridViewColumn);
203 public virtual void Remove (DataGridViewColumn dataGridViewColumn)
205 DataGridView.OnColumnPreRemovedInternal (new DataGridViewColumnEventArgs (dataGridViewColumn));
206 base.List.Remove (dataGridViewColumn);
207 OnCollectionChanged (new CollectionChangeEventArgs (CollectionChangeAction.Remove, dataGridViewColumn));
210 public virtual void Remove (string columnName) {
211 foreach (DataGridViewColumn col in base.List) {
212 if (col.Name == columnName) {
219 public virtual void RemoveAt (int index)
221 DataGridViewColumn col = this [index];
225 protected DataGridView DataGridView {
226 get { return dataGridView; }
229 protected virtual void OnCollectionChanged (CollectionChangeEventArgs e)
231 RegenerateIndexes ();
232 RegenerateSortedList ();
234 if (CollectionChanged != null)
235 CollectionChanged(this, e);
238 protected override ArrayList List {
239 get { return base.List; }
242 internal List<DataGridViewColumn> ColumnDisplayIndexSortedArrayList {
243 get { return display_index_sorted; }
246 private void RegenerateIndexes ()
248 for (int i = 0; i < Count; i++)
249 this[i].SetIndex (i);
252 internal void RegenerateSortedList ()
254 DataGridViewColumn[] array = (DataGridViewColumn[])base.List.ToArray (typeof (DataGridViewColumn));
255 List<DataGridViewColumn> result = new List<DataGridViewColumn> (array);
257 result.Sort (new ColumnDisplayIndexComparator ());
258 for (int i = 0; i < result.Count; i++)
259 result[i].DisplayIndexInternal = i;
261 display_index_sorted = result;
264 internal void ClearAutoGeneratedColumns ()
266 for (int i = list.Count - 1; i >= 0; i--)
267 if ((list[i] as DataGridViewColumn).AutoGenerated)
271 private class ColumnDisplayIndexComparator : IComparer<DataGridViewColumn>
273 public int Compare (DataGridViewColumn o1, DataGridViewColumn o2)
275 return o1.DisplayIndex.CompareTo (o2.DisplayIndex);