Merge pull request #331 from viniciusjarina/uri_lite2
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / DataGridView.cs
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:
8 // 
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 // 
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.
19 //
20 // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
21 //
22 // Author:
23 //      Pedro Martínez Juliá <pedromj@gmail.com>
24 //      Ivan N. Zlatev <contact@i-nz.net>
25 //
26
27 using System;
28 using System.ComponentModel;
29 using System.Runtime.InteropServices;
30 using System.Drawing;
31 using System.Reflection;
32 using System.Collections;
33 using System.Text;
34 using System.Collections.Generic;
35
36 namespace System.Windows.Forms {
37
38         [ComVisibleAttribute(true)]
39         [ClassInterfaceAttribute(ClassInterfaceType.AutoDispatch)]
40         [Designer("System.Windows.Forms.Design.DataGridViewDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
41         [Editor("System.Windows.Forms.Design.DataGridViewComponentEditor, " + Consts.AssemblySystem_Design, typeof (System.ComponentModel.ComponentEditor))]
42         [ComplexBindingProperties ("DataSource", "DataMember")]
43         [DefaultEvent ("CellContentClick")]
44         [Docking (DockingBehavior.Ask)]
45         public class DataGridView : Control, ISupportInitialize, IBindableComponent, IDropTarget
46         {
47
48                 private DataGridViewAdvancedBorderStyle adjustedTopLeftHeaderBorderStyle;
49                 private DataGridViewAdvancedBorderStyle advancedCellBorderStyle;
50                 private DataGridViewAdvancedBorderStyle advancedColumnHeadersBorderStyle;
51                 private DataGridViewAdvancedBorderStyle advancedRowHeadersBorderStyle;
52                 private bool allowUserToAddRows;
53                 private bool allowUserToDeleteRows;
54                 private bool allowUserToOrderColumns;
55                 private bool allowUserToResizeColumns;
56                 private bool allowUserToResizeRows;
57                 private DataGridViewCellStyle alternatingRowsDefaultCellStyle;
58                 private Point anchor_cell;
59                 private bool autoGenerateColumns;
60                 private bool autoSize;
61                 private DataGridViewAutoSizeColumnsMode autoSizeColumnsMode;
62                 private DataGridViewAutoSizeRowsMode autoSizeRowsMode;
63                 private Color backColor;
64                 private Color backgroundColor;
65                 private Image backgroundImage;
66                 private BorderStyle borderStyle;
67                 private DataGridViewCellBorderStyle cellBorderStyle;
68                 private DataGridViewClipboardCopyMode clipboardCopyMode;
69                 private DataGridViewHeaderBorderStyle columnHeadersBorderStyle;
70                 private DataGridViewCellStyle columnHeadersDefaultCellStyle;
71                 private int columnHeadersHeight;
72                 private DataGridViewColumnHeadersHeightSizeMode columnHeadersHeightSizeMode;
73                 private bool columnHeadersVisible;
74                 private DataGridViewColumnCollection columns;
75                 private DataGridViewCell currentCell;
76                 private Point currentCellAddress;
77                 //private DataGridViewRow currentRow;
78                 private string dataMember;
79                 private object dataSource;
80                 private DataGridViewCellStyle defaultCellStyle;
81                 //private Control editingControl;
82                 private DataGridViewEditMode editMode;
83                 private bool enableHeadersVisualStyles = true;
84                 private DataGridViewCell firstDisplayedCell;
85                 private int firstDisplayedScrollingColumnHiddenWidth;
86                 private int firstDisplayedScrollingColumnIndex;
87                 private int firstDisplayedScrollingRowIndex;
88                 private Color gridColor = Color.FromKnownColor(KnownColor.ControlDark);
89                 private int horizontalScrollingOffset;
90                 private DataGridViewCell hover_cell = null;
91                 private bool isCurrentCellDirty;
92                 //private bool isCurrentRowDirty;
93                 private bool multiSelect;
94                 private bool readOnly;
95                 private DataGridViewHeaderBorderStyle rowHeadersBorderStyle;
96                 private DataGridViewCellStyle rowHeadersDefaultCellStyle;
97                 private bool rowHeadersVisible;
98                 private int rowHeadersWidth;
99                 private DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode;
100                 private DataGridViewRowCollection rows;
101                 private DataGridViewCellStyle rowsDefaultCellStyle;
102                 private DataGridViewRow rowTemplate;
103                 private ScrollBars scrollBars;
104                 private DataGridViewSelectionMode selectionMode;
105                 private bool showCellErrors;
106                 private bool showCellToolTips;
107                 private bool showEditingIcon;
108                 private bool showRowErrors;
109                 private DataGridViewColumn sortedColumn = null;
110                 private SortOrder sortOrder;
111                 private bool standardTab;
112                 private DataGridViewHeaderCell topLeftHeaderCell;
113                 private Cursor userSetCursor;
114                 private int verticalScrollingOffset;
115                 private bool virtualMode;
116                 private HScrollBar horizontalScrollBar;
117                 private VScrollBar verticalScrollBar;
118                 private Control editingControl;
119                 private bool is_autogenerating_columns = false;
120                 private bool is_binding = false;
121                 private bool new_row_editing = false;
122                 
123                 // These are used to implement selection behaviour with SHIFT pressed.
124                 private int selected_row = -1;
125                 private int selected_column = -1;
126                 
127                 // Stuff for error Tooltips
128                 private Timer tooltip_timer;
129                 private ToolTip tooltip_window;
130                 private DataGridViewCell tooltip_currently_showing;
131
132                 private DataGridViewSelectedRowCollection selected_rows;
133                 private DataGridViewSelectedColumnCollection selected_columns;
134                 private DataGridViewRow editing_row;
135                 
136                 DataGridViewHeaderCell pressed_header_cell;
137                 DataGridViewHeaderCell entered_header_cell;
138
139                 // For column/row resizing via mouse
140                 private bool column_resize_active = false;
141                 private bool row_resize_active = false;
142                 private int resize_band = -1;
143                 private int resize_band_start = 0;
144                 private int resize_band_delta = 0;
145                 
146                 public DataGridView ()
147                 {
148                         SetStyle (ControlStyles.Opaque, true);
149                         //SetStyle (ControlStyles.UserMouse, true);
150                         SetStyle (ControlStyles.OptimizedDoubleBuffer, true);
151                         
152                         adjustedTopLeftHeaderBorderStyle = new DataGridViewAdvancedBorderStyle();
153                         adjustedTopLeftHeaderBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
154                         advancedCellBorderStyle = new DataGridViewAdvancedBorderStyle();
155                         advancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
156                         advancedColumnHeadersBorderStyle = new DataGridViewAdvancedBorderStyle();
157                         advancedColumnHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
158                         advancedRowHeadersBorderStyle = new DataGridViewAdvancedBorderStyle();
159                         advancedRowHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
160                         alternatingRowsDefaultCellStyle = new DataGridViewCellStyle();
161                         allowUserToAddRows = true;
162                         allowUserToDeleteRows = true;
163                         allowUserToOrderColumns = false;
164                         allowUserToResizeColumns = true;
165                         allowUserToResizeRows = true;
166                         autoGenerateColumns = true;
167                         autoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
168                         autoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
169                         backColor = Control.DefaultBackColor;
170                         backgroundColor = SystemColors.AppWorkspace;
171                         borderStyle = BorderStyle.FixedSingle;
172                         cellBorderStyle = DataGridViewCellBorderStyle.Single;
173                         clipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithAutoHeaderText;
174                         columnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
175                         columnHeadersDefaultCellStyle = new DataGridViewCellStyle();
176                         columnHeadersDefaultCellStyle.BackColor = SystemColors.Control;
177                         columnHeadersDefaultCellStyle.ForeColor = SystemColors.WindowText;
178                         columnHeadersDefaultCellStyle.SelectionBackColor = SystemColors.Highlight;
179                         columnHeadersDefaultCellStyle.SelectionForeColor = SystemColors.HighlightText;
180                         columnHeadersDefaultCellStyle.Font = this.Font;
181                         columnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
182                         columnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.True;
183                         columnHeadersHeight = 23;
184                         columnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
185                         columnHeadersVisible = true;
186                         columns = CreateColumnsInstance();
187                         columns.CollectionChanged += OnColumnCollectionChanged;
188                         currentCellAddress = new Point (-1, -1);
189                         dataMember = String.Empty;
190                         defaultCellStyle = new DataGridViewCellStyle();
191                         defaultCellStyle.BackColor = SystemColors.Window;
192                         defaultCellStyle.ForeColor = SystemColors.ControlText;
193                         defaultCellStyle.SelectionBackColor = SystemColors.Highlight;
194                         defaultCellStyle.SelectionForeColor = SystemColors.HighlightText;
195                         defaultCellStyle.Font = this.Font;
196                         defaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
197                         defaultCellStyle.WrapMode = DataGridViewTriState.False;
198                         editMode = DataGridViewEditMode.EditOnKeystrokeOrF2;
199                         firstDisplayedScrollingColumnHiddenWidth = 0;
200                         isCurrentCellDirty = false;
201                         multiSelect = true;
202                         readOnly = false;
203                         rowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
204                         rowHeadersDefaultCellStyle = (DataGridViewCellStyle) columnHeadersDefaultCellStyle.Clone ();
205                         rowHeadersVisible = true;
206                         rowHeadersWidth = 41;
207                         rowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing;
208                         rows = CreateRowsInstance();
209                         rowsDefaultCellStyle = new DataGridViewCellStyle();
210                         selectionMode = DataGridViewSelectionMode.RowHeaderSelect;
211                         showCellErrors = true;
212                         showEditingIcon = true;
213                         scrollBars = ScrollBars.Both;
214                         userSetCursor = Cursor.Current;
215                         virtualMode = false;
216
217                         horizontalScrollBar = new HScrollBar();
218                         horizontalScrollBar.Scroll += OnHScrollBarScroll;
219                         horizontalScrollBar.Visible = false;
220                         
221                         verticalScrollBar = new VScrollBar();
222                         verticalScrollBar.Scroll += OnVScrollBarScroll;
223                         verticalScrollBar.Visible = false;
224                         
225                         Controls.AddRange (new Control[] {horizontalScrollBar, verticalScrollBar});
226                 }
227
228                 void ISupportInitialize.BeginInit ()
229                 {
230                 }
231
232                 void ISupportInitialize.EndInit ()
233                 {
234                 }
235
236                 // Propiedades
237
238                 [Browsable (false)]
239                 [EditorBrowsable (EditorBrowsableState.Advanced)]
240                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
241                 public virtual DataGridViewAdvancedBorderStyle AdjustedTopLeftHeaderBorderStyle {
242                         get { return adjustedTopLeftHeaderBorderStyle; }
243                 }
244
245                 [Browsable (false)]
246                 [EditorBrowsable (EditorBrowsableState.Advanced)]
247                 public DataGridViewAdvancedBorderStyle AdvancedCellBorderStyle {
248                         get { return advancedCellBorderStyle; }
249                 }
250
251                 [Browsable (false)]
252                 [EditorBrowsable (EditorBrowsableState.Advanced)]
253                 public DataGridViewAdvancedBorderStyle AdvancedColumnHeadersBorderStyle {
254                         get { return advancedColumnHeadersBorderStyle; }
255                 }
256
257                 [Browsable (false)]
258                 [EditorBrowsable (EditorBrowsableState.Advanced)]
259                 public DataGridViewAdvancedBorderStyle AdvancedRowHeadersBorderStyle {
260                         get { return advancedRowHeadersBorderStyle; }
261                 }
262
263                 [DefaultValue (true)]
264                 public bool AllowUserToAddRows {
265                         get { 
266                                 if (allowUserToAddRows && DataManager != null)
267                                         return DataManager.AllowNew;
268                                 return allowUserToAddRows;
269                         }
270                         set {
271                                 if (allowUserToAddRows != value) {
272                                         allowUserToAddRows = value;
273                                         if (!value) {
274                                                 if (new_row_editing)
275                                                         CancelEdit ();
276                                                 RemoveEditingRow ();
277                                         } else {
278                                                 PrepareEditingRow (false, false);
279                                         }
280                                         OnAllowUserToAddRowsChanged(EventArgs.Empty);
281                                         Invalidate ();
282                                 }
283                         }
284                 }
285
286                 [DefaultValue (true)]
287                 public bool AllowUserToDeleteRows {
288                         get {
289                                 if (allowUserToDeleteRows && DataManager != null)
290                                         return DataManager.AllowRemove;
291                                 return allowUserToDeleteRows;
292                         }
293                         set {
294                                 if (allowUserToDeleteRows != value) {
295                                         allowUserToDeleteRows = value;
296                                         OnAllowUserToDeleteRowsChanged(EventArgs.Empty);
297                                 }
298                         }
299                 }
300
301                 [DefaultValue (false)]
302                 public bool AllowUserToOrderColumns {
303                         get { return allowUserToOrderColumns; }
304                         set {
305                                 if (allowUserToOrderColumns != value) {
306                                         allowUserToOrderColumns = value;
307                                         OnAllowUserToOrderColumnsChanged(EventArgs.Empty);
308                                 }
309                         }
310                 }
311
312                 [DefaultValue (true)]
313                 public bool AllowUserToResizeColumns {
314                         get { return allowUserToResizeColumns; }
315                         set {
316                                 if (allowUserToResizeColumns != value) {
317                                         allowUserToResizeColumns = value;
318                                         OnAllowUserToResizeColumnsChanged(EventArgs.Empty);
319                                 }
320                         }
321                 }
322
323                 [DefaultValue (true)]
324                 public bool AllowUserToResizeRows {
325                         get { return allowUserToResizeRows; }
326                         set {
327                                 if (allowUserToResizeRows != value) {
328                                         allowUserToResizeRows = value;
329                                         OnAllowUserToResizeRowsChanged(EventArgs.Empty);
330                                 }
331                         }
332                 }
333
334                 public DataGridViewCellStyle AlternatingRowsDefaultCellStyle {
335                         get { return alternatingRowsDefaultCellStyle; }
336                         set {
337                                 if (alternatingRowsDefaultCellStyle != value) {
338                                         alternatingRowsDefaultCellStyle = value;
339                                         OnAlternatingRowsDefaultCellStyleChanged(EventArgs.Empty);
340                                         Invalidate();
341                                 }
342                         }
343                 }
344
345                 [Browsable (false)]
346                 [EditorBrowsable (EditorBrowsableState.Advanced)]
347                 [DefaultValue (true)]
348                 public bool AutoGenerateColumns {
349                         get { return autoGenerateColumns; }
350                         set {
351                                 if (autoGenerateColumns != value) {
352                                         autoGenerateColumns = value;
353                                         OnAutoGenerateColumnsChanged(EventArgs.Empty);
354                                 }
355                         }
356                 }
357
358                 public override bool AutoSize {
359                         get { return autoSize; }
360                         set {
361                                 if (autoSize != value) {
362                                         autoSize = value;
363                                         //OnAutoSizeChanged(EventArgs.Empty);
364                                 }
365                         }
366                 }
367
368                 [DefaultValue (DataGridViewAutoSizeColumnsMode.None)]
369                 public DataGridViewAutoSizeColumnsMode AutoSizeColumnsMode {
370                         get { return autoSizeColumnsMode; }
371                         set {
372                                 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeColumnsMode), value)) {
373                                         throw new InvalidEnumArgumentException("Value is not valid DataGridViewAutoSizeColumnsMode.");
374                                 }
375                                 if (value == DataGridViewAutoSizeColumnsMode.ColumnHeader && columnHeadersVisible == false) {
376                                         foreach (DataGridViewColumn col in columns) {
377                                                 if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet) {
378                                                                 throw new InvalidOperationException("Cant set this property to ColumnHeader in this DataGridView.");
379                                                 }
380                                         }
381                                 }
382                                 if (value == DataGridViewAutoSizeColumnsMode.Fill) {
383                                         foreach (DataGridViewColumn col in columns) {
384                                                 if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet) {
385                                                         if (col.Frozen) {
386                                                                 throw new InvalidOperationException("Cant set this property to Fill in this DataGridView.");
387                                                         }
388                                                 }
389                                         }
390                                 }
391                                 
392                                 autoSizeColumnsMode = value;
393                                 AutoResizeColumns (value);
394                                 Invalidate ();
395                         }
396                 }
397
398                 [DefaultValue (DataGridViewAutoSizeRowsMode.None)]
399                 public DataGridViewAutoSizeRowsMode AutoSizeRowsMode {
400                         get { return autoSizeRowsMode; }
401                         set {
402                                 if (autoSizeRowsMode != value) {
403                                         if (!Enum.IsDefined(typeof(DataGridViewAutoSizeRowsMode), value)) {
404                                                 throw new InvalidEnumArgumentException("Value is not valid DataGridViewRowsMode.");
405                                         }
406                                         if ((value == DataGridViewAutoSizeRowsMode.AllHeaders || value == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && rowHeadersVisible == false) {
407                                                 throw new InvalidOperationException("Cant set this property to AllHeaders or DisplayedHeaders in this DataGridView.");
408                                         }
409                                         autoSizeRowsMode = value;
410                                         
411                                         if (value == DataGridViewAutoSizeRowsMode.None)
412                                                 foreach (DataGridViewRow row in Rows)
413                                                         row.ResetToExplicitHeight ();
414                                         else
415                                                 AutoResizeRows (value);
416                                                 
417                                         OnAutoSizeRowsModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
418                                         Invalidate ();
419                                         ////////////////////////////////////////////////////////////////
420                                 }
421                         }
422                 }
423
424                 [Browsable (false)]
425                 [EditorBrowsable (EditorBrowsableState.Never)]
426                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
427                 public override Color BackColor {
428                         get { return backColor; }
429                         set {
430                                 if (backColor != value) {
431                                         backColor = value;
432                                         OnBackColorChanged(EventArgs.Empty);
433                                 }
434                         }
435                 }
436
437                 public Color BackgroundColor {
438                         get { return backgroundColor; }
439                         set {
440                                 if (backgroundColor != value) {
441                                         if (value == Color.Empty) {
442                                                 throw new ArgumentException("Cant set an Empty color.");
443                                         }
444                                         backgroundColor = value;
445                                         OnBackgroundColorChanged(EventArgs.Empty);
446                                 }
447                         }
448                 }
449
450                 [Browsable (false)]
451                 [EditorBrowsable (EditorBrowsableState.Never)]
452                 public override Image BackgroundImage {
453                         get { return backgroundImage; }
454                         set {
455                                 if (backgroundImage != value) {
456                                         backgroundImage = value;
457                                         OnBackgroundImageChanged(EventArgs.Empty);
458                                 }
459                         }
460                 }
461
462                 [Browsable (false)]
463                 [EditorBrowsable (EditorBrowsableState.Never)]
464                 public override ImageLayout BackgroundImageLayout {
465                         get { return base.BackgroundImageLayout; }
466                         set { base.BackgroundImageLayout = value; }
467                 }
468
469                 [DefaultValue (BorderStyle.FixedSingle)]
470                 public BorderStyle BorderStyle {
471                         get { return borderStyle; }
472                         set {
473                                 if (borderStyle != value) {
474                                         if (!Enum.IsDefined(typeof(BorderStyle), value)) {
475                                                 throw new InvalidEnumArgumentException("Invalid border style.");
476                                         }
477                                         borderStyle = value;
478                                         OnBorderStyleChanged(EventArgs.Empty);
479                                 }
480                         }
481                 }
482
483                 internal int BorderWidth {
484                         get {
485                                 switch (BorderStyle) {
486                                 case BorderStyle.Fixed3D:
487                                         return 2;
488                                 case BorderStyle.FixedSingle:
489                                         return 1;
490                                 case BorderStyle.None:
491                                 default:
492                                         return 0;
493                                 }
494                         }
495                 }
496
497                 [Browsable (true)]
498                 [DefaultValue (DataGridViewCellBorderStyle.Single)]
499                 public DataGridViewCellBorderStyle CellBorderStyle {
500                         get { return cellBorderStyle; }
501                         set {
502                                 if (cellBorderStyle != value) {
503                                         if (value == DataGridViewCellBorderStyle.Custom)
504                                                 throw new ArgumentException ("CellBorderStyle cannot be set to Custom.");
505
506                                         cellBorderStyle = value;
507
508                                         DataGridViewAdvancedBorderStyle border = new DataGridViewAdvancedBorderStyle ();
509
510                                         switch (cellBorderStyle) {
511                                                 case DataGridViewCellBorderStyle.Single:
512                                                         border.All = DataGridViewAdvancedCellBorderStyle.Single;
513                                                         break;
514                                                 case DataGridViewCellBorderStyle.Raised:
515                                                 case DataGridViewCellBorderStyle.RaisedVertical:
516                                                         border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
517                                                         border.Top = DataGridViewAdvancedCellBorderStyle.None;
518                                                         border.Left = DataGridViewAdvancedCellBorderStyle.Outset;
519                                                         border.Right = DataGridViewAdvancedCellBorderStyle.Outset;
520                                                         break;
521                                                 case DataGridViewCellBorderStyle.Sunken:
522                                                         border.All = DataGridViewAdvancedCellBorderStyle.Inset;
523                                                         break;
524                                                 case DataGridViewCellBorderStyle.None:
525                                                         border.All = DataGridViewAdvancedCellBorderStyle.None;
526                                                         break;
527                                                 case DataGridViewCellBorderStyle.SingleVertical:
528                                                         border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
529                                                         border.Top = DataGridViewAdvancedCellBorderStyle.None;
530                                                         border.Left = DataGridViewAdvancedCellBorderStyle.None;
531                                                         border.Right = DataGridViewAdvancedCellBorderStyle.Single;
532                                                         break;
533                                                 case DataGridViewCellBorderStyle.SunkenVertical:
534                                                         border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
535                                                         border.Top = DataGridViewAdvancedCellBorderStyle.None;
536                                                         border.Left = DataGridViewAdvancedCellBorderStyle.Inset;
537                                                         border.Right = DataGridViewAdvancedCellBorderStyle.Inset;
538                                                         break;
539                                                 case DataGridViewCellBorderStyle.SingleHorizontal:
540                                                 case DataGridViewCellBorderStyle.SunkenHorizontal:
541                                                         border.Bottom = DataGridViewAdvancedCellBorderStyle.Inset;
542                                                         border.Top = DataGridViewAdvancedCellBorderStyle.Inset;
543                                                         border.Left = DataGridViewAdvancedCellBorderStyle.None;
544                                                         border.Right = DataGridViewAdvancedCellBorderStyle.None;
545                                                         break;
546                                                 case DataGridViewCellBorderStyle.RaisedHorizontal:
547                                                         border.Bottom = DataGridViewAdvancedCellBorderStyle.Outset;
548                                                         border.Top = DataGridViewAdvancedCellBorderStyle.Outset;
549                                                         border.Left = DataGridViewAdvancedCellBorderStyle.None;
550                                                         border.Right = DataGridViewAdvancedCellBorderStyle.None;
551                                                         break;
552                                         }
553                                         
554                                         advancedCellBorderStyle = border;
555                                         
556                                         OnCellBorderStyleChanged (EventArgs.Empty);
557                                 }
558                         }
559                 }
560
561                 [Browsable (true)]
562                 [DefaultValue (DataGridViewClipboardCopyMode.EnableWithAutoHeaderText)]
563                 public DataGridViewClipboardCopyMode ClipboardCopyMode {
564                         get { return clipboardCopyMode; }
565                         set { clipboardCopyMode = value; }
566                 }
567
568                 [Browsable (false)]
569                 [EditorBrowsable (EditorBrowsableState.Advanced)]
570                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
571                 [DefaultValue (0)]
572                 public int ColumnCount {
573                         get { return columns.Count; }
574                         set {
575                                 if (value < 0) {
576                                         throw new ArgumentOutOfRangeException("ColumnCount", 
577                                                 "ColumnCount must be >= 0.");
578                                 }
579                                 if (dataSource != null) {
580                                         throw new InvalidOperationException("Cant change column count if DataSource is set.");
581                                 }
582                                 if (value < columns.Count) {
583                                         for (int i = columns.Count -1; i >= value; i--) {
584                                                 columns.RemoveAt(i);
585                                         }
586                                 }
587                                 else if (value > columns.Count) {
588                                         for (int i = columns.Count; i < value; i++) {
589                                                 DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn ();
590                                                 columns.Add(col);
591                                         }
592                                 }
593                         }
594                 }
595
596                 [Browsable (true)]
597                 [DefaultValue (DataGridViewHeaderBorderStyle.Raised)]
598                 public DataGridViewHeaderBorderStyle ColumnHeadersBorderStyle {
599                         get { return columnHeadersBorderStyle; }
600                         set {
601                                 if (columnHeadersBorderStyle != value) {
602                                         columnHeadersBorderStyle = value;
603                                         OnColumnHeadersBorderStyleChanged(EventArgs.Empty);
604                                 }
605                         }
606                 }
607
608                 [AmbientValue (null)]
609                 public DataGridViewCellStyle ColumnHeadersDefaultCellStyle {
610                         get { return columnHeadersDefaultCellStyle; }
611                         set {
612                                 if (columnHeadersDefaultCellStyle != value) {
613                                         columnHeadersDefaultCellStyle = value;
614                                         OnColumnHeadersDefaultCellStyleChanged(EventArgs.Empty);
615                                 }
616                         }
617                 }
618
619                 [Localizable (true)]
620                 public int ColumnHeadersHeight {
621                         get { return columnHeadersHeight; }
622                         set {
623                                 if (columnHeadersHeight != value) {
624                                         if (value < 4) {
625                                                 throw new ArgumentOutOfRangeException("ColumnHeadersHeight", 
626                                                         "Column headers height cant be less than 4.");
627                                         }
628                                         if (value > 32768 ) {
629                                                 throw new ArgumentOutOfRangeException("ColumnHeadersHeight", 
630                                                         "Column headers height cannot be more than 32768.");
631                                         }
632                                         columnHeadersHeight = value;
633                                         OnColumnHeadersHeightChanged(EventArgs.Empty);
634                                         
635                                         if (columnHeadersVisible)
636                                                 Invalidate ();
637                                 }
638                         }
639                 }
640
641                 [RefreshProperties (RefreshProperties.All)]
642                 [DefaultValue (DataGridViewColumnHeadersHeightSizeMode.EnableResizing)]
643                 public DataGridViewColumnHeadersHeightSizeMode ColumnHeadersHeightSizeMode {
644                         get { return columnHeadersHeightSizeMode; }
645                         set {
646                                 if (columnHeadersHeightSizeMode != value) {
647                                         if (!Enum.IsDefined(typeof(DataGridViewColumnHeadersHeightSizeMode), value)) {
648                                                 throw new InvalidEnumArgumentException("Value is not a valid DataGridViewColumnHeadersHeightSizeMode.");
649                                         }
650                                         columnHeadersHeightSizeMode = value;
651                                         OnColumnHeadersHeightSizeModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
652                                 }
653                         }
654                 }
655
656                 [DefaultValue (true)]
657                 public bool ColumnHeadersVisible {
658                         get { return columnHeadersVisible; }
659                         set {
660                                 if (columnHeadersVisible != value) {
661                                         columnHeadersVisible = value;
662                                         Invalidate ();
663                                 }
664                         }
665                 }
666
667                 [MergableProperty (false)]
668                 [Editor ("System.Windows.Forms.Design.DataGridViewColumnCollectionEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
669                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
670                 public DataGridViewColumnCollection Columns {
671                         get { return columns; }
672                 }
673
674                 [Browsable (false)]
675                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
676                 public DataGridViewCell CurrentCell {
677                         get { return currentCell; }
678                         set {
679                                 /////////////////////////////////////////////////////
680                                 /// *** InvalidOperationException ***
681                                 /// Changes to the specified cell cannot be committed
682                                 /// to the data cache, or the new cell is in a hidden
683                                 /// row.
684                                 /////////////////////////////////////////////////////
685                                 if (value == null)
686                                         MoveCurrentCell (-1, -1, true, false, false, true);
687                                 else if (value.DataGridView != this)
688                                         throw new ArgumentException("The cell is not in this DataGridView.");
689                                 else
690                                         MoveCurrentCell (value.OwningColumn.Index, value.OwningRow.Index, true, false, false, true);
691                         }
692                 }
693
694                 [Browsable (false)]
695                 public Point CurrentCellAddress {
696                         get { return currentCellAddress; }
697                 }
698
699                 [Browsable (false)]
700                 public DataGridViewRow CurrentRow {
701                         get { 
702                                 if (currentCell != null)
703                                         return currentCell.OwningRow;
704                                 return null;
705                         }
706                 }
707
708                 [DefaultValue ("")]
709                 [Editor ("System.Windows.Forms.Design.DataMemberListEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
710                 public string DataMember {
711                         get { return dataMember; }
712                         set {
713                                 if (dataMember != value) {
714                                         dataMember = value;
715                                         if (BindingContext != null)
716                                                 ReBind ();
717                                         OnDataMemberChanged(EventArgs.Empty);
718                                 }
719                         }
720                 }
721
722                 [RefreshProperties (RefreshProperties.Repaint)]
723                 [DefaultValue (null)]
724                 [AttributeProvider (typeof (IListSource))]
725                 public object DataSource {
726                         get { return dataSource; }
727                         set {
728                                 /* The System.Windows.Forms.DataGridView class supports the standard Windows Forms data-binding model. This means the data source can be of any type that implements:
729                                  - the System.Collections.IList interface, including one-dimensional arrays.
730                                  - the System.ComponentModel.IListSource interface, such as the System.Data.DataTable and System.Data.DataSet classes.
731                                  - the System.ComponentModel.IBindingList interface, such as the System.ComponentModel.Collections.BindingList<> class.
732                                  - the System.ComponentModel.IBindingListView interface, such as the System.Windows.Forms.BindingSource class.
733                                 */
734                                 if (!(value == null || value is IList || value is IListSource || value is IBindingList || value is IBindingListView))
735                                         throw new NotSupportedException ("Type cannot be bound.");
736                                         
737                                 if (value != DataSource) {
738                                         if (IsHandleCreated && value != null && BindingContext != null && BindingContext[value] != null)
739                                                 DataMember = String.Empty;
740                                         ClearBinding ();
741         
742         
743                                         // Do not set dataSource prior to the BindingContext check because there is some lazy initialization 
744                                         // code which might result in double call to ReBind here and in OnBindingContextChanged
745                                         if (BindingContext != null) {
746                                                 dataSource = value;
747                                                 ReBind ();
748                                         } else {
749                                                 dataSource = value;
750                                         }
751
752                                         OnDataSourceChanged (EventArgs.Empty);
753                                 }
754                         }
755                 }
756
757                 internal CurrencyManager DataManager {
758                         get {
759                                 if (DataSource != null && BindingContext != null) {
760                                         string dataMember = DataMember;
761                                         if (dataMember == null)
762                                                 dataMember = String.Empty;
763                                         return (CurrencyManager) this.BindingContext[DataSource, dataMember];
764                                 }
765                                 return null;
766                         }
767                 }
768
769                 [AmbientValue (null)]
770                 public DataGridViewCellStyle DefaultCellStyle {
771                         get { return defaultCellStyle; }
772                         set {
773                                 if (defaultCellStyle != value) {
774                                         defaultCellStyle = value;
775                                         OnDefaultCellStyleChanged(EventArgs.Empty);
776                                 }
777                         }
778                 }
779
780                 public override Rectangle DisplayRectangle {
781                         get { return base.DisplayRectangle; }
782                 }
783
784                 [Browsable (false)]
785                 [EditorBrowsable (EditorBrowsableState.Advanced)]
786                 public Control EditingControl {
787                         get {
788                                 return editingControl;
789                         }
790                 }
791
792                 [Browsable (false)]
793                 [EditorBrowsable (EditorBrowsableState.Advanced)]
794                 public Panel EditingPanel {
795                         get { throw new NotImplementedException(); }
796                 }
797
798                 [DefaultValue (DataGridViewEditMode.EditOnKeystrokeOrF2)]
799                 public DataGridViewEditMode EditMode {
800                         get { return editMode; }
801                         set {
802                                 if (editMode != value) {
803                                         editMode = value;
804                                         OnEditModeChanged(EventArgs.Empty);
805                                 }
806                         }
807                 }
808
809                 [DefaultValue (true)]
810                 public bool EnableHeadersVisualStyles {
811                         get { return enableHeadersVisualStyles; }
812                         set { enableHeadersVisualStyles = value; }
813                 }
814
815                 internal DataGridViewHeaderCell EnteredHeaderCell {
816                         get { return entered_header_cell; }
817                         set {
818                                 if (entered_header_cell == value)
819                                         return;
820                                 if (ThemeEngine.Current.DataGridViewHeaderCellHasHotStyle (this)) {
821                                         Region area_to_invalidate = new Region ();
822                                         area_to_invalidate.MakeEmpty ();
823                                         if (entered_header_cell != null)
824                                                 area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell));
825                                         entered_header_cell = value;
826                                         if (entered_header_cell != null)
827                                                 area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell));
828                                         Invalidate (area_to_invalidate);
829                                         area_to_invalidate.Dispose ();
830                                 } else
831                                         entered_header_cell = value;
832                         }
833                 }
834
835                 [Browsable (false)]
836                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
837                 public DataGridViewCell FirstDisplayedCell {
838                         get { return firstDisplayedCell; }
839                         set {
840                                 if (value.DataGridView != this) {
841                                         throw new ArgumentException("The cell is not in this DataGridView.");
842                                 }
843                                 firstDisplayedCell = value;
844                         }
845                 }
846
847                 [Browsable (false)]
848                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
849                 [EditorBrowsable (EditorBrowsableState.Advanced)]
850                 public int FirstDisplayedScrollingColumnHiddenWidth {
851                         get { return firstDisplayedScrollingColumnHiddenWidth; }
852                 }
853
854                 [Browsable (false)]
855                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
856                 public int FirstDisplayedScrollingColumnIndex {
857                         get { return firstDisplayedScrollingColumnIndex; }
858                         set { firstDisplayedScrollingColumnIndex = value; }
859                 }
860
861                 [Browsable (false)]
862                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
863                 public int FirstDisplayedScrollingRowIndex {
864                         get { return firstDisplayedScrollingRowIndex; }
865                         set { firstDisplayedScrollingRowIndex = value; }
866                 }
867
868                 [Browsable (false)]
869                 [EditorBrowsable (EditorBrowsableState.Advanced)]
870                 public override Font Font {
871                         get { return base.Font; }
872                         set { base.Font = value; }
873                 }
874
875                 [Browsable (false)]
876                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
877                 [EditorBrowsable (EditorBrowsableState.Advanced)]
878                 public override Color ForeColor {
879                         get { return base.ForeColor; }
880                         set { base.ForeColor = value; }
881                 }
882
883                 public Color GridColor {
884                         get { return gridColor; }
885                         set {
886                                 if (gridColor != value) {
887                                         if (value == Color.Empty) {
888                                                 throw new ArgumentException("Cant set an Empty color.");
889                                         }
890                                         gridColor = value;
891                                         OnGridColorChanged(EventArgs.Empty);
892                                 }
893                         }
894                 }
895
896                 [Browsable (false)]
897                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
898                 public int HorizontalScrollingOffset {
899                         get { return horizontalScrollingOffset; }
900                         set { horizontalScrollingOffset = value; }
901                 }
902
903                 [Browsable (false)]
904                 public bool IsCurrentCellDirty {
905                         get { return isCurrentCellDirty; }
906                 }
907
908                 [Browsable (false)]
909                 public bool IsCurrentCellInEditMode {
910                         get {
911                                 if (currentCell == null) {
912                                         return false;
913                                 }
914                                 return currentCell.IsInEditMode;
915                         }
916                 }
917
918                 [Browsable (false)]
919                 public bool IsCurrentRowDirty {
920                         get {
921                                 if (!virtualMode)
922                                         return IsCurrentCellDirty;
923
924                                 QuestionEventArgs args = new QuestionEventArgs ();
925                                 OnRowDirtyStateNeeded (args);
926                                 return args.Response;
927                         }
928                 }
929
930                 [Browsable (false)]
931                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
932                 public DataGridViewCell this [int columnIndex, int rowIndex] {
933                         get { return rows[rowIndex].Cells[columnIndex]; }
934                         set { rows[rowIndex].Cells[columnIndex] = value; }
935                 }
936
937                 [Browsable (false)]
938                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
939                 public DataGridViewCell this [string columnName, int rowIndex] {
940                         get {
941                                 int columnIndex = -1;
942                                 foreach (DataGridViewColumn col in columns) {
943                                         if (col.Name == columnName) {
944                                                 columnIndex = col.Index;
945                                                 break;
946                                         }
947                                 }
948                                 return this[columnIndex, rowIndex];
949                         }
950                         set {
951                                 int columnIndex = -1;
952                                 foreach (DataGridViewColumn col in columns) {
953                                         if (col.Name == columnName) {
954                                                 columnIndex = col.Index;
955                                                 break;
956                                         }
957                                 }
958                                 this[columnIndex, rowIndex] = value;
959                         }
960                 }
961
962                 [DefaultValue (true)]
963                 public bool MultiSelect {
964                         get { return multiSelect; }
965                         set {
966                                 if (multiSelect != value) {
967                                         multiSelect = value;
968                                         OnMultiSelectChanged(EventArgs.Empty);
969                                 }
970                         }
971                 }
972
973                 [Browsable (false)]
974                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
975                 public int NewRowIndex {
976                         get {
977                                 if (!AllowUserToAddRows || ColumnCount == 0) {
978                                         return -1;
979                                 }
980                                 return rows.Count - 1;
981                         }
982                 }
983
984                 [Browsable (false)]
985                 [EditorBrowsable (EditorBrowsableState.Never)]
986                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
987                 public new Padding Padding {
988                         get { return Padding.Empty; }
989                         set { }
990                 }
991
992                 internal DataGridViewHeaderCell PressedHeaderCell {
993                         get { return pressed_header_cell; }
994                 }
995
996                 [Browsable (true)]
997                 [DefaultValue (false)]
998                 public bool ReadOnly {
999                         get { return readOnly; }
1000                         set {
1001                                 if (readOnly != value) {
1002                                         readOnly = value;
1003                                         OnReadOnlyChanged(EventArgs.Empty);
1004                                 }
1005                         }
1006                 }
1007
1008                 [Browsable (false)]
1009                 [EditorBrowsable (EditorBrowsableState.Advanced)]
1010                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1011                 [DefaultValue (0)]
1012                 public int RowCount {
1013                         get { return rows.Count; }
1014                         set {
1015                                 if (value < 0) {
1016                                         throw new ArgumentException("RowCount must be >= 0.");
1017                                 }
1018                                 if (value < 1 && AllowUserToAddRows) {
1019                                         throw new ArgumentException("RowCount must be >= 1 if AllowUserToAddRows is true.");
1020                                 }
1021                                 if (dataSource != null) {
1022                                         throw new InvalidOperationException("Cant change row count if DataSource is set.");
1023                                 }
1024
1025                                 if (value < rows.Count) {
1026                                         int removeRangeEndIndex = rows.Count - 1;
1027                                         if (AllowUserToAddRows)
1028                                                 removeRangeEndIndex--; // do not remove editing row
1029
1030                                         int removeRangeStartIndex = value - 1;
1031                                         if (AllowUserToAddRows)
1032                                                 removeRangeStartIndex--; // remove an extra row before/instead of the editing row
1033
1034                                         for (int i = removeRangeEndIndex; i > removeRangeStartIndex; i--)
1035                                                 rows.RemoveAt(i);
1036                                 } else if (value > rows.Count) {
1037                                         // If we need to add rows and don't have any columns,
1038                                         // we create one column
1039                                         if (ColumnCount == 0)
1040                                                 ColumnCount = 1;
1041
1042                                         List<DataGridViewRow> newRows = new List<DataGridViewRow> (value - rows.Count);
1043                                         for (int i = rows.Count; i < value; i++)
1044                                                 newRows.Add ((DataGridViewRow) RowTemplateFull);
1045                                         rows.AddRange (newRows.ToArray());
1046                                 }
1047                         }
1048                 }
1049
1050                 [Browsable (true)]
1051                 [DefaultValue (DataGridViewHeaderBorderStyle.Raised)]
1052                 public DataGridViewHeaderBorderStyle RowHeadersBorderStyle {
1053                         get { return rowHeadersBorderStyle; }
1054                         set {
1055                                 if (rowHeadersBorderStyle != value) {
1056                                         rowHeadersBorderStyle = value;
1057                                         OnRowHeadersBorderStyleChanged(EventArgs.Empty);
1058                                 }
1059                         }
1060                 }
1061
1062                 [AmbientValue (null)]
1063                 public DataGridViewCellStyle RowHeadersDefaultCellStyle {
1064                         get { return rowHeadersDefaultCellStyle; }
1065                         set {
1066                                 if (rowHeadersDefaultCellStyle != value) {
1067                                         rowHeadersDefaultCellStyle = value;
1068                                         OnRowHeadersDefaultCellStyleChanged(EventArgs.Empty);
1069                                 }
1070                         }
1071                 }
1072
1073                 [DefaultValue (true)]
1074                 public bool RowHeadersVisible {
1075                         get { return rowHeadersVisible; }
1076                         set {
1077                                 if (rowHeadersVisible != value) {
1078                                         rowHeadersVisible = value;
1079                                         Invalidate ();
1080                                 }
1081                         }
1082                 }
1083
1084                 [Localizable (true)]
1085                 public int RowHeadersWidth {
1086                         get { return rowHeadersWidth; }
1087                         set {
1088                                 if (rowHeadersWidth != value) {
1089                                         if (value < 4) {
1090                                                 throw new ArgumentOutOfRangeException("RowHeadersWidth", 
1091                                                         "Row headers width cant be less than 4.");
1092                                         }
1093                                         if (value > 32768 ) {
1094                                                 throw new ArgumentOutOfRangeException("RowHeadersWidth", 
1095                                                         "Row headers width cannot be more than 32768.");
1096                                         }
1097                                         rowHeadersWidth = value;
1098                                         OnRowHeadersWidthChanged(EventArgs.Empty);
1099                                         
1100                                         if (rowHeadersVisible)
1101                                                 Invalidate ();
1102                                 }
1103                         }
1104                 }
1105
1106                 [RefreshProperties (RefreshProperties.All)]
1107                 [DefaultValue (DataGridViewRowHeadersWidthSizeMode.EnableResizing)]
1108                 public DataGridViewRowHeadersWidthSizeMode RowHeadersWidthSizeMode {
1109                         get { return rowHeadersWidthSizeMode; }
1110                         set {
1111                                 if (rowHeadersWidthSizeMode != value) {
1112                                         if (!Enum.IsDefined(typeof(DataGridViewRowHeadersWidthSizeMode), value)) {
1113                                                 throw new InvalidEnumArgumentException("Value is not valid DataGridViewRowHeadersWidthSizeMode.");
1114                                         }
1115                                         rowHeadersWidthSizeMode = value;
1116                                         OnRowHeadersWidthSizeModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
1117                                 }
1118                         }
1119                 }
1120
1121                 [Browsable (false)]
1122                 public DataGridViewRowCollection Rows {
1123                         get { return rows; }
1124                 }
1125
1126                 public DataGridViewCellStyle RowsDefaultCellStyle {
1127                         get { return rowsDefaultCellStyle; }
1128                         set {
1129                                 if (rowsDefaultCellStyle != value) {
1130                                         rowsDefaultCellStyle = value;
1131                                         OnRowsDefaultCellStyleChanged(EventArgs.Empty);
1132                                 }
1133                         }
1134                 }
1135
1136                 // RowTemplate is just the row, it does not contain Cells
1137                 [Browsable (true)]
1138                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
1139                 public DataGridViewRow RowTemplate {
1140                         get {
1141                                 if (rowTemplate == null)
1142                                         rowTemplate = new DataGridViewRow ();
1143
1144                                 return rowTemplate;
1145                         }
1146                         set {
1147                                 rowTemplate = value;
1148                         }
1149                 }
1150
1151                 // Take the RowTemplate, clone it, and add Cells
1152                 // Note this is not stored, so you don't need to Clone it
1153                 internal DataGridViewRow RowTemplateFull {
1154                         get {
1155                                 DataGridViewRow row = (DataGridViewRow) RowTemplate.Clone ();
1156                                 
1157                                 for (int i = row.Cells.Count; i < Columns.Count; i++) {
1158                                         DataGridViewCell template = columns [i].CellTemplate;
1159                                         
1160                                         if (template == null)
1161                                                 throw new InvalidOperationException ("At least one of the DataGridView control's columns has no cell template.");
1162                                         
1163                                         row.Cells.Add ((DataGridViewCell) template.Clone ());
1164                                 }
1165                                 
1166                                 return row;
1167                         }
1168                 }
1169
1170                 internal override bool ScaleChildrenInternal {
1171                         get { return false; }
1172                 }
1173
1174                 [DefaultValue (ScrollBars.Both)]
1175                 [Localizable (true)]
1176                 public ScrollBars ScrollBars {
1177                         get { return scrollBars; }
1178                         set {
1179                                 if (!Enum.IsDefined(typeof(ScrollBars), value)) {
1180                                         throw new InvalidEnumArgumentException("Invalid ScrollBars value.");
1181                                 }
1182                                 ////////////////////////////////////////////////////////////
1183                                 /// *** InvalidOperationException ***
1184                                 /// The System.Windows.Forms.DataGridView is unable to
1185                                 /// scroll due to a cell change that cannot be committed
1186                                 /// or canceled.
1187                                 ///////////////////////////////////////////////////////////
1188                                 scrollBars = value;
1189                                 PerformLayout ();
1190                                 Invalidate ();
1191                         }
1192                 }
1193
1194                 [Browsable (false)]
1195                 public DataGridViewSelectedCellCollection SelectedCells {
1196                         get {
1197                                 DataGridViewSelectedCellCollection selectedCells = new DataGridViewSelectedCellCollection();
1198                                 foreach (DataGridViewRow row in rows) {
1199                                         foreach (DataGridViewCell cell in row.Cells) {
1200                                                 if (cell.Selected) {
1201                                                         selectedCells.InternalAdd(cell);
1202                                                 }
1203                                         }
1204                                 }
1205                                 return selectedCells;
1206                         }
1207                 }
1208
1209                 [Browsable (false)]
1210                 public DataGridViewSelectedColumnCollection SelectedColumns {
1211                         get
1212                         {
1213                                 DataGridViewSelectedColumnCollection result = new DataGridViewSelectedColumnCollection ();
1214
1215                                 if (selectionMode != DataGridViewSelectionMode.FullColumnSelect && selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect)
1216                                         return result;
1217
1218                                 result.InternalAddRange (selected_columns);
1219
1220                                 return result;
1221                         }
1222                 }
1223
1224                 [Browsable (false)]
1225                 public DataGridViewSelectedRowCollection SelectedRows {
1226                         get {
1227                                 DataGridViewSelectedRowCollection result = new DataGridViewSelectedRowCollection (this);
1228                                 
1229                                 if (selectionMode != DataGridViewSelectionMode.FullRowSelect && selectionMode != DataGridViewSelectionMode.RowHeaderSelect)
1230                                         return result;
1231                                 
1232                                 result.InternalAddRange (selected_rows);
1233
1234                                 return result;
1235                         }
1236                 }
1237
1238                 [Browsable (true)]
1239                 [DefaultValue (DataGridViewSelectionMode.RowHeaderSelect)]
1240                 public DataGridViewSelectionMode SelectionMode {
1241                         get { return selectionMode; }
1242                         set {
1243                                 if (!Enum.IsDefined (typeof(DataGridViewSelectionMode), value))
1244                                         throw new InvalidEnumArgumentException ("Value is not valid DataGridViewSelectionMode.");
1245
1246                                 if (value == DataGridViewSelectionMode.ColumnHeaderSelect || value == DataGridViewSelectionMode.FullColumnSelect)
1247                                         foreach (DataGridViewColumn col in Columns)
1248                                                 if (col.SortMode == DataGridViewColumnSortMode.Automatic)
1249                                                         throw new InvalidOperationException (string.Format ("Cannot set SelectionMode to {0} because there are Automatic sort columns.", value));
1250                                 
1251                                 selectionMode = value;
1252                         }
1253                 }
1254
1255                 [DefaultValue (true)]
1256                 public bool ShowCellErrors {
1257                         get { return showCellErrors; }
1258                         set { showCellErrors = value; }
1259                 }
1260
1261                 [DefaultValue (true)]
1262                 public bool ShowCellToolTips {
1263                         get { return showCellToolTips; }
1264                         set { showCellToolTips = value; }
1265                 }
1266
1267                 [DefaultValue (true)]
1268                 public bool ShowEditingIcon {
1269                         get { return showEditingIcon; }
1270                         set { showEditingIcon = value; }
1271                 }
1272
1273                 [DefaultValue (true)]
1274                 public bool ShowRowErrors {
1275                         get { return showRowErrors; }
1276                         set { showRowErrors = value; }
1277                 }
1278
1279                 [Browsable (false)]
1280                 public DataGridViewColumn SortedColumn {
1281                         get { return sortedColumn; }
1282                 }
1283
1284                 [Browsable (false)]
1285                 public SortOrder SortOrder {
1286                         get { return sortOrder; }
1287                 }
1288
1289                 [DefaultValue (false)]
1290                 [EditorBrowsable (EditorBrowsableState.Advanced)]
1291                 public bool StandardTab {
1292                         get { return standardTab; }
1293                         set { standardTab = value; }
1294                 }
1295
1296                 [Bindable (false)]
1297                 [Browsable (false)]
1298                 [EditorBrowsable (EditorBrowsableState.Never)]
1299                 public override string Text {
1300                         get { return base.Text; }
1301                         set { base.Text = value; }
1302                 }
1303
1304                 [Browsable (false)]
1305                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1306                 public DataGridViewHeaderCell TopLeftHeaderCell {
1307                         get {
1308                                 if (topLeftHeaderCell == null) {
1309                                         topLeftHeaderCell = new DataGridViewTopLeftHeaderCell ();
1310                                         topLeftHeaderCell.SetDataGridView (this);
1311                                 }
1312                                 return topLeftHeaderCell;
1313                         }
1314                         set {
1315                                 if (topLeftHeaderCell == value)
1316                                         return;
1317
1318                                 if (topLeftHeaderCell != null)
1319                                         topLeftHeaderCell.SetDataGridView (null);
1320
1321                                 topLeftHeaderCell = value;
1322
1323                                 if (topLeftHeaderCell != null)
1324                                         topLeftHeaderCell.SetDataGridView (this);
1325                         }
1326                 }
1327
1328                 [Browsable (false)]
1329                 [EditorBrowsable (EditorBrowsableState.Advanced)]
1330                 public Cursor UserSetCursor {
1331                         get { return userSetCursor; }
1332                 }
1333
1334                 [Browsable (false)]
1335                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1336                 public int VerticalScrollingOffset {
1337                         get { return verticalScrollingOffset; }
1338                 }
1339
1340                 [MonoTODO ("VirtualMode is not supported.")]
1341                 [EditorBrowsable (EditorBrowsableState.Advanced)]
1342                 [DefaultValue (false)]
1343                 public bool VirtualMode {
1344                         get { return virtualMode; }
1345                         set { virtualMode = value; }
1346                 }
1347
1348                 internal Control EditingControlInternal {
1349                         get { 
1350                                 return editingControl; 
1351                         }
1352                         set {
1353                                 if (value == editingControl)
1354                                         return;
1355
1356                                 if (editingControl != null) {
1357                                         // Can't use Controls.Remove (editingControls), because that method
1358                                         // is overriden to not remove the editing control.
1359                                         DataGridView.DataGridViewControlCollection ctrls = Controls as DataGridView.DataGridViewControlCollection;
1360                                         if (ctrls != null) {
1361                                                 ctrls.RemoveInternal (editingControl);
1362                                         } else {
1363                                                 Controls.Remove (editingControl);
1364                                         }
1365                                 }
1366                                 
1367                                 
1368                                 if (value != null) {
1369                                         value.Visible = false;
1370                                         Controls.Add (value);
1371                                 }
1372
1373                                 editingControl = value;
1374                         }
1375                 }
1376
1377                 static object AllowUserToAddRowsChangedEvent = new object ();
1378                 static object AllowUserToDeleteRowsChangedEvent = new object ();
1379                 static object AllowUserToOrderColumnsChangedEvent = new object ();
1380                 static object AllowUserToResizeColumnsChangedEvent = new object ();
1381                 static object AllowUserToResizeRowsChangedEvent = new object ();
1382                 static object AlternatingRowsDefaultCellStyleChangedEvent = new object ();
1383                 static object AutoGenerateColumnsChangedEvent = new object ();
1384                 static object AutoSizeColumnModeChangedEvent = new object ();
1385                 static object AutoSizeColumnsModeChangedEvent = new object ();
1386                 static object AutoSizeRowsModeChangedEvent = new object ();
1387                 static object BackgroundColorChangedEvent = new object ();
1388                 static object BorderStyleChangedEvent = new object ();
1389                 static object CancelRowEditEvent = new object ();
1390                 static object CellBeginEditEvent = new object ();
1391                 static object CellBorderStyleChangedEvent = new object ();
1392                 static object CellClickEvent = new object ();
1393                 static object CellContentClickEvent = new object ();
1394                 static object CellContentDoubleClickEvent = new object ();
1395                 static object CellContextMenuStripChangedEvent = new object ();
1396                 static object CellContextMenuStripNeededEvent = new object ();
1397                 static object CellDoubleClickEvent = new object ();
1398                 static object CellEndEditEvent = new object ();
1399                 static object CellEnterEvent = new object ();
1400                 static object CellErrorTextChangedEvent = new object ();
1401                 static object CellErrorTextNeededEvent = new object ();
1402                 static object CellFormattingEvent = new object ();
1403                 static object CellLeaveEvent = new object ();
1404                 static object CellMouseClickEvent = new object ();
1405                 static object CellMouseDoubleClickEvent = new object ();
1406                 static object CellMouseDownEvent = new object ();
1407                 static object CellMouseEnterEvent = new object ();
1408                 static object CellMouseLeaveEvent = new object ();
1409                 static object CellMouseMoveEvent = new object ();
1410                 static object CellMouseUpEvent = new object ();
1411                 static object CellPaintingEvent = new object ();
1412                 static object CellParsingEvent = new object ();
1413                 static object CellStateChangedEvent = new object ();
1414                 static object CellStyleChangedEvent = new object ();
1415                 static object CellStyleContentChangedEvent = new object ();
1416                 static object CellToolTipTextChangedEvent = new object ();
1417                 static object CellToolTipTextNeededEvent = new object ();
1418                 static object CellValidatedEvent = new object ();
1419                 static object CellValidatingEvent = new object ();
1420                 static object CellValueChangedEvent = new object ();
1421                 static object CellValueNeededEvent = new object ();
1422                 static object CellValuePushedEvent = new object ();
1423                 static object ColumnAddedEvent = new object ();
1424                 static object ColumnContextMenuStripChangedEvent = new object ();
1425                 static object ColumnDataPropertyNameChangedEvent = new object ();
1426                 static object ColumnDefaultCellStyleChangedEvent = new object ();
1427                 static object ColumnDisplayIndexChangedEvent = new object ();
1428                 static object ColumnDividerDoubleClickEvent = new object ();
1429                 static object ColumnDividerWidthChangedEvent = new object ();
1430                 static object ColumnHeaderCellChangedEvent = new object ();
1431                 static object ColumnHeaderMouseClickEvent = new object ();
1432                 static object ColumnHeaderMouseDoubleClickEvent = new object ();
1433                 static object ColumnHeadersBorderStyleChangedEvent = new object ();
1434                 static object ColumnHeadersDefaultCellStyleChangedEvent = new object ();
1435                 static object ColumnHeadersHeightChangedEvent = new object ();
1436                 static object ColumnHeadersHeightSizeModeChangedEvent = new object ();
1437                 static object ColumnMinimumWidthChangedEvent = new object ();
1438                 static object ColumnNameChangedEvent = new object ();
1439                 static object ColumnRemovedEvent = new object ();
1440                 static object ColumnSortModeChangedEvent = new object ();
1441                 static object ColumnStateChangedEvent = new object ();
1442                 static object ColumnToolTipTextChangedEvent = new object ();
1443                 static object ColumnWidthChangedEvent = new object ();
1444                 static object CurrentCellChangedEvent = new object ();
1445                 static object CurrentCellDirtyStateChangedEvent = new object ();
1446                 static object DataBindingCompleteEvent = new object ();
1447                 static object DataErrorEvent = new object ();
1448                 static object DataMemberChangedEvent = new object ();
1449                 static object DataSourceChangedEvent = new object ();
1450                 static object DefaultCellStyleChangedEvent = new object ();
1451                 static object DefaultValuesNeededEvent = new object ();
1452                 static object EditingControlShowingEvent = new object ();
1453                 static object EditModeChangedEvent = new object ();
1454                 static object GridColorChangedEvent = new object ();
1455                 static object MultiSelectChangedEvent = new object ();
1456                 static object NewRowNeededEvent = new object ();
1457                 static object ReadOnlyChangedEvent = new object ();
1458                 static object RowContextMenuStripChangedEvent = new object ();
1459                 static object RowContextMenuStripNeededEvent = new object ();
1460                 static object RowDefaultCellStyleChangedEvent = new object ();
1461                 static object RowDirtyStateNeededEvent = new object ();
1462                 static object RowDividerDoubleClickEvent = new object ();
1463                 static object RowDividerHeightChangedEvent = new object ();
1464                 static object RowEnterEvent = new object ();
1465                 static object RowErrorTextChangedEvent = new object ();
1466                 static object RowErrorTextNeededEvent = new object ();
1467                 static object RowHeaderCellChangedEvent = new object ();
1468                 static object RowHeaderMouseClickEvent = new object ();
1469                 static object RowHeaderMouseDoubleClickEvent = new object ();
1470                 static object RowHeadersBorderStyleChangedEvent = new object ();
1471                 static object RowHeadersDefaultCellStyleChangedEvent = new object ();
1472                 static object RowHeadersWidthChangedEvent = new object ();
1473                 static object RowHeadersWidthSizeModeChangedEvent = new object ();
1474                 static object RowHeightChangedEvent = new object ();
1475                 static object RowHeightInfoNeededEvent = new object ();
1476                 static object RowHeightInfoPushedEvent = new object ();
1477                 static object RowLeaveEvent = new object ();
1478                 static object RowMinimumHeightChangedEvent = new object ();
1479                 static object RowPostPaintEvent = new object ();
1480                 static object RowPrePaintEvent = new object ();
1481                 static object RowsAddedEvent = new object ();
1482                 static object RowsDefaultCellStyleChangedEvent = new object ();
1483                 static object RowsRemovedEvent = new object ();
1484                 static object RowStateChangedEvent = new object ();
1485                 static object RowUnsharedEvent = new object ();
1486                 static object RowValidatedEvent = new object ();
1487                 static object RowValidatingEvent = new object ();
1488                 static object ScrollEvent = new object ();
1489                 static object SelectionChangedEvent = new object ();
1490                 static object SortCompareEvent = new object ();
1491                 static object SortedEvent = new object ();
1492                 static object UserAddedRowEvent = new object ();
1493                 static object UserDeletedRowEvent = new object ();
1494                 static object UserDeletingRowEvent = new object ();
1495
1496
1497                 //
1498
1499                 public event EventHandler AllowUserToAddRowsChanged {
1500                         add { Events.AddHandler (AllowUserToAddRowsChangedEvent, value); }
1501                         remove { Events.RemoveHandler (AllowUserToAddRowsChangedEvent, value); }
1502                 }
1503
1504                 public event EventHandler AllowUserToDeleteRowsChanged {
1505                         add { Events.AddHandler (AllowUserToDeleteRowsChangedEvent, value); }
1506                         remove { Events.RemoveHandler (AllowUserToDeleteRowsChangedEvent, value); }
1507                 }
1508
1509                 public event EventHandler AllowUserToOrderColumnsChanged {
1510                         add { Events.AddHandler (AllowUserToOrderColumnsChangedEvent, value); }
1511                         remove { Events.RemoveHandler (AllowUserToOrderColumnsChangedEvent, value); }
1512                 }
1513
1514                 public event EventHandler AllowUserToResizeColumnsChanged {
1515                         add { Events.AddHandler (AllowUserToResizeColumnsChangedEvent, value); }
1516                         remove { Events.RemoveHandler (AllowUserToResizeColumnsChangedEvent, value); }
1517                 }
1518
1519                 public event EventHandler AllowUserToResizeRowsChanged {
1520                         add { Events.AddHandler (AllowUserToResizeRowsChangedEvent, value); }
1521                         remove { Events.RemoveHandler (AllowUserToResizeRowsChangedEvent, value); }
1522                 }
1523
1524                 public event EventHandler AlternatingRowsDefaultCellStyleChanged {
1525                         add { Events.AddHandler (AlternatingRowsDefaultCellStyleChangedEvent, value); }
1526                         remove { Events.RemoveHandler (AlternatingRowsDefaultCellStyleChangedEvent, value); }
1527                 }
1528
1529                 [Browsable (false)]
1530                 [EditorBrowsable (EditorBrowsableState.Advanced)]
1531                 public event EventHandler AutoGenerateColumnsChanged {
1532                         add { Events.AddHandler (AutoGenerateColumnsChangedEvent, value); }
1533                         remove { Events.RemoveHandler (AutoGenerateColumnsChangedEvent, value); }
1534                 }
1535
1536                 public event DataGridViewAutoSizeColumnModeEventHandler AutoSizeColumnModeChanged {
1537                         add { Events.AddHandler (AutoSizeColumnModeChangedEvent, value); }
1538                         remove { Events.RemoveHandler (AutoSizeColumnModeChangedEvent, value); }
1539                 }
1540
1541                 public event DataGridViewAutoSizeColumnsModeEventHandler AutoSizeColumnsModeChanged {
1542                         add { Events.AddHandler (AutoSizeColumnsModeChangedEvent, value); }
1543                         remove { Events.RemoveHandler (AutoSizeColumnsModeChangedEvent, value); }
1544                 }
1545
1546                 public event DataGridViewAutoSizeModeEventHandler AutoSizeRowsModeChanged {
1547                         add { Events.AddHandler (AutoSizeRowsModeChangedEvent, value); }
1548                         remove { Events.RemoveHandler (AutoSizeRowsModeChangedEvent, value); }
1549                 }
1550
1551                 [Browsable (false)]
1552                 [EditorBrowsable (EditorBrowsableState.Never)]
1553                 public new event EventHandler BackColorChanged {
1554                         add { base.BackColorChanged += value; }
1555                         remove { base.BackColorChanged -= value; }
1556                 }
1557
1558                 public event EventHandler BackgroundColorChanged {
1559                         add { Events.AddHandler (BackgroundColorChangedEvent, value); }
1560                         remove { Events.RemoveHandler (BackgroundColorChangedEvent, value); }
1561                 }
1562
1563                 [Browsable (false)]
1564                 [EditorBrowsable (EditorBrowsableState.Never)]
1565                 public new event EventHandler BackgroundImageChanged {
1566                         add { base.BackgroundImageChanged += value; }
1567                         remove { base.BackgroundImageChanged -= value; }
1568                 }
1569
1570                 [Browsable (false)]
1571                 [EditorBrowsable (EditorBrowsableState.Never)]
1572                 public new event EventHandler BackgroundImageLayoutChanged  {
1573                         add { base.BackgroundImageLayoutChanged += value; }
1574                         remove { base.BackgroundImageLayoutChanged -= value; }
1575                 }
1576
1577                 public event EventHandler BorderStyleChanged {
1578                         add { Events.AddHandler (BorderStyleChangedEvent, value); }
1579                         remove { Events.RemoveHandler (BorderStyleChangedEvent, value); }
1580                 }
1581
1582                 public event QuestionEventHandler CancelRowEdit {
1583                         add { Events.AddHandler (CancelRowEditEvent, value); }
1584                         remove { Events.RemoveHandler (CancelRowEditEvent, value); }
1585                 }
1586
1587                 public event DataGridViewCellCancelEventHandler CellBeginEdit {
1588                         add { Events.AddHandler (CellBeginEditEvent, value); }
1589                         remove { Events.RemoveHandler (CellBeginEditEvent, value); }
1590                 }
1591
1592                 public event EventHandler CellBorderStyleChanged {
1593                         add { Events.AddHandler (CellBorderStyleChangedEvent, value); }
1594                         remove { Events.RemoveHandler (CellBorderStyleChangedEvent, value); }
1595                 }
1596
1597                 public event DataGridViewCellEventHandler CellClick {
1598                         add { Events.AddHandler (CellClickEvent, value); }
1599                         remove { Events.RemoveHandler (CellClickEvent, value); }
1600                 }
1601
1602                 public event DataGridViewCellEventHandler CellContentClick {
1603                         add { Events.AddHandler (CellContentClickEvent, value); }
1604                         remove { Events.RemoveHandler (CellContentClickEvent, value); }
1605                 }
1606
1607                 public event DataGridViewCellEventHandler CellContentDoubleClick {
1608                         add { Events.AddHandler (CellContentDoubleClickEvent, value); }
1609                         remove { Events.RemoveHandler (CellContentDoubleClickEvent, value); }
1610                 }
1611
1612                 [EditorBrowsable (EditorBrowsableState.Advanced)]
1613                 public event DataGridViewCellEventHandler CellContextMenuStripChanged {
1614                         add { Events.AddHandler (CellContextMenuStripChangedEvent, value); }
1615                         remove { Events.RemoveHandler (CellContextMenuStripChangedEvent, value); }
1616                 }
1617
1618                 [EditorBrowsable (EditorBrowsableState.Advanced)]
1619                 public event DataGridViewCellContextMenuStripNeededEventHandler CellContextMenuStripNeeded {
1620                         add { Events.AddHandler (CellContextMenuStripNeededEvent, value); }
1621                         remove { Events.RemoveHandler (CellContextMenuStripNeededEvent, value); }
1622                 }
1623
1624                 public event DataGridViewCellEventHandler CellDoubleClick {
1625                         add { Events.AddHandler (CellDoubleClickEvent, value); }
1626                         remove { Events.RemoveHandler (CellDoubleClickEvent, value); }
1627                 }
1628
1629                 public event DataGridViewCellEventHandler CellEndEdit {
1630                         add { Events.AddHandler (CellEndEditEvent, value); }
1631                         remove { Events.RemoveHandler (CellEndEditEvent, value); }
1632                 }
1633
1634                 public event DataGridViewCellEventHandler CellEnter {
1635                         add { Events.AddHandler (CellEnterEvent, value); }
1636                         remove { Events.RemoveHandler (CellEnterEvent, value); }
1637                 }
1638
1639                 public event DataGridViewCellEventHandler CellErrorTextChanged {
1640                         add { Events.AddHandler (CellErrorTextChangedEvent, value); }
1641                         remove { Events.RemoveHandler (CellErrorTextChangedEvent, value); }
1642                 }
1643
1644                 [EditorBrowsable (EditorBrowsableState.Advanced)]
1645                 public event DataGridViewCellErrorTextNeededEventHandler CellErrorTextNeeded {
1646                         add { Events.AddHandler (CellErrorTextNeededEvent, value); }
1647                         remove { Events.RemoveHandler (CellErrorTextNeededEvent, value); }
1648                 }
1649
1650                 public event DataGridViewCellFormattingEventHandler CellFormatting {
1651                         add { Events.AddHandler (CellFormattingEvent, value); }
1652                         remove { Events.RemoveHandler (CellFormattingEvent, value); }
1653                 }
1654
1655                 public event DataGridViewCellEventHandler CellLeave {
1656                         add { Events.AddHandler (CellLeaveEvent, value); }
1657                         remove { Events.RemoveHandler (CellLeaveEvent, value); }
1658                 }
1659
1660                 public event DataGridViewCellMouseEventHandler CellMouseClick {
1661                         add { Events.AddHandler (CellMouseClickEvent, value); }
1662                         remove { Events.RemoveHandler (CellMouseClickEvent, value); }
1663                 }
1664
1665                 public event DataGridViewCellMouseEventHandler CellMouseDoubleClick {
1666                         add { Events.AddHandler (CellMouseDoubleClickEvent, value); }
1667                         remove { Events.RemoveHandler (CellMouseDoubleClickEvent, value); }
1668                 }
1669
1670                 public event DataGridViewCellMouseEventHandler CellMouseDown {
1671                         add { Events.AddHandler (CellMouseDownEvent, value); }
1672                         remove { Events.RemoveHandler (CellMouseDownEvent, value); }
1673                 }
1674
1675                 public event DataGridViewCellEventHandler CellMouseEnter {
1676                         add { Events.AddHandler (CellMouseEnterEvent, value); }
1677                         remove { Events.RemoveHandler (CellMouseEnterEvent, value); }
1678                 }
1679
1680                 public event DataGridViewCellEventHandler CellMouseLeave {
1681                         add { Events.AddHandler (CellMouseLeaveEvent, value); }
1682                         remove { Events.RemoveHandler (CellMouseLeaveEvent, value); }
1683                 }
1684
1685                 public event DataGridViewCellMouseEventHandler CellMouseMove {
1686                         add { Events.AddHandler (CellMouseMoveEvent, value); }
1687                         remove { Events.RemoveHandler (CellMouseMoveEvent, value); }
1688                 }
1689
1690                 public event DataGridViewCellMouseEventHandler CellMouseUp {
1691                         add { Events.AddHandler (CellMouseUpEvent, value); }
1692                         remove { Events.RemoveHandler (CellMouseUpEvent, value); }
1693                 }
1694
1695                 public event DataGridViewCellPaintingEventHandler CellPainting {
1696                         add { Events.AddHandler (CellPaintingEvent, value); }
1697                         remove { Events.RemoveHandler (CellPaintingEvent, value); }
1698                 }
1699
1700                 public event DataGridViewCellParsingEventHandler CellParsing {
1701                         add { Events.AddHandler (CellParsingEvent, value); }
1702                         remove { Events.RemoveHandler (CellParsingEvent, value); }
1703                 }
1704
1705                 public event DataGridViewCellStateChangedEventHandler CellStateChanged {
1706                         add { Events.AddHandler (CellStateChangedEvent, value); }
1707                         remove { Events.RemoveHandler (CellStateChangedEvent, value); }
1708                 }
1709
1710                 public event DataGridViewCellEventHandler CellStyleChanged {
1711                         add { Events.AddHandler (CellStyleChangedEvent, value); }
1712                         remove { Events.RemoveHandler (CellStyleChangedEvent, value); }
1713                 }
1714
1715                 public event DataGridViewCellStyleContentChangedEventHandler CellStyleContentChanged {
1716                         add { Events.AddHandler (CellStyleContentChangedEvent, value); }
1717                         remove { Events.RemoveHandler (CellStyleContentChangedEvent, value); }
1718                 }
1719
1720                 public event DataGridViewCellEventHandler CellToolTipTextChanged {
1721                         add { Events.AddHandler (CellToolTipTextChangedEvent, value); }
1722                         remove { Events.RemoveHandler (CellToolTipTextChangedEvent, value); }
1723                 }
1724
1725                 [EditorBrowsable (EditorBrowsableState.Advanced)]
1726                 public event DataGridViewCellToolTipTextNeededEventHandler CellToolTipTextNeeded {
1727                         add { Events.AddHandler (CellToolTipTextNeededEvent, value); }
1728                         remove { Events.RemoveHandler (CellToolTipTextNeededEvent, value); }
1729                 }
1730
1731                 public event DataGridViewCellEventHandler CellValidated {
1732                         add { Events.AddHandler (CellValidatedEvent, value); }
1733                         remove { Events.RemoveHandler (CellValidatedEvent, value); }
1734                 }
1735
1736                 public event DataGridViewCellValidatingEventHandler CellValidating {
1737                         add { Events.AddHandler (CellValidatingEvent, value); }
1738                         remove { Events.RemoveHandler (CellValidatingEvent, value); }
1739                 }
1740
1741                 public event DataGridViewCellEventHandler CellValueChanged {
1742                         add { Events.AddHandler (CellValueChangedEvent, value); }
1743                         remove { Events.RemoveHandler (CellValueChangedEvent, value); }
1744                 }
1745
1746                 [EditorBrowsable (EditorBrowsableState.Advanced)]
1747                 public event DataGridViewCellValueEventHandler CellValueNeeded {
1748                         add { Events.AddHandler (CellValueNeededEvent, value); }
1749                         remove { Events.RemoveHandler (CellValueNeededEvent, value); }
1750                 }
1751
1752                 [EditorBrowsable (EditorBrowsableState.Advanced)]
1753                 public event DataGridViewCellValueEventHandler CellValuePushed {
1754                         add { Events.AddHandler (CellValuePushedEvent, value); }
1755                         remove { Events.RemoveHandler (CellValuePushedEvent, value); }
1756                 }
1757
1758                 public event DataGridViewColumnEventHandler ColumnAdded {
1759                         add { Events.AddHandler (ColumnAddedEvent, value); }
1760                         remove { Events.RemoveHandler (ColumnAddedEvent, value); }
1761                 }
1762
1763                 public event DataGridViewColumnEventHandler ColumnContextMenuStripChanged {
1764                         add { Events.AddHandler (ColumnContextMenuStripChangedEvent, value); }
1765                         remove { Events.RemoveHandler (ColumnContextMenuStripChangedEvent, value); }
1766                 }
1767
1768                 public event DataGridViewColumnEventHandler ColumnDataPropertyNameChanged {
1769                         add { Events.AddHandler (ColumnDataPropertyNameChangedEvent, value); }
1770                         remove { Events.RemoveHandler (ColumnDataPropertyNameChangedEvent, value); }
1771                 }
1772
1773                 public event DataGridViewColumnEventHandler ColumnDefaultCellStyleChanged {
1774                         add { Events.AddHandler (ColumnDefaultCellStyleChangedEvent, value); }
1775                         remove { Events.RemoveHandler (ColumnDefaultCellStyleChangedEvent, value); }
1776                 }
1777
1778                 public event DataGridViewColumnEventHandler ColumnDisplayIndexChanged {
1779                         add { Events.AddHandler (ColumnDisplayIndexChangedEvent, value); }
1780                         remove { Events.RemoveHandler (ColumnDisplayIndexChangedEvent, value); }
1781                 }
1782
1783                 public event DataGridViewColumnDividerDoubleClickEventHandler ColumnDividerDoubleClick {
1784                         add { Events.AddHandler (ColumnDividerDoubleClickEvent, value); }
1785                         remove { Events.RemoveHandler (ColumnDividerDoubleClickEvent, value); }
1786                 }
1787
1788                 public event DataGridViewColumnEventHandler ColumnDividerWidthChanged {
1789                         add { Events.AddHandler (ColumnDividerWidthChangedEvent, value); }
1790                         remove { Events.RemoveHandler (ColumnDividerWidthChangedEvent, value); }
1791                 }
1792
1793                 public event DataGridViewColumnEventHandler ColumnHeaderCellChanged {
1794                         add { Events.AddHandler (ColumnHeaderCellChangedEvent, value); }
1795                         remove { Events.RemoveHandler (ColumnHeaderCellChangedEvent, value); }
1796                 }
1797
1798                 public event DataGridViewCellMouseEventHandler ColumnHeaderMouseClick {
1799                         add { Events.AddHandler (ColumnHeaderMouseClickEvent, value); }
1800                         remove { Events.RemoveHandler (ColumnHeaderMouseClickEvent, value); }
1801                 }
1802
1803                 public event DataGridViewCellMouseEventHandler ColumnHeaderMouseDoubleClick {
1804                         add { Events.AddHandler (ColumnHeaderMouseDoubleClickEvent, value); }
1805                         remove { Events.RemoveHandler (ColumnHeaderMouseDoubleClickEvent, value); }
1806                 }
1807
1808                 public event EventHandler ColumnHeadersBorderStyleChanged {
1809                         add { Events.AddHandler (ColumnHeadersBorderStyleChangedEvent, value); }
1810                         remove { Events.RemoveHandler (ColumnHeadersBorderStyleChangedEvent, value); }
1811                 }
1812
1813                 public event EventHandler ColumnHeadersDefaultCellStyleChanged {
1814                         add { Events.AddHandler (ColumnHeadersDefaultCellStyleChangedEvent, value); }
1815                         remove { Events.RemoveHandler (ColumnHeadersDefaultCellStyleChangedEvent, value); }
1816                 }
1817
1818                 public event EventHandler ColumnHeadersHeightChanged {
1819                         add { Events.AddHandler (ColumnHeadersHeightChangedEvent, value); }
1820                         remove { Events.RemoveHandler (ColumnHeadersHeightChangedEvent, value); }
1821                 }
1822
1823                 public event DataGridViewAutoSizeModeEventHandler ColumnHeadersHeightSizeModeChanged {
1824                         add { Events.AddHandler (ColumnHeadersHeightSizeModeChangedEvent, value); }
1825                         remove { Events.RemoveHandler (ColumnHeadersHeightSizeModeChangedEvent, value); }
1826                 }
1827
1828                 public event DataGridViewColumnEventHandler ColumnMinimumWidthChanged {
1829                         add { Events.AddHandler (ColumnMinimumWidthChangedEvent, value); }
1830                         remove { Events.RemoveHandler (ColumnMinimumWidthChangedEvent, value); }
1831                 }
1832
1833                 public event DataGridViewColumnEventHandler ColumnNameChanged {
1834                         add { Events.AddHandler (ColumnNameChangedEvent, value); }
1835                         remove { Events.RemoveHandler (ColumnNameChangedEvent, value); }
1836                 }
1837
1838                 public event DataGridViewColumnEventHandler ColumnRemoved {
1839                         add { Events.AddHandler (ColumnRemovedEvent, value); }
1840                         remove { Events.RemoveHandler (ColumnRemovedEvent, value); }
1841                 }
1842
1843                 public event DataGridViewColumnEventHandler ColumnSortModeChanged {
1844                         add { Events.AddHandler (ColumnSortModeChangedEvent, value); }
1845                         remove { Events.RemoveHandler (ColumnSortModeChangedEvent, value); }
1846                 }
1847
1848                 public event DataGridViewColumnStateChangedEventHandler ColumnStateChanged {
1849                         add { Events.AddHandler (ColumnStateChangedEvent, value); }
1850                         remove { Events.RemoveHandler (ColumnStateChangedEvent, value); }
1851                 }
1852
1853                 public event DataGridViewColumnEventHandler ColumnToolTipTextChanged {
1854                         add { Events.AddHandler (ColumnToolTipTextChangedEvent, value); }
1855                         remove { Events.RemoveHandler (ColumnToolTipTextChangedEvent, value); }
1856                 }
1857
1858                 public event DataGridViewColumnEventHandler ColumnWidthChanged {
1859                         add { Events.AddHandler (ColumnWidthChangedEvent, value); }
1860                         remove { Events.RemoveHandler (ColumnWidthChangedEvent, value); }
1861                 }
1862
1863                 public event EventHandler CurrentCellChanged {
1864                         add { Events.AddHandler (CurrentCellChangedEvent, value); }
1865                         remove { Events.RemoveHandler (CurrentCellChangedEvent, value); }
1866                 }
1867
1868                 [EditorBrowsable (EditorBrowsableState.Advanced)]
1869                 public event EventHandler CurrentCellDirtyStateChanged {
1870                         add { Events.AddHandler (CurrentCellDirtyStateChangedEvent, value); }
1871                         remove { Events.RemoveHandler (CurrentCellDirtyStateChangedEvent, value); }
1872                 }
1873
1874                 public event DataGridViewBindingCompleteEventHandler DataBindingComplete {
1875                         add { Events.AddHandler (DataBindingCompleteEvent, value); }
1876                         remove { Events.RemoveHandler (DataBindingCompleteEvent, value); }
1877                 }
1878
1879                 public event DataGridViewDataErrorEventHandler DataError {
1880                         add { Events.AddHandler (DataErrorEvent, value); }
1881                         remove { Events.RemoveHandler (DataErrorEvent, value); }
1882                 }
1883
1884                 public event EventHandler DataMemberChanged {
1885                         add { Events.AddHandler (DataMemberChangedEvent, value); }
1886                         remove { Events.RemoveHandler (DataMemberChangedEvent, value); }
1887                 }
1888
1889                 public event EventHandler DataSourceChanged {
1890                         add { Events.AddHandler (DataSourceChangedEvent, value); }
1891                         remove { Events.RemoveHandler (DataSourceChangedEvent, value); }
1892                 }
1893
1894                 public event EventHandler DefaultCellStyleChanged {
1895                         add { Events.AddHandler (DefaultCellStyleChangedEvent, value); }
1896                         remove { Events.RemoveHandler (DefaultCellStyleChangedEvent, value); }
1897                 }
1898
1899                 [EditorBrowsable (EditorBrowsableState.Advanced)]
1900                 public event DataGridViewRowEventHandler DefaultValuesNeeded {
1901                         add { Events.AddHandler (DefaultValuesNeededEvent, value); }
1902                         remove { Events.RemoveHandler (DefaultValuesNeededEvent, value); }
1903                 }
1904
1905                 public event DataGridViewEditingControlShowingEventHandler EditingControlShowing {
1906                         add { Events.AddHandler (EditingControlShowingEvent, value); }
1907                         remove { Events.RemoveHandler (EditingControlShowingEvent, value); }
1908                 }
1909
1910                 public event EventHandler EditModeChanged {
1911                         add { Events.AddHandler (EditModeChangedEvent, value); }
1912                         remove { Events.RemoveHandler (EditModeChangedEvent, value); }
1913                 }
1914
1915                 [Browsable (false)]
1916                 [EditorBrowsable (EditorBrowsableState.Advanced)]
1917                 public new event EventHandler FontChanged {
1918                         add { base.FontChanged += value; }
1919                         remove { base.FontChanged -= value; }
1920                 }
1921
1922                 [Browsable (false)]
1923                 [EditorBrowsable (EditorBrowsableState.Advanced)]
1924                 public new event EventHandler ForeColorChanged {
1925                         add { base.ForeColorChanged += value; }
1926                         remove { base.ForeColorChanged -= value; }
1927                 }
1928
1929                 [Browsable (false)]
1930                 [EditorBrowsable (EditorBrowsableState.Never)]
1931                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1932                 public new event EventHandler PaddingChanged {
1933                         add { base.PaddingChanged += value; }
1934                         remove { base.PaddingChanged -= value; }
1935                 }
1936
1937                 public event EventHandler GridColorChanged {
1938                         add { Events.AddHandler (GridColorChangedEvent, value); }
1939                         remove { Events.RemoveHandler (GridColorChangedEvent, value); }
1940                 }
1941
1942                 public event EventHandler MultiSelectChanged {
1943                         add { Events.AddHandler (MultiSelectChangedEvent, value); }
1944                         remove { Events.RemoveHandler (MultiSelectChangedEvent, value); }
1945                 }
1946
1947                 public event DataGridViewRowEventHandler NewRowNeeded {
1948                         add { Events.AddHandler (NewRowNeededEvent, value); }
1949                         remove { Events.RemoveHandler (NewRowNeededEvent, value); }
1950                 }
1951
1952                 public event EventHandler ReadOnlyChanged {
1953                         add { Events.AddHandler (ReadOnlyChangedEvent, value); }
1954                         remove { Events.RemoveHandler (ReadOnlyChangedEvent, value); }
1955                 }
1956
1957                 public event DataGridViewRowEventHandler RowContextMenuStripChanged {
1958                         add { Events.AddHandler (RowContextMenuStripChangedEvent, value); }
1959                         remove { Events.RemoveHandler (RowContextMenuStripChangedEvent, value); }
1960                 }
1961
1962                 [EditorBrowsable (EditorBrowsableState.Advanced)]
1963                 public event DataGridViewRowContextMenuStripNeededEventHandler RowContextMenuStripNeeded {
1964                         add { Events.AddHandler (RowContextMenuStripNeededEvent, value); }
1965                         remove { Events.RemoveHandler (RowContextMenuStripNeededEvent, value); }
1966                 }
1967
1968                 public event DataGridViewRowEventHandler RowDefaultCellStyleChanged {
1969                         add { Events.AddHandler (RowDefaultCellStyleChangedEvent, value); }
1970                         remove { Events.RemoveHandler (RowDefaultCellStyleChangedEvent, value); }
1971                 }
1972
1973                 [EditorBrowsable (EditorBrowsableState.Advanced)]
1974                 public event QuestionEventHandler RowDirtyStateNeeded {
1975                         add { Events.AddHandler (RowDirtyStateNeededEvent, value); }
1976                         remove { Events.RemoveHandler (RowDirtyStateNeededEvent, value); }
1977                 }
1978
1979                 public event DataGridViewRowDividerDoubleClickEventHandler RowDividerDoubleClick {
1980                         add { Events.AddHandler (RowDividerDoubleClickEvent, value); }
1981                         remove { Events.RemoveHandler (RowDividerDoubleClickEvent, value); }
1982                 }
1983
1984                 public event DataGridViewRowEventHandler RowDividerHeightChanged {
1985                         add { Events.AddHandler (RowDividerHeightChangedEvent, value); }
1986                         remove { Events.RemoveHandler (RowDividerHeightChangedEvent, value); }
1987                 }
1988
1989                 public event DataGridViewCellEventHandler RowEnter {
1990                         add { Events.AddHandler (RowEnterEvent, value); }
1991                         remove { Events.RemoveHandler (RowEnterEvent, value); }
1992                 }
1993
1994                 public event DataGridViewRowEventHandler RowErrorTextChanged {
1995                         add { Events.AddHandler (RowErrorTextChangedEvent, value); }
1996                         remove { Events.RemoveHandler (RowErrorTextChangedEvent, value); }
1997                 }
1998
1999                 [EditorBrowsable (EditorBrowsableState.Advanced)]
2000                 public event DataGridViewRowErrorTextNeededEventHandler RowErrorTextNeeded {
2001                         add { Events.AddHandler (RowErrorTextNeededEvent, value); }
2002                         remove { Events.RemoveHandler (RowErrorTextNeededEvent, value); }
2003                 }
2004
2005                 public event DataGridViewRowEventHandler RowHeaderCellChanged {
2006                         add { Events.AddHandler (RowHeaderCellChangedEvent, value); }
2007                         remove { Events.RemoveHandler (RowHeaderCellChangedEvent, value); }
2008                 }
2009
2010                 public event DataGridViewCellMouseEventHandler RowHeaderMouseClick {
2011                         add { Events.AddHandler (RowHeaderMouseClickEvent, value); }
2012                         remove { Events.RemoveHandler (RowHeaderMouseClickEvent, value); }
2013                 }
2014
2015                 public event DataGridViewCellMouseEventHandler RowHeaderMouseDoubleClick {
2016                         add { Events.AddHandler (RowHeaderMouseDoubleClickEvent, value); }
2017                         remove { Events.RemoveHandler (RowHeaderMouseDoubleClickEvent, value); }
2018                 }
2019
2020                 public event EventHandler RowHeadersBorderStyleChanged {
2021                         add { Events.AddHandler (RowHeadersBorderStyleChangedEvent, value); }
2022                         remove { Events.RemoveHandler (RowHeadersBorderStyleChangedEvent, value); }
2023                 }
2024
2025                 public event EventHandler RowHeadersDefaultCellStyleChanged {
2026                         add { Events.AddHandler (RowHeadersDefaultCellStyleChangedEvent, value); }
2027                         remove { Events.RemoveHandler (RowHeadersDefaultCellStyleChangedEvent, value); }
2028                 }
2029
2030                 public event EventHandler RowHeadersWidthChanged {
2031                         add { Events.AddHandler (RowHeadersWidthChangedEvent, value); }
2032                         remove { Events.RemoveHandler (RowHeadersWidthChangedEvent, value); }
2033                 }
2034
2035                 public event DataGridViewAutoSizeModeEventHandler RowHeadersWidthSizeModeChanged {
2036                         add { Events.AddHandler (RowHeadersWidthSizeModeChangedEvent, value); }
2037                         remove { Events.RemoveHandler (RowHeadersWidthSizeModeChangedEvent, value); }
2038                 }
2039
2040                 public event DataGridViewRowEventHandler RowHeightChanged {
2041                         add { Events.AddHandler (RowHeightChangedEvent, value); }
2042                         remove { Events.RemoveHandler (RowHeightChangedEvent, value); }
2043                 }
2044
2045                 [EditorBrowsable (EditorBrowsableState.Advanced)]
2046                 public event DataGridViewRowHeightInfoNeededEventHandler RowHeightInfoNeeded {
2047                         add { Events.AddHandler (RowHeightInfoNeededEvent, value); }
2048                         remove { Events.RemoveHandler (RowHeightInfoNeededEvent, value); }
2049                 }
2050
2051                 [EditorBrowsable (EditorBrowsableState.Advanced)]
2052                 public event DataGridViewRowHeightInfoPushedEventHandler RowHeightInfoPushed {
2053                         add { Events.AddHandler (RowHeightInfoPushedEvent, value); }
2054                         remove { Events.RemoveHandler (RowHeightInfoPushedEvent, value); }
2055                 }
2056
2057                 public event DataGridViewCellEventHandler RowLeave {
2058                         add { Events.AddHandler (RowLeaveEvent, value); }
2059                         remove { Events.RemoveHandler (RowLeaveEvent, value); }
2060                 }
2061
2062                 public event DataGridViewRowEventHandler RowMinimumHeightChanged {
2063                         add { Events.AddHandler (RowMinimumHeightChangedEvent, value); }
2064                         remove { Events.RemoveHandler (RowMinimumHeightChangedEvent, value); }
2065                 }
2066
2067                 public event DataGridViewRowPostPaintEventHandler RowPostPaint {
2068                         add { Events.AddHandler (RowPostPaintEvent, value); }
2069                         remove { Events.RemoveHandler (RowPostPaintEvent, value); }
2070                 }
2071
2072                 public event DataGridViewRowPrePaintEventHandler RowPrePaint {
2073                         add { Events.AddHandler (RowPrePaintEvent, value); }
2074                         remove { Events.RemoveHandler (RowPrePaintEvent, value); }
2075                 }
2076
2077                 public event DataGridViewRowsAddedEventHandler RowsAdded {
2078                         add { Events.AddHandler (RowsAddedEvent, value); }
2079                         remove { Events.RemoveHandler (RowsAddedEvent, value); }
2080                 }
2081
2082                 public event EventHandler RowsDefaultCellStyleChanged {
2083                         add { Events.AddHandler (RowsDefaultCellStyleChangedEvent, value); }
2084                         remove { Events.RemoveHandler (RowsDefaultCellStyleChangedEvent, value); }
2085                 }
2086
2087                 public event DataGridViewRowsRemovedEventHandler RowsRemoved {
2088                         add { Events.AddHandler (RowsRemovedEvent, value); }
2089                         remove { Events.RemoveHandler (RowsRemovedEvent, value); }
2090                 }
2091
2092                 public event DataGridViewRowStateChangedEventHandler RowStateChanged {
2093                         add { Events.AddHandler (RowStateChangedEvent, value); }
2094                         remove { Events.RemoveHandler (RowStateChangedEvent, value); }
2095                 }
2096
2097                 [EditorBrowsable (EditorBrowsableState.Advanced)]
2098                 public event DataGridViewRowEventHandler RowUnshared {
2099                         add { Events.AddHandler (RowUnsharedEvent, value); }
2100                         remove { Events.RemoveHandler (RowUnsharedEvent, value); }
2101                 }
2102
2103                 public event DataGridViewCellEventHandler RowValidated {
2104                         add { Events.AddHandler (RowValidatedEvent, value); }
2105                         remove { Events.RemoveHandler (RowValidatedEvent, value); }
2106                 }
2107
2108                 public event DataGridViewCellCancelEventHandler RowValidating {
2109                         add { Events.AddHandler (RowValidatingEvent, value); }
2110                         remove { Events.RemoveHandler (RowValidatingEvent, value); }
2111                 }
2112
2113                 public event ScrollEventHandler Scroll {
2114                         add { Events.AddHandler (ScrollEvent, value); }
2115                         remove { Events.RemoveHandler (ScrollEvent, value); }
2116                 }
2117
2118                 public event EventHandler SelectionChanged {
2119                         add { Events.AddHandler (SelectionChangedEvent, value); }
2120                         remove { Events.RemoveHandler (SelectionChangedEvent, value); }
2121                 }
2122
2123                 [EditorBrowsable (EditorBrowsableState.Advanced)]
2124                 public event DataGridViewSortCompareEventHandler SortCompare {
2125                         add { Events.AddHandler (SortCompareEvent, value); }
2126                         remove { Events.RemoveHandler (SortCompareEvent, value); }
2127                 }
2128
2129                 public event EventHandler Sorted {
2130                         add { Events.AddHandler (SortedEvent, value); }
2131                         remove { Events.RemoveHandler (SortedEvent, value); }
2132                 }
2133
2134                 public event DataGridViewRowEventHandler UserAddedRow {
2135                         add { Events.AddHandler (UserAddedRowEvent, value); }
2136                         remove { Events.RemoveHandler (UserAddedRowEvent, value); }
2137                 }
2138
2139                 public event DataGridViewRowEventHandler UserDeletedRow {
2140                         add { Events.AddHandler (UserDeletedRowEvent, value); }
2141                         remove { Events.RemoveHandler (UserDeletedRowEvent, value); }
2142                 }
2143
2144                 public event DataGridViewRowCancelEventHandler UserDeletingRow {
2145                         add { Events.AddHandler (UserDeletingRowEvent, value); }
2146                         remove { Events.RemoveHandler (UserDeletingRowEvent, value); }
2147                 }
2148
2149                 [Browsable (false)]
2150                 [EditorBrowsable (EditorBrowsableState.Never)]
2151                 public new event EventHandler StyleChanged {
2152                         add { base.StyleChanged += value; }
2153                         remove { base.StyleChanged -= value; }
2154                 }
2155
2156                 [Browsable (false)]
2157                 [EditorBrowsable (EditorBrowsableState.Never)]
2158                 public new event EventHandler TextChanged {
2159                         add { base.TextChanged += value; }
2160                         remove { base.TextChanged -= value; }
2161                 }
2162
2163                 [EditorBrowsable (EditorBrowsableState.Advanced)]
2164                 public virtual DataGridViewAdvancedBorderStyle AdjustColumnHeaderBorderStyle (DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStyleInput, DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStylePlaceholder, bool isFirstDisplayedColumn, bool isLastVisibleColumn) {
2165                         return (DataGridViewAdvancedBorderStyle) ((ICloneable)dataGridViewAdvancedBorderStyleInput).Clone();
2166                 }
2167
2168                 public bool AreAllCellsSelected (bool includeInvisibleCells) {
2169                         foreach (DataGridViewRow row in rows) {
2170                                 foreach (DataGridViewCell cell in row.Cells) {
2171                                         if (includeInvisibleCells == false && cell.Visible == false) {
2172                                                 continue;
2173                                         }
2174                                         if (!cell.Selected) {
2175                                                 return false;
2176                                         }
2177                                 }
2178                         }
2179                         return true;
2180                 }
2181
2182                 public void AutoResizeColumn (int columnIndex) {
2183                         AutoResizeColumn (columnIndex, DataGridViewAutoSizeColumnMode.AllCells);
2184                 }
2185
2186                 public void AutoResizeColumn (int columnIndex, DataGridViewAutoSizeColumnMode autoSizeColumnMode)
2187                 {
2188                         AutoResizeColumnInternal (columnIndex, autoSizeColumnMode);
2189                 }
2190
2191                 public void AutoResizeColumnHeadersHeight ()
2192                 {
2193                         int new_height = 0;
2194                         
2195                         foreach (DataGridViewColumn col in Columns)
2196                                 new_height = Math.Max (new_height, col.HeaderCell.PreferredSize.Height);
2197                         
2198                         if (ColumnHeadersHeight != new_height)
2199                                 ColumnHeadersHeight = new_height;
2200                 }
2201
2202                 [MonoTODO ("columnIndex parameter is not used")]
2203                 public void AutoResizeColumnHeadersHeight (int columnIndex)
2204                 {
2205                         AutoResizeColumnHeadersHeight ();
2206                 }
2207
2208                 public void AutoResizeColumns () {
2209                         AutoResizeColumns (DataGridViewAutoSizeColumnsMode.AllCells);
2210                 }
2211
2212                 public void AutoResizeColumns (DataGridViewAutoSizeColumnsMode autoSizeColumnsMode) {
2213                         AutoResizeColumns (autoSizeColumnsMode, true);
2214                 }
2215
2216                 public void AutoResizeRow (int rowIndex)
2217                 {
2218                         AutoResizeRow (rowIndex, DataGridViewAutoSizeRowMode.AllCells, true);
2219                 }
2220
2221                 public void AutoResizeRow (int rowIndex, DataGridViewAutoSizeRowMode autoSizeRowMode)
2222                 {
2223                         AutoResizeRow (rowIndex, autoSizeRowMode, true);
2224                 }
2225
2226                 public void AutoResizeRowHeadersWidth (DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode)
2227                 {
2228                         if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToFirstHeader) {
2229                                 RowHeadersWidth = GetRowInternal (0).HeaderCell.PreferredSize.Width;
2230                                 return;
2231                         }
2232                         
2233                         int new_width = 0;
2234                         
2235                         if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders) {
2236                                 foreach (DataGridViewRow row in Rows)
2237                                         if (row.Displayed)
2238                                                 new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
2239                                                 
2240                                 if (RowHeadersWidth != new_width)
2241                                         RowHeadersWidth = new_width;
2242                                         
2243                                 return;
2244                         }
2245
2246                         if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders) {
2247                                 foreach (DataGridViewRow row in Rows)
2248                                         new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
2249
2250                                 if (RowHeadersWidth != new_width)
2251                                         RowHeadersWidth = new_width;
2252
2253                                 return;
2254                         }
2255                 }
2256
2257                 [MonoTODO ("Does not use rowIndex parameter.")]
2258                 public void AutoResizeRowHeadersWidth (int rowIndex, DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode)
2259                 {
2260                         AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
2261                 }
2262
2263                 public void AutoResizeRows ()
2264                 {
2265                         AutoResizeRows (0, Rows.Count, DataGridViewAutoSizeRowMode.AllCells, false);
2266                 }
2267
2268                 public void AutoResizeRows (DataGridViewAutoSizeRowsMode autoSizeRowsMode)
2269                 {
2270                         if (!Enum.IsDefined(typeof(DataGridViewAutoSizeRowsMode), autoSizeRowsMode))
2271                                 throw new InvalidEnumArgumentException ("Parameter autoSizeRowsMode is not a valid DataGridViewRowsMode.");
2272                         if ((autoSizeRowsMode == DataGridViewAutoSizeRowsMode.AllHeaders || autoSizeRowsMode == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && rowHeadersVisible == false)
2273                                 throw new InvalidOperationException ("Parameter autoSizeRowsMode cannot be AllHeaders or DisplayedHeaders in this DataGridView.");
2274                         if (autoSizeRowsMode == DataGridViewAutoSizeRowsMode.None)
2275                                 throw new ArgumentException ("Parameter autoSizeRowsMode cannot be None.");
2276                         
2277                         AutoResizeRows (autoSizeRowsMode, false);
2278                 }
2279
2280                 public virtual bool BeginEdit (bool selectAll) {
2281                         if (currentCell == null || currentCell.IsInEditMode)
2282                                 return false;
2283
2284                         if (currentCell.RowIndex >= 0) {
2285                                 if ((currentCell.InheritedState & DataGridViewElementStates.ReadOnly) == DataGridViewElementStates.ReadOnly) {
2286                                         return false;
2287                                 }
2288                         }
2289
2290                         DataGridViewCell cell = currentCell;
2291                         Type editType = cell.EditType;
2292                         
2293                         if (editType == null && !(cell is IDataGridViewEditingCell))
2294                                 return false;
2295                                 
2296                         // Give user a chance to cancel the edit
2297                         DataGridViewCellCancelEventArgs e = new DataGridViewCellCancelEventArgs (cell.ColumnIndex, cell.RowIndex);
2298                         OnCellBeginEdit (e);
2299
2300                         if (e.Cancel)
2301                                 return false;
2302
2303                         cell.SetIsInEditMode (true);
2304                         
2305                         // The cell has an editing control we need to setup
2306                         if (editType != null) {
2307                                 Control ctrl = EditingControlInternal;
2308                                 
2309                                 // Check if we can reuse the one we already have
2310                                 bool isCorrectType = ctrl != null && ctrl.GetType () == editType;
2311                                 
2312                                 if (!isCorrectType)
2313                                         ctrl = null;
2314                                 
2315                                 // We couldn't use the existing one, create a new one
2316                                 if (ctrl == null) {
2317                                         ctrl = (Control) Activator.CreateInstance (editType);
2318                                         EditingControlInternal = ctrl;
2319                                 }
2320                                 
2321                                 // Call some functions that allows the editing control to get setup
2322                                 DataGridViewCellStyle style = cell.RowIndex == -1 ? DefaultCellStyle : cell.InheritedStyle;
2323                                 cell.InitializeEditingControl (cell.RowIndex, cell.FormattedValue, style);
2324                                 OnEditingControlShowing (new DataGridViewEditingControlShowingEventArgs (EditingControlInternal, style));
2325                                 cell.PositionEditingControl (true, true, this.GetCellDisplayRectangle (cell.ColumnIndex, cell.RowIndex, false), bounds, style, false, false, (columns [cell.ColumnIndex].DisplayIndex == 0), (cell.RowIndex == 0));
2326
2327                                 // Show the editing control
2328                                 if (EditingControlInternal != null)
2329                                         EditingControlInternal.Visible = true;
2330
2331                                 IDataGridViewEditingControl dgvEditingControl = (IDataGridViewEditingControl) EditingControlInternal;
2332                                 if (dgvEditingControl != null) {
2333                                         dgvEditingControl.EditingControlDataGridView = this;
2334                                         dgvEditingControl.EditingControlRowIndex = currentCell.OwningRow.Index;
2335                                         dgvEditingControl.ApplyCellStyleToEditingControl (style);
2336                                         dgvEditingControl.PrepareEditingControlForEdit (selectAll);
2337                                         dgvEditingControl.EditingControlFormattedValue = currentCell.EditedFormattedValue;
2338                                 }
2339                                 return true;
2340                         }
2341
2342                         // If we are here, it means we have a cell that does not have an editing control
2343                         // and simply implements IDataGridViewEditingCell itself.
2344                         (cell as IDataGridViewEditingCell).PrepareEditingCellForEdit (selectAll);
2345
2346                         return true;
2347                 }
2348
2349                 public bool CancelEdit ()
2350                 {
2351                         if (currentCell != null) {
2352                                 if (currentCell.IsInEditMode) {
2353                                         currentCell.SetIsInEditMode (false);
2354                                         currentCell.DetachEditingControl ();
2355                                 }
2356
2357                                 if (currentCell.RowIndex == NewRowIndex) {
2358                                         if (DataManager != null)
2359                                                 DataManager.CancelCurrentEdit ();
2360
2361                                         new_row_editing = false;
2362                                         PrepareEditingRow (false, false);
2363                                         MoveCurrentCell (currentCell.ColumnIndex, NewRowIndex, true, false, false, true);
2364                                         OnUserDeletedRow (new DataGridViewRowEventArgs (EditingRow));
2365                                 }
2366                         }
2367
2368                         return true;
2369                 }
2370
2371                 public void ClearSelection ()
2372                 {
2373                         foreach (DataGridViewColumn col in SelectedColumns)
2374                                 col.Selected = false;
2375                         foreach (DataGridViewRow row in SelectedRows)
2376                                 row.Selected = false;
2377                         foreach (DataGridViewCell cell in SelectedCells)
2378                                 cell.Selected = false;
2379                 }
2380
2381                 public bool CommitEdit (DataGridViewDataErrorContexts context)
2382                 {
2383                         if (currentCell == null)
2384                                 return true;
2385
2386                         try {
2387                                 // convert
2388                                 object newValue = currentCell.ParseFormattedValue (currentCell.EditedFormattedValue, 
2389                                                                                    currentCell.InheritedStyle, null, null);
2390
2391                                 DataGridViewCellValidatingEventArgs validateArgs = new DataGridViewCellValidatingEventArgs (currentCell.ColumnIndex, 
2392                                                                                                                             currentCell.RowIndex, 
2393                                                                                                                             newValue);
2394                                 // validate
2395                                 OnCellValidating (validateArgs);
2396                                 if (validateArgs.Cancel)
2397                                         return false;
2398                                 OnCellValidated (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
2399
2400                                 // commit
2401                                 currentCell.Value = newValue;
2402
2403                         } catch (Exception e) {
2404                                 DataGridViewDataErrorEventArgs args = new DataGridViewDataErrorEventArgs (e, currentCell.ColumnIndex, currentCell.RowIndex, 
2405                                                                                                           DataGridViewDataErrorContexts.Commit);
2406                                 OnDataError (false, args);
2407                                 if (args.ThrowException)
2408                                         throw e;
2409                                 return false;
2410                         }
2411                         return true;
2412                 }
2413
2414                 public int DisplayedColumnCount (bool includePartialColumns)
2415                 {
2416                         int result = 0;
2417                         int columnLeft = 0;
2418
2419                         if (RowHeadersVisible)
2420                                 columnLeft += RowHeadersWidth;
2421
2422                         Size visibleClientArea = ClientSize;
2423                         if (verticalScrollBar.Visible)
2424                                 visibleClientArea.Width -= verticalScrollBar.Width;
2425                         if (horizontalScrollBar.Visible)
2426                                 visibleClientArea.Height -= horizontalScrollBar.Height;
2427
2428                         for (int index = first_col_index; index < Columns.Count; index++) {
2429                                 DataGridViewColumn column = Columns[ColumnDisplayIndexToIndex (index)];
2430                                 if (columnLeft + column.Width <= visibleClientArea.Width) {
2431                                         result++;
2432                                         columnLeft += column.Width;
2433                                 } else {
2434                                         if (includePartialColumns)
2435                                                 result++;
2436                                         break;
2437                                 }
2438                         }
2439                                         
2440                         return result;
2441                 }
2442
2443                 public int DisplayedRowCount (bool includePartialRow)
2444                 {
2445                         int result = 0;
2446                         int rowTop = 0;
2447
2448                         if (ColumnHeadersVisible)
2449                                 rowTop += ColumnHeadersHeight;
2450
2451                         Size visibleClientArea = ClientSize;
2452                         if (verticalScrollBar.Visible)
2453                                 visibleClientArea.Width -= verticalScrollBar.Width;
2454                         if (horizontalScrollBar.Visible)
2455                                 visibleClientArea.Height -= horizontalScrollBar.Height;
2456
2457                         for (int index = first_row_index; index < Rows.Count; index++) {
2458                                 DataGridViewRow row = GetRowInternal (index);
2459                                 if (rowTop + row.Height <= visibleClientArea.Height) {
2460                                         result++;
2461                                         rowTop += row.Height;
2462                                 } else {
2463                                         if (includePartialRow)
2464                                                 result++;
2465                                         break;
2466                                 }
2467                         }
2468                                         
2469                         return result;
2470                 }
2471
2472                 public bool EndEdit ()
2473                 {
2474                         return EndEdit (DataGridViewDataErrorContexts.Commit);
2475                 }
2476
2477                 [MonoTODO ("Does not use context parameter")]
2478                 public bool EndEdit (DataGridViewDataErrorContexts context)
2479                 {
2480                         if (currentCell == null || !currentCell.IsInEditMode)
2481                                 return true;
2482
2483                         if (!CommitEdit (context)) {
2484                                 if (DataManager != null)
2485                                         DataManager.EndCurrentEdit ();
2486                                 if (EditingControl != null)
2487                                         EditingControl.Focus ();
2488                                 return false;
2489                         }
2490
2491                         currentCell.SetIsInEditMode (false);
2492                         currentCell.DetachEditingControl ();
2493                         OnCellEndEdit (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
2494                         if (context != DataGridViewDataErrorContexts.LeaveControl)
2495                                 Focus ();
2496                         if (currentCell.RowIndex == NewRowIndex) {
2497                                 new_row_editing = false;
2498                                 editing_row = null; // editing row becomes a real row
2499                                 PrepareEditingRow (true, false); // add a new editing row
2500                                 MoveCurrentCell (currentCell.ColumnIndex, NewRowIndex, true, false, false, true);
2501                         }
2502                         return true;
2503                 }
2504
2505                 public int GetCellCount (DataGridViewElementStates includeFilter) {
2506                         int result = 0;
2507                         foreach (DataGridViewRow row in rows) {
2508                                 foreach (DataGridViewCell cell in row.Cells) {
2509                                         if ((cell.State & includeFilter) != 0) {
2510                                                 result++;
2511                                         }
2512                                 }
2513                         }
2514                         return result;
2515                 }
2516
2517                 internal DataGridViewRow GetRowInternal (int rowIndex)
2518                 {
2519                         return Rows.SharedRow (rowIndex);
2520                 }
2521
2522                 internal DataGridViewCell GetCellInternal (int colIndex, int rowIndex)
2523                 {
2524                         return GetRowInternal (rowIndex).Cells.GetCellInternal (colIndex);
2525                 }
2526
2527                 public Rectangle GetCellDisplayRectangle (int columnIndex, int rowIndex, bool cutOverflow) {
2528                         // Allow the column and row headers (index == -1).
2529                         if (columnIndex < -1 || columnIndex >= columns.Count) {
2530                                 throw new ArgumentOutOfRangeException ("Column index is out of range.");
2531                         }
2532                         if (rowIndex < -1 || (rowIndex > 0 && rowIndex >= rows.Count)) {
2533                                 throw new ArgumentOutOfRangeException ("Row index is out of range.");
2534                         }
2535                         
2536                         int x = 0, y = 0, w = 0, h = 0;
2537                         
2538                         x = BorderWidth;
2539                         y = BorderWidth;
2540                         
2541                         if (ColumnHeadersVisible)
2542                                 y += ColumnHeadersHeight;
2543                         
2544                         if (RowHeadersVisible)
2545                                 x += RowHeadersWidth;
2546
2547                         // Handle the top left cell when both column and row headers are showing.
2548                         if (columnIndex == -1 && rowIndex == -1)
2549                                 return new Rectangle (BorderWidth, BorderWidth, RowHeadersWidth, ColumnHeadersHeight);
2550
2551                         if (columnIndex >= 0)
2552                         {
2553                                 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2554         
2555                                 for (int i = first_col_index; i < cols.Count; i++) {
2556                                         if (!cols[i].Visible)
2557                                                 continue;
2558                                                 
2559                                         if (cols[i].Index == columnIndex) {
2560                                                 w = cols[i].Width;
2561                                                 break;
2562                                         }
2563         
2564                                         x += cols[i].Width;
2565                                 }
2566                         }
2567                         
2568                         // Handle a cell in the header row.
2569                         if (rowIndex == -1)
2570                                 return new Rectangle (x, BorderWidth, w, ColumnHeadersHeight);
2571
2572                         for (int i = first_row_index; i < Rows.Count; i++) {
2573                                 if (!rows[i].Visible)
2574                                         continue;
2575                                         
2576                                 if (rows[i].Index == rowIndex) {
2577                                         h = rows [i].Height;
2578                                         break;
2579                                 }
2580                                 
2581                                 y += rows [i].Height;
2582                         }
2583                         
2584                         // Handle a cell in the header column.
2585                         if (columnIndex == -1)
2586                                 return new Rectangle (BorderWidth, y, RowHeadersWidth, h);
2587
2588                         return new Rectangle (x, y, w, h);
2589                 }
2590
2591                 public virtual DataObject GetClipboardContent () {
2592                         
2593                         if (clipboardCopyMode == DataGridViewClipboardCopyMode.Disable)
2594                                 throw new InvalidOperationException ("Generating Clipboard content is not supported when the ClipboardCopyMode property is Disable.");
2595                         
2596                         int start_row = int.MaxValue, end_row = int.MinValue;
2597                         int start_col = int.MaxValue, end_col = int.MinValue;
2598                         
2599                         bool include_row_headers = false;
2600                         bool include_col_headers = false;
2601                         bool only_included_headers = false;
2602                         bool headers_includable = false;
2603                         
2604                         switch (ClipboardCopyMode) {
2605                         case DataGridViewClipboardCopyMode.EnableWithoutHeaderText:
2606                                 break;
2607                         case DataGridViewClipboardCopyMode.EnableWithAutoHeaderText:
2608                                 // Headers are included if not selection mode is CellSelect, and any header is selected.
2609                                 headers_includable = selectionMode != DataGridViewSelectionMode.CellSelect;
2610                                 break;
2611                         case DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText:
2612                                 include_col_headers = include_row_headers = true;
2613                                 break;
2614                         }
2615                         
2616                         BitArray included_rows = new BitArray (RowCount);
2617                         BitArray included_cols = new BitArray (ColumnCount);
2618                         
2619                         // If there are any selected columns,
2620                         // include the column headers (if headers are to be shown).
2621                         if (headers_includable && !include_col_headers) {
2622                                 for (int c = 0; c < ColumnCount; c++) {
2623                                         if (Columns [c].Selected) {
2624                                                 include_col_headers = true;
2625                                                 break;
2626                                         }
2627                                 }
2628                         }
2629                         
2630                         // Find the smallest rectangle that encompasses all selected cells.
2631                         for (int r = 0; r < RowCount; r++) {
2632                                 DataGridViewRow row = Rows [r];
2633
2634                                 if (headers_includable && !include_row_headers && row.Selected) {
2635                                         include_row_headers = true;
2636                                 }
2637                                 
2638                                 for (int c = 0; c < ColumnCount; c++) {
2639                                         DataGridViewCell cell = row.Cells [c];
2640                                         
2641                                         if (cell == null || !cell.Selected)
2642                                                 continue;
2643                                         
2644                                         included_cols [c] = true;
2645                                         included_rows [r] = true;
2646                                         
2647                                         start_row = Math.Min (start_row, r);
2648                                         start_col = Math.Min (start_col, c);
2649                                         end_row = Math.Max (end_row, r);
2650                                         end_col = Math.Max (end_col, c);
2651                                 }
2652                         }
2653                         
2654                         // Mark rows/columns in between selected cells as included if the selection mode isn't FullHeaderSelect.
2655                         switch (selectionMode){
2656                         case DataGridViewSelectionMode.CellSelect:
2657                         case DataGridViewSelectionMode.ColumnHeaderSelect:
2658                         case DataGridViewSelectionMode.RowHeaderSelect:
2659                                 if (selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect) {
2660                                         for (int r = start_row; r <= end_row; r++) {
2661                                                 included_rows.Set (r, true);
2662                                         }
2663                                 } else if (start_row <= end_row) {
2664                                         included_rows.SetAll (true);
2665                                 }
2666                                 if (selectionMode != DataGridViewSelectionMode.RowHeaderSelect) {
2667                                         for (int c = start_col; c <= end_col; c++) {
2668                                                 included_cols.Set (c, true);
2669                                         }
2670                                 }
2671                                 break;
2672                         case DataGridViewSelectionMode.FullColumnSelect:
2673                         case DataGridViewSelectionMode.FullRowSelect:
2674                                 only_included_headers = true;
2675                                 break;
2676                         }
2677                         
2678                         if (start_row > end_row)
2679                                 return null;
2680                                 
2681                         if (start_col > end_col)
2682                                 return null;
2683                         
2684                         DataObject result = new DataObject ();
2685                         
2686                         StringBuilder text_builder = new StringBuilder ();
2687                         StringBuilder utext_builder = new StringBuilder ();
2688                         StringBuilder html_builder = new StringBuilder ();
2689                         StringBuilder csv_builder = new StringBuilder ();
2690                         
2691                         // Loop through all rows and columns to create the content.
2692                         // -1 is the header row/column.
2693                         int first_row = start_row;
2694                         int first_col = start_col;
2695                         if (include_col_headers) {
2696                                 first_row = -1;
2697                         }
2698                         for (int r = first_row; r <= end_row; r++) {
2699                                 DataGridViewRow row = null;
2700                                 
2701                                 if (r >= 0) {
2702                                         if (!included_rows [r])
2703                                                 continue;
2704                                                 
2705                                         row = Rows [r];
2706                                 }
2707
2708                                 if (include_row_headers) {
2709                                         first_col = -1;
2710                                 }
2711                                 
2712                                 for (int c = first_col; c <= end_col; c++) {
2713                                         DataGridViewCell cell = null;
2714
2715                                         if (c >= 0 && only_included_headers && !included_cols [c])
2716                                                 continue;
2717                                 
2718                                         if (row == null) {
2719                                                 if (c == -1) {
2720                                                         cell = TopLeftHeaderCell;
2721                                                 } else {
2722                                                         cell = Columns [c].HeaderCell;
2723                                                 }
2724                                         } else {
2725                                                 if (c == -1) {
2726                                                         cell = row.HeaderCell;
2727                                                 } else {
2728                                                         cell = row.Cells [c];
2729                                                 }
2730                                         }
2731                                 
2732                                         string text, utext, html, csv;
2733                                         bool is_first_cell = (c == first_col);
2734                                         bool is_last_cell = (c == end_col);
2735                                         bool is_first_row = (r == first_row);
2736                                         bool is_last_row = (r == end_row);
2737                                         
2738                                         if (cell == null) {
2739                                                 text = string.Empty;
2740                                                 utext = string.Empty;
2741                                                 html = string.Empty;
2742                                                 csv = string.Empty;
2743                                         } else {
2744                                                 text = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.Text) as string;
2745                                                 utext = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.UnicodeText) as string;
2746                                                 html = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.Html) as string;
2747                                                 csv = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.CommaSeparatedValue) as string;
2748                                         }
2749                                         
2750                                         text_builder.Append (text);
2751                                         utext_builder.Append (utext);
2752                                         html_builder.Append (html);
2753                                         csv_builder.Append (csv);
2754                                         
2755                                         if (c == -1) { // If we just did the row header, jump to the first column.
2756                                                 c = start_col - 1;
2757                                         }
2758                                 }
2759
2760                                 if (r == -1) {// If we just did the column header, jump to the first row.
2761                                         r = start_row - 1;
2762                                 }
2763                         }
2764
2765                         // 
2766                         // Html content always get the \r\n newline
2767                         // It's valid html anyway, and it eases testing quite a bit
2768                         // (since otherwise we'd have to change the start indices
2769                         // in the added prologue/epilogue text)
2770                         // 
2771                         int fragment_end = 135 + html_builder.Length;
2772                         int html_end = fragment_end + 36;
2773                         string html_start =
2774                         "Version:1.0{0}" +
2775                         "StartHTML:00000097{0}" +
2776                         "EndHTML:{1:00000000}{0}" +
2777                         "StartFragment:00000133{0}" +
2778                         "EndFragment:{2:00000000}{0}" +
2779                         "<HTML>{0}" +
2780                         "<BODY>{0}" +
2781                         "<!--StartFragment-->";
2782                         
2783                         html_start = string.Format (html_start, "\r\n", html_end, fragment_end);
2784                         html_builder.Insert (0, html_start);
2785                         html_builder.AppendFormat ("{0}<!--EndFragment-->{0}</BODY>{0}</HTML>", "\r\n");
2786                         
2787                         result.SetData (DataFormats.CommaSeparatedValue, false, csv_builder.ToString ());
2788                         result.SetData (DataFormats.Html, false, html_builder.ToString ());
2789                         result.SetData (DataFormats.UnicodeText, false, utext_builder.ToString ());
2790                         result.SetData (DataFormats.Text, false, text_builder.ToString ());
2791                         
2792                         return result;
2793                 }
2794
2795                 [MonoTODO ("Does not use cutOverflow parameter")]
2796                 public Rectangle GetColumnDisplayRectangle (int columnIndex, bool cutOverflow)
2797                 {
2798                         if (columnIndex < 0 || columnIndex > Columns.Count - 1)
2799                                 throw new ArgumentOutOfRangeException ("columnIndex");
2800                                 
2801                         int x = 0;
2802                         int w = 0;
2803
2804                         x = BorderWidth;
2805
2806                         if (RowHeadersVisible)
2807                                 x += RowHeadersWidth;
2808
2809                         List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2810
2811                         for (int i = first_col_index; i < cols.Count; i++) {
2812                                 if (!cols[i].Visible)
2813                                         continue;
2814                                         
2815                                 if (cols[i].Index == columnIndex) {
2816                                         w = cols[i].Width;
2817                                         break;
2818                                 }
2819
2820                                 x += cols[i].Width;
2821                         }
2822
2823                         return new Rectangle (x, 0, w, Height);
2824                 }
2825
2826                 [MonoTODO ("Does not use cutOverflow parameter")]
2827                 public Rectangle GetRowDisplayRectangle (int rowIndex, bool cutOverflow)
2828                 {
2829                         if (rowIndex < 0 || rowIndex > Rows.Count - 1)
2830                                 throw new ArgumentOutOfRangeException ("rowIndex");
2831
2832                         int y = 0;
2833                         int h = 0;
2834
2835                         y = BorderWidth;
2836
2837                         if (ColumnHeadersVisible)
2838                                 y += ColumnHeadersHeight;
2839
2840
2841                         for (int i = first_row_index; i < Rows.Count; i++) {
2842                                 if (!rows[i].Visible)
2843                                         continue;
2844                                         
2845                                 if (rows[i].Index == rowIndex) {
2846                                         h = rows [i].Height;
2847                                         break;
2848                                 }
2849                                 
2850                                 y += rows [i].Height;
2851                         }
2852
2853                         return new Rectangle (0, y, Width, h);
2854                 }
2855
2856                 public HitTestInfo HitTest (int x, int y) {
2857                         ///////////////////////////////////////////////////////
2858                         //Console.WriteLine ("HitTest ({0}, {1})", x, y);
2859                         bool isInColHeader = columnHeadersVisible && y >= 0 && y <= ColumnHeadersHeight;
2860                         bool isInRowHeader = rowHeadersVisible && x >= 0 && x <= RowHeadersWidth;
2861                         
2862                         // TopLeftHeader
2863                         if (isInColHeader && isInRowHeader)
2864                                 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.TopLeftHeader);
2865                         
2866                         // HorizontalScrollBar
2867                         if (horizontalScrollBar.Visible && horizontalScrollBar.Bounds.Contains (x, y))
2868                                 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.HorizontalScrollBar);
2869
2870                         // VerticalScrollBar
2871                         if (verticalScrollBar.Visible && verticalScrollBar.Bounds.Contains (x, y))
2872                                 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.VerticalScrollBar);
2873                         
2874                         // The little box in the bottom right if both scrollbars are shown is None
2875                         if (verticalScrollBar.Visible && horizontalScrollBar.Visible)
2876                                 if (new Rectangle (verticalScrollBar.Left, horizontalScrollBar.Top, verticalScrollBar.Width, horizontalScrollBar.Height).Contains (x, y))
2877                                         return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.None);
2878                         
2879                         int rowindex = -1;
2880                         int colindex = -1;
2881                         
2882                         int top = columnHeadersVisible ? columnHeadersHeight : 0;
2883                         
2884                         for (int i = first_row_index; i < Rows.Count; i++) {
2885                                 DataGridViewRow row = Rows[i];
2886                                 if (!row.Visible)
2887                                         continue;
2888                                 
2889                                 if (y > top && y <= (top + row.Height)) {
2890                                         rowindex = i;
2891                                         break;
2892                                 }
2893                                 
2894                                 top += row.Height;
2895                         }
2896                         
2897                         int left = rowHeadersVisible ? RowHeadersWidth : 0;
2898
2899                         List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2900                         
2901                         for (int i = first_col_index; i < cols.Count; i++) {
2902                                 if (!cols[i].Visible)
2903                                         continue;
2904                                         
2905                                 if (x > left && x <= (left + cols[i].Width)) {
2906                                         colindex = cols[i].Index;
2907                                         break;
2908                                 }
2909
2910                                 left += cols[i].Width;
2911                         }
2912
2913                         if (colindex >= 0 && rowindex >= 0)
2914                                 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.Cell);
2915                         
2916                         if (isInColHeader && colindex > -1)
2917                                 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.ColumnHeader);
2918                         
2919                         if (isInRowHeader && rowindex > -1)
2920                                 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.RowHeader);
2921                                 
2922                         return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.None);
2923                 }
2924
2925                 public void InvalidateCell (DataGridViewCell dataGridViewCell)
2926                 {
2927                         if (dataGridViewCell == null)
2928                                 throw new ArgumentNullException ("Cell is null");
2929
2930                         if (dataGridViewCell.DataGridView != this)
2931                                 throw new ArgumentException ("The specified cell does not belong to this DataGridView.");
2932
2933                         InvalidateCell (dataGridViewCell.ColumnIndex, dataGridViewCell.RowIndex);
2934                 }
2935
2936                 public void InvalidateCell (int columnIndex, int rowIndex)
2937                 {
2938                         // Allow the header column (columnIndex == -1).
2939                         if (columnIndex < -1 || columnIndex >= columns.Count)
2940                                 throw new ArgumentOutOfRangeException ("Column index is out of range.");
2941
2942                         // Allow the header row (rowIndex == -1).
2943                         if (rowIndex < -1 || rowIndex >= rows.Count)
2944                                 throw new ArgumentOutOfRangeException ("Row index is out of range.");
2945
2946                         if (!is_binding)
2947                                 Invalidate (GetCellDisplayRectangle (columnIndex, rowIndex, true));
2948                 }
2949
2950                 public void InvalidateColumn (int columnIndex)
2951                 {
2952                         if (columnIndex < 0 || columnIndex >= columns.Count)
2953                                 throw new ArgumentOutOfRangeException ("Column index is out of range.");
2954
2955                         if (!is_binding)
2956                                 Invalidate (GetColumnDisplayRectangle (columnIndex, true));
2957                 }
2958
2959                 public void InvalidateRow (int rowIndex)
2960                 {
2961                         if (rowIndex < 0 || rowIndex >= rows.Count)
2962                                 throw new ArgumentOutOfRangeException ("Row index is out of range.");
2963
2964                         if (!is_binding)
2965                                 Invalidate (GetRowDisplayRectangle (rowIndex, true));
2966                 }
2967
2968                 public virtual void NotifyCurrentCellDirty (bool dirty) {
2969                         if (currentCell != null)
2970                                 InvalidateCell (currentCell);
2971                 }
2972
2973                 public bool RefreshEdit ()
2974                 {
2975                         if (IsCurrentCellInEditMode) {
2976                                 currentCell.InitializeEditingControl (currentCell.RowIndex, currentCell.FormattedValue, currentCell.InheritedStyle);
2977                                 return true;
2978                         }
2979                         
2980                         return false;
2981                 }
2982
2983                 [EditorBrowsable (EditorBrowsableState.Never)]
2984                 public override void ResetText ()
2985                 {
2986                         Text = string.Empty;
2987                 }
2988
2989                 public void SelectAll () {
2990                         switch (selectionMode) {
2991                                 case DataGridViewSelectionMode.FullRowSelect:
2992                                         foreach (DataGridViewRow row in rows) {
2993                                                 (row as DataGridViewBand).Selected = true;
2994                                         }
2995                                         break;
2996                                 case DataGridViewSelectionMode.FullColumnSelect:
2997                                         foreach (DataGridViewColumn col in columns) {
2998                                                 (col as DataGridViewBand).Selected = true;
2999                                         }
3000                                         break;
3001                                 default:
3002                                         foreach (DataGridViewRow row in rows) {
3003                                                 foreach (DataGridViewCell cell in row.Cells) {
3004                                                         cell.Selected = true;
3005                                                 }
3006                                         }
3007                                         break;
3008                         }
3009                         
3010                         Invalidate ();
3011                 }
3012
3013                 public virtual void Sort (IComparer comparer)
3014                 {
3015                         if (comparer == null)
3016                                 throw new ArgumentNullException ("comparer");
3017                         if (VirtualMode || DataSource != null)
3018                                 throw new InvalidOperationException ();
3019
3020                         if (SortedColumn != null)
3021                                 SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
3022
3023                         EndEdit ();
3024
3025                         Rows.Sort (comparer);
3026                         
3027                         sortedColumn = null;
3028                         sortOrder = SortOrder.None;
3029                         
3030                         currentCell = null;
3031                         
3032                         Invalidate ();
3033                         
3034                         OnSorted (EventArgs.Empty);
3035                 }
3036
3037                 public virtual void Sort (DataGridViewColumn dataGridViewColumn, ListSortDirection direction)
3038                 {
3039                         if (dataGridViewColumn == null)
3040                                 throw new ArgumentNullException ("dataGridViewColumn");
3041                         if (dataGridViewColumn.DataGridView != this)
3042                                 throw new ArgumentException ("dataGridViewColumn");
3043
3044                         if (!EndEdit ())
3045                                 return;
3046
3047                         if (SortedColumn != null)
3048                                 SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
3049
3050                         sortedColumn = dataGridViewColumn;
3051                         sortOrder = direction == ListSortDirection.Ascending ? SortOrder.Ascending : SortOrder.Descending;
3052                         
3053                         if (Rows.Count == 0)
3054                                 return;
3055
3056                         if (dataGridViewColumn.IsDataBound) {
3057                                 IBindingList bindingList = DataManager.List as IBindingList;
3058                                 if (bindingList != null && bindingList.SupportsSorting) {
3059                                         bindingList.ApplySort (DataManager.GetItemProperties()[dataGridViewColumn.DataPropertyName], direction);
3060                                         dataGridViewColumn.HeaderCell.SortGlyphDirection = sortOrder;
3061                                 }
3062                         } else {
3063                                 // Figure out if this is a numeric sort or text sort
3064                                 bool is_numeric = true;
3065                                 double n;
3066                                 
3067                                 foreach (DataGridViewRow row in Rows) {
3068                                         object val = row.Cells[dataGridViewColumn.Index].Value;
3069                                         
3070                                         if (val != null && !double.TryParse (val.ToString (), out n)) {
3071                                                 is_numeric = false;
3072                                                 break;
3073                                         }
3074                                 }
3075                                 
3076                                 ColumnSorter sorter = new ColumnSorter (dataGridViewColumn, direction, is_numeric);
3077                                 Rows.Sort (sorter);
3078                                 dataGridViewColumn.HeaderCell.SortGlyphDirection = sortOrder;
3079                         }
3080
3081                         Invalidate ();
3082                         OnSorted (EventArgs.Empty);
3083                 }
3084                 
3085                 public void UpdateCellErrorText (int columnIndex, int rowIndex)
3086                 {
3087                         if (columnIndex < 0 || columnIndex > Columns.Count - 1)
3088                                 throw new ArgumentOutOfRangeException ("columnIndex");
3089                         if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3090                                 throw new ArgumentOutOfRangeException ("rowIndex");
3091
3092                         InvalidateCell (columnIndex, rowIndex);
3093                 }
3094
3095                 public void UpdateCellValue (int columnIndex, int rowIndex)
3096                 {
3097                         if (columnIndex < 0 || columnIndex > Columns.Count - 1)
3098                                 throw new ArgumentOutOfRangeException ("columnIndex");
3099                         if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3100                                 throw new ArgumentOutOfRangeException ("rowIndex");
3101                         
3102                         InvalidateCell (columnIndex, rowIndex);
3103                 }
3104
3105                 public void UpdateRowErrorText (int rowIndex)
3106                 {
3107                         if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3108                                 throw new ArgumentOutOfRangeException ("rowIndex");
3109
3110                         InvalidateRow (rowIndex);
3111                 }
3112
3113                 public void UpdateRowErrorText (int rowIndexStart, int rowIndexEnd)
3114                 {
3115                         if (rowIndexStart < 0 || rowIndexStart > Rows.Count - 1)
3116                                 throw new ArgumentOutOfRangeException ("rowIndexStart");
3117                         if (rowIndexEnd < 0 || rowIndexEnd > Rows.Count - 1)
3118                                 throw new ArgumentOutOfRangeException ("rowIndexEnd");
3119                         if (rowIndexEnd < rowIndexStart)
3120                                 throw new ArgumentOutOfRangeException ("rowIndexEnd", "rowIndexEnd must be greater than rowIndexStart");
3121                                 
3122                         for (int i = rowIndexStart; i <= rowIndexEnd; i++)
3123                                 InvalidateRow (i);
3124                 }
3125
3126                 public void UpdateRowHeightInfo (int rowIndex, bool updateToEnd)
3127                 {
3128                         if (rowIndex < 0 && updateToEnd)
3129                                 throw new ArgumentOutOfRangeException ("rowIndex");
3130                         if (rowIndex < -1 && !updateToEnd)
3131                                 throw new ArgumentOutOfRangeException ("rowIndex");
3132                         if (rowIndex >= Rows.Count)
3133                                 throw new ArgumentOutOfRangeException ("rowIndex");
3134                         
3135                         if (!VirtualMode && DataManager == null)
3136                                 return;
3137
3138                         if (rowIndex == -1) {
3139                                 updateToEnd = true;
3140                                 rowIndex = 0;
3141                         }
3142
3143                         if (updateToEnd) {
3144                                 for (int i = rowIndex; i < Rows.Count; i++) {
3145                                         DataGridViewRow row = Rows[i];
3146                                         if (!row.Visible)
3147                                                 continue;
3148
3149                                         DataGridViewRowHeightInfoNeededEventArgs rowInfo = 
3150                                                 new DataGridViewRowHeightInfoNeededEventArgs (row.Index, row.Height, row.MinimumHeight);
3151                                         OnRowHeightInfoNeeded (rowInfo);
3152
3153                                         if (row.Height != rowInfo.Height || row.MinimumHeight != rowInfo.MinimumHeight) {
3154                                                 row.Height = rowInfo.Height;
3155                                                 row.MinimumHeight = rowInfo.MinimumHeight;
3156                                                 OnRowHeightInfoPushed (new DataGridViewRowHeightInfoPushedEventArgs (row.Index, rowInfo.Height, 
3157                                                                                                                      rowInfo.MinimumHeight));
3158                                         }
3159                                 }
3160                         } else {
3161                                 DataGridViewRow row = Rows[rowIndex];
3162                                 DataGridViewRowHeightInfoNeededEventArgs rowInfo = 
3163                                         new DataGridViewRowHeightInfoNeededEventArgs (row.Index, row.Height, row.MinimumHeight);
3164                                 OnRowHeightInfoNeeded (rowInfo);
3165
3166                                 if (row.Height != rowInfo.Height || row.MinimumHeight != rowInfo.MinimumHeight) {
3167                                         row.Height = rowInfo.Height;
3168                                         row.MinimumHeight = rowInfo.MinimumHeight;
3169                                         OnRowHeightInfoPushed (new DataGridViewRowHeightInfoPushedEventArgs (row.Index, rowInfo.Height, 
3170                                                                                                              rowInfo.MinimumHeight));
3171                                 }
3172                         }
3173                 }
3174
3175                 protected override bool CanEnableIme {
3176                         get {
3177                                 if (CurrentCell != null && CurrentCell.EditType != null)
3178                                         return true;
3179                                 
3180                                 return false;
3181                         }
3182                 }
3183
3184                 protected override Size DefaultSize {
3185                         get { return new Size (240, 150); }
3186                 }
3187
3188                 protected ScrollBar HorizontalScrollBar {
3189                         get { return horizontalScrollBar; }
3190                 }
3191
3192                 protected ScrollBar VerticalScrollBar {
3193                         get { return verticalScrollBar; }
3194                 }
3195
3196                 protected virtual void AccessibilityNotifyCurrentCellChanged (Point cellAddress)
3197                 {
3198                         throw new NotImplementedException ();
3199                 }
3200
3201                 [MonoTODO ("Does not use fixedHeight parameter")]
3202                 protected void AutoResizeColumn (int columnIndex, DataGridViewAutoSizeColumnMode autoSizeColumnMode, bool fixedHeight)
3203                 {
3204                         AutoResizeColumn (columnIndex, autoSizeColumnMode);
3205                 }
3206
3207                 [MonoTODO ("Does not use fixedRowHeadersWidth or fixedColumnsWidth parameters")]
3208                 protected void AutoResizeColumnHeadersHeight (bool fixedRowHeadersWidth, bool fixedColumnsWidth)
3209                 {
3210                         AutoResizeColumnHeadersHeight ();
3211                 }
3212
3213                 [MonoTODO ("Does not use columnIndex or fixedRowHeadersWidth or fixedColumnsWidth parameters")]
3214                 protected void AutoResizeColumnHeadersHeight (int columnIndex, bool fixedRowHeadersWidth, bool fixedColumnWidth)
3215                 {
3216                         AutoResizeColumnHeadersHeight (columnIndex);
3217                 }
3218
3219                 protected void AutoResizeColumns (DataGridViewAutoSizeColumnsMode autoSizeColumnsMode, bool fixedHeight) {
3220                         for (int i = 0; i < Columns.Count; i++) {
3221                                 AutoResizeColumn (i, (DataGridViewAutoSizeColumnMode) autoSizeColumnsMode, fixedHeight);
3222                         }
3223                 }
3224
3225                 [MonoTODO ("Does not use fixedWidth parameter")]
3226                 protected void AutoResizeRow (int rowIndex, DataGridViewAutoSizeRowMode autoSizeRowMode, bool fixedWidth)
3227                 {
3228                         if (autoSizeRowMode == DataGridViewAutoSizeRowMode.RowHeader && !rowHeadersVisible)
3229                                 throw new InvalidOperationException ("row headers are not visible");
3230                         if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3231                                 throw new ArgumentOutOfRangeException ("rowIndex");
3232
3233                         DataGridViewRow row = GetRowInternal (rowIndex);
3234
3235                         int new_height = row.GetPreferredHeight (rowIndex, autoSizeRowMode, true);
3236
3237                         if (row.Height != new_height)
3238                                 row.SetAutoSizeHeight (new_height);
3239                 }
3240
3241                 [MonoTODO ("Does not use fixedColumnHeadersHeight or fixedRowsHeight parameter")]
3242                 protected void AutoResizeRowHeadersWidth (DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode, bool fixedColumnHeadersHeight, bool fixedRowsHeight)
3243                 {
3244                         AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
3245                 }
3246
3247                 [MonoTODO ("Does not use rowIndex or fixedColumnHeadersHeight or fixedRowsHeight parameter")]
3248                 protected void AutoResizeRowHeadersWidth (int rowIndex, DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode, bool fixedColumnHeadersHeight, bool fixedRowHeight)
3249                 {
3250                         AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
3251                 }
3252
3253                 [MonoTODO ("Does not use fixedWidth parameter")]
3254                 protected void AutoResizeRows (DataGridViewAutoSizeRowsMode autoSizeRowsMode, bool fixedWidth)
3255                 {
3256                         if (autoSizeRowsMode == DataGridViewAutoSizeRowsMode.None)
3257                                 return;
3258                                 
3259                         bool displayed_only = false;
3260                         DataGridViewAutoSizeRowMode mode = DataGridViewAutoSizeRowMode.AllCells;
3261                         
3262                         switch (autoSizeRowsMode) {
3263                                 case DataGridViewAutoSizeRowsMode.AllHeaders:
3264                                         mode = DataGridViewAutoSizeRowMode.RowHeader;
3265                                         break;
3266                                 case DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders:
3267                                         mode = DataGridViewAutoSizeRowMode.AllCellsExceptHeader;
3268                                         break;
3269                                 case DataGridViewAutoSizeRowsMode.AllCells:
3270                                         mode = DataGridViewAutoSizeRowMode.AllCells;
3271                                         break;
3272                                 case DataGridViewAutoSizeRowsMode.DisplayedHeaders:
3273                                         mode = DataGridViewAutoSizeRowMode.RowHeader;
3274                                         displayed_only = true;
3275                                         break;
3276                                 case DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders:
3277                                         mode = DataGridViewAutoSizeRowMode.AllCellsExceptHeader;
3278                                         displayed_only = true;
3279                                         break;
3280                                 case DataGridViewAutoSizeRowsMode.DisplayedCells:
3281                                         mode = DataGridViewAutoSizeRowMode.AllCells;
3282                                         displayed_only = true;
3283                                         break;
3284                         }
3285                         
3286                         foreach (DataGridViewRow row in Rows) {
3287                                 if (!row.Visible)
3288                                         continue;
3289                                 if (!displayed_only || row.Displayed) {
3290                                         int new_height = row.GetPreferredHeight (row.Index, mode, fixedWidth);
3291
3292                                         if (row.Height != new_height)
3293                                                 row.SetAutoSizeHeight (new_height);
3294                                 }
3295                         }
3296                 }
3297
3298                 [MonoTODO ("Does not use fixedMode parameter")]
3299                 protected void AutoResizeRows (int rowIndexStart, int rowsCount, DataGridViewAutoSizeRowMode autoSizeRowMode, bool fixedWidth)
3300                 {
3301                         for (int i = rowIndexStart; i < rowIndexStart + rowsCount; i++)
3302                                 AutoResizeRow (i, autoSizeRowMode, fixedWidth);
3303                 }
3304
3305                 protected void ClearSelection (int columnIndexException, int rowIndexException, bool selectExceptionElement) {
3306                         if (columnIndexException >= columns.Count) {
3307                                 throw new ArgumentOutOfRangeException("ColumnIndexException is greater than the highest column index.");
3308                         }
3309                         if (selectionMode == DataGridViewSelectionMode.FullRowSelect) {
3310                                 if (columnIndexException < -1) {
3311                                         throw new ArgumentOutOfRangeException("ColumnIndexException is less than -1.");
3312                                 }
3313                         }
3314                         else {
3315                                 if (columnIndexException < 0) {
3316                                         throw new ArgumentOutOfRangeException("ColumnIndexException is less than 0.");
3317                                 }
3318                         }
3319                         if (rowIndexException >= rows.Count) {
3320                                 throw new ArgumentOutOfRangeException("RowIndexException is greater than the highest row index.");
3321                         }
3322                         if (selectionMode == DataGridViewSelectionMode.FullColumnSelect) {
3323                                 if (rowIndexException < -1) {
3324                                         throw new ArgumentOutOfRangeException("RowIndexException is less than -1.");
3325                                 }
3326                         }
3327                         else {
3328                                 if (rowIndexException < 0) {
3329                                         throw new ArgumentOutOfRangeException("RowIndexException is less than 0.");
3330                                 }
3331                         }
3332                         switch (selectionMode) {
3333                                 case DataGridViewSelectionMode.FullRowSelect:
3334                                         foreach (DataGridViewRow row in rows) {
3335                                                 if (selectExceptionElement && row.Index == rowIndexException) {
3336                                                         continue;
3337                                                 }
3338                                                 SetSelectedRowCore (row.Index, false);
3339                                         }
3340                                         break;
3341                                 case DataGridViewSelectionMode.FullColumnSelect:
3342                                         foreach (DataGridViewColumn col in columns) {
3343                                                 if (selectExceptionElement && col.Index == columnIndexException) {
3344                                                         continue;
3345                                                 }
3346                                                 SetSelectedColumnCore (col.Index, false);
3347                                         }
3348                                         break;
3349                                 default:
3350                                         foreach (DataGridViewCell cell in SelectedCells) {
3351                                                 if (selectExceptionElement && cell.RowIndex == rowIndexException && cell.ColumnIndex == columnIndexException) {
3352                                                         continue;
3353                                                 }
3354                                                 SetSelectedCellCore (cell.ColumnIndex, cell.RowIndex, false);
3355                                         }
3356                                         break;
3357                         }
3358                 }
3359
3360                 protected override AccessibleObject CreateAccessibilityInstance ()
3361                 {
3362                         return new DataGridViewAccessibleObject(this);
3363                 }
3364
3365                 [EditorBrowsable (EditorBrowsableState.Advanced)]
3366                 protected virtual DataGridViewColumnCollection CreateColumnsInstance ()
3367                 {
3368                         return new DataGridViewColumnCollection(this);
3369                 }
3370
3371                 protected override Control.ControlCollection CreateControlsInstance ()
3372                 {
3373                         return new DataGridViewControlCollection (this);
3374                 }
3375
3376                 [EditorBrowsable (EditorBrowsableState.Advanced)]
3377                 protected virtual DataGridViewRowCollection CreateRowsInstance ()
3378                 {
3379                         return new DataGridViewRowCollection(this);
3380                 }
3381
3382                 protected override void Dispose (bool disposing) {
3383                 }
3384
3385                 protected override AccessibleObject GetAccessibilityObjectById (int objectId)
3386                 {
3387                         throw new NotImplementedException();
3388                 }
3389
3390                 protected override bool IsInputChar (char charCode)
3391                 {
3392                         return true;
3393                 }
3394
3395                 protected override bool IsInputKey (Keys keyData)
3396                 {
3397                         // Don't look at the modifiers
3398                         keyData = keyData & ~Keys.Modifiers;
3399                         
3400                         switch (keyData) {
3401                                 case Keys.Return:
3402                                 case Keys.PageUp:
3403                                 case Keys.Next:
3404                                 case Keys.End:
3405                                 case Keys.Home:
3406                                 case Keys.Left:
3407                                 case Keys.Up:
3408                                 case Keys.Right:
3409                                 case Keys.Down:
3410                                 case Keys.Delete:
3411                                 case Keys.D0:
3412                                 case Keys.NumPad0:
3413                                 case Keys.F2:
3414                                         return true;
3415                         }
3416
3417                         return false;
3418                 }
3419
3420                 protected virtual void OnAllowUserToAddRowsChanged (EventArgs e)
3421                 {
3422                         EventHandler eh = (EventHandler)(Events [AllowUserToAddRowsChangedEvent]);
3423                         if (eh != null)
3424                                 eh (this, e);
3425                 }
3426
3427                 protected virtual void OnAllowUserToDeleteRowsChanged (EventArgs e)
3428                 {
3429                         EventHandler eh = (EventHandler)(Events [AllowUserToDeleteRowsChangedEvent]);
3430                         if (eh != null)
3431                                 eh (this, e);
3432                 }
3433
3434                 protected virtual void OnAllowUserToOrderColumnsChanged (EventArgs e)
3435                 {
3436                         EventHandler eh = (EventHandler)(Events [AllowUserToOrderColumnsChangedEvent]);
3437                         if (eh != null)
3438                                 eh (this, e);
3439                 }
3440
3441                 protected virtual void OnAllowUserToResizeColumnsChanged (EventArgs e)
3442                 {
3443                         EventHandler eh = (EventHandler)(Events [AllowUserToResizeColumnsChangedEvent]);
3444                         if (eh != null)
3445                                 eh (this, e);
3446                 }
3447
3448                 protected virtual void OnAllowUserToResizeRowsChanged (EventArgs e)
3449                 {
3450                         EventHandler eh = (EventHandler)(Events [AllowUserToResizeRowsChangedEvent]);
3451                         if (eh != null)
3452                                 eh (this, e);
3453                 }
3454
3455                 protected virtual void OnAlternatingRowsDefaultCellStyleChanged (EventArgs e)
3456                 {
3457                         EventHandler eh = (EventHandler)(Events [AlternatingRowsDefaultCellStyleChangedEvent]);
3458                         if (eh != null)
3459                                 eh (this, e);
3460                 }
3461
3462                 protected virtual void OnAutoGenerateColumnsChanged (EventArgs e)
3463                 {
3464                         EventHandler eh = (EventHandler)(Events [AutoGenerateColumnsChangedEvent]);
3465                         if (eh != null)
3466                                 eh (this, e);
3467                 }
3468
3469                 protected internal virtual void OnAutoSizeColumnModeChanged (DataGridViewAutoSizeColumnModeEventArgs e)
3470                 {
3471                         DataGridViewAutoSizeColumnModeEventHandler eh = (DataGridViewAutoSizeColumnModeEventHandler)(Events [AutoSizeColumnModeChangedEvent]);
3472                         if (eh != null)
3473                                 eh (this, e);
3474                 }
3475
3476                 protected virtual void OnAutoSizeColumnsModeChanged (DataGridViewAutoSizeColumnsModeEventArgs e)
3477                 {
3478                         DataGridViewAutoSizeColumnsModeEventHandler eh = (DataGridViewAutoSizeColumnsModeEventHandler)(Events [AutoSizeColumnsModeChangedEvent]);
3479                         if (eh != null)
3480                                 eh (this, e);
3481                 }
3482
3483                 protected virtual void OnAutoSizeRowsModeChanged (DataGridViewAutoSizeModeEventArgs e)
3484                 {
3485                         DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [AutoSizeRowsModeChangedEvent]);
3486                         if (eh != null)
3487                                 eh (this, e);
3488                 }
3489
3490                 protected virtual void OnBackgroundColorChanged (EventArgs e)
3491                 {
3492                         EventHandler eh = (EventHandler)(Events [BackgroundColorChangedEvent]);
3493                         if (eh != null)
3494                                 eh (this, e);
3495                 }
3496
3497                 protected override void OnBindingContextChanged (EventArgs e)
3498                 {
3499                         base.OnBindingContextChanged(e);
3500                         ReBind();
3501                 }
3502
3503                 protected virtual void OnBorderStyleChanged (EventArgs e)
3504                 {
3505                         EventHandler eh = (EventHandler)(Events [BorderStyleChangedEvent]);
3506                         if (eh != null)
3507                                 eh (this, e);
3508                 }
3509
3510                 protected virtual void OnCancelRowEdit (QuestionEventArgs e) {
3511                         QuestionEventHandler eh = (QuestionEventHandler)(Events [CancelRowEditEvent]);
3512                         if (eh != null)
3513                                 eh (this, e);
3514                 }
3515
3516                 protected virtual void OnCellBeginEdit (DataGridViewCellCancelEventArgs e)
3517                 {
3518                         DataGridViewCellCancelEventHandler eh = (DataGridViewCellCancelEventHandler)(Events [CellBeginEditEvent]);
3519                         if (eh != null)
3520                                 eh (this, e);
3521                 }
3522
3523                 protected virtual void OnCellBorderStyleChanged (EventArgs e)
3524                 {
3525                         EventHandler eh = (EventHandler)(Events [CellBorderStyleChangedEvent]);
3526                         if (eh != null)
3527                                 eh (this, e);
3528                 }
3529
3530                 protected virtual void OnCellClick (DataGridViewCellEventArgs e)
3531                 {
3532                         DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3533
3534                         cell.OnClickInternal (e);
3535         
3536                         DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellClickEvent]);
3537                         if (eh != null)
3538                                 eh (this, e);
3539                 }
3540
3541                 protected virtual void OnCellContentClick (DataGridViewCellEventArgs e)
3542                 {
3543                         DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3544
3545                         cell.OnContentClickInternal (e);
3546                         
3547                         DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContentClickEvent]);
3548                         if (eh != null)
3549                                 eh (this, e);
3550                 }
3551
3552                 protected virtual void OnCellContentDoubleClick (DataGridViewCellEventArgs e)
3553                 {
3554                         DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3555
3556                         cell.OnContentDoubleClickInternal (e);
3557                         
3558                         DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContentDoubleClickEvent]);
3559                         if (eh != null)
3560                                 eh (this, e);
3561                 }
3562
3563                 protected virtual void OnCellContextMenuStripChanged (DataGridViewCellEventArgs e)
3564                 {
3565                         DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContextMenuStripChangedEvent]);
3566                         if (eh != null)
3567                                 eh (this, e);
3568                 }
3569
3570                 protected virtual void OnCellContextMenuStripNeeded (DataGridViewCellContextMenuStripNeededEventArgs e)
3571                 {
3572                         DataGridViewCellContextMenuStripNeededEventHandler eh = (DataGridViewCellContextMenuStripNeededEventHandler)(Events [CellContextMenuStripNeededEvent]);
3573                         if (eh != null)
3574                                 eh (this, e);
3575                 }
3576
3577                 protected virtual void OnCellDoubleClick (DataGridViewCellEventArgs e)
3578                 {
3579                         DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3580
3581                         cell.OnDoubleClickInternal (e);
3582                         DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellDoubleClickEvent]);
3583                         if (eh != null)
3584                                 eh (this, e);
3585                 }
3586
3587                 protected virtual void OnCellEndEdit (DataGridViewCellEventArgs e)
3588                 {
3589                         DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellEndEditEvent]);
3590                         if (eh != null)
3591                                 eh (this, e);
3592                 }
3593
3594                 protected virtual void OnCellEnter (DataGridViewCellEventArgs e)
3595                 {
3596                         DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3597                         cell.OnEnterInternal (e.RowIndex, true);
3598
3599                         DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellEnterEvent]);
3600                         if (eh != null)
3601                                 eh (this, e);
3602                 }
3603
3604                 protected internal virtual void OnCellErrorTextChanged (DataGridViewCellEventArgs e)
3605                 {
3606                         DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellErrorTextChangedEvent]);
3607                         if (eh != null)
3608                                 eh (this, e);
3609                 }
3610
3611                 protected virtual void OnCellErrorTextNeeded (DataGridViewCellErrorTextNeededEventArgs e)
3612                 {
3613                         DataGridViewCellErrorTextNeededEventHandler eh = (DataGridViewCellErrorTextNeededEventHandler)(Events [CellErrorTextNeededEvent]);
3614                         if (eh != null)
3615                                 eh (this, e);
3616                 }
3617
3618                 internal void OnCellFormattingInternal (DataGridViewCellFormattingEventArgs e)
3619                 {
3620                         OnCellFormatting (e);
3621                 }
3622
3623                 protected virtual void OnCellFormatting (DataGridViewCellFormattingEventArgs e)
3624                 {
3625                         DataGridViewCellFormattingEventHandler eh = (DataGridViewCellFormattingEventHandler)(Events [CellFormattingEvent]);
3626                         if (eh != null)
3627                                 eh (this, e);
3628                 }
3629
3630                 protected virtual void OnCellLeave (DataGridViewCellEventArgs e)
3631                 {
3632                         DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3633                         cell.OnLeaveInternal (e.RowIndex, true);
3634
3635                         DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellLeaveEvent]);
3636                         if (eh != null)
3637                                 eh (this, e);
3638                 }
3639
3640                 protected virtual void OnCellMouseClick (DataGridViewCellMouseEventArgs e)
3641                 {
3642                         DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3643
3644                         cell.OnMouseClickInternal (e);
3645                         
3646                         DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseClickEvent]);
3647                         if (eh != null)
3648                                 eh (this, e);
3649                 }
3650
3651                 protected virtual void OnCellMouseDoubleClick (DataGridViewCellMouseEventArgs e)
3652                 {
3653                         DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3654
3655                         cell.OnMouseDoubleClickInternal (e);
3656                         
3657                         DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseDoubleClickEvent]);
3658                         if (eh != null)
3659                                 eh (this, e);
3660                 }
3661
3662                 protected virtual void OnCellMouseDown (DataGridViewCellMouseEventArgs e)
3663                 {
3664
3665                         DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3666
3667                         cell.OnMouseDownInternal (e);
3668                         
3669                         DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseDownEvent]);
3670                         if (eh != null)
3671                                 eh (this, e);
3672                 }
3673
3674                 protected virtual void OnCellMouseEnter (DataGridViewCellEventArgs e)
3675                 {
3676                         DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3677
3678                         cell.OnMouseEnterInternal (e.RowIndex);
3679                         
3680                         DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellMouseEnterEvent]);
3681                         if (eh != null)
3682                                 eh (this, e);
3683                 }
3684
3685                 protected virtual void OnCellMouseLeave (DataGridViewCellEventArgs e)
3686                 {
3687                         DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3688
3689                         cell.OnMouseLeaveInternal (e.RowIndex);
3690                         
3691                         DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellMouseLeaveEvent]);
3692                         if (eh != null)
3693                                 eh (this, e);
3694                 }
3695
3696                 protected virtual void OnCellMouseMove (DataGridViewCellMouseEventArgs e)
3697                 {
3698                         DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3699                         
3700                         cell.OnMouseMoveInternal (e);
3701                 
3702                         DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseMoveEvent]);
3703                         if (eh != null)
3704                                 eh (this, e);
3705                 }
3706
3707                 protected virtual void OnCellMouseUp (DataGridViewCellMouseEventArgs e)
3708                 {
3709                         DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3710
3711                         cell.OnMouseUpInternal (e);
3712                         
3713                         DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseUpEvent]);
3714                         if (eh != null)
3715                                 eh (this, e);
3716                 }
3717
3718                 internal void OnCellPaintingInternal (DataGridViewCellPaintingEventArgs e)
3719                 {
3720                         OnCellPainting (e);
3721                 }
3722
3723                 protected virtual void OnCellPainting (DataGridViewCellPaintingEventArgs e)
3724                 {
3725                         DataGridViewCellPaintingEventHandler eh = (DataGridViewCellPaintingEventHandler)(Events [CellPaintingEvent]);
3726                         if (eh != null)
3727                                 eh (this, e);
3728                 }
3729
3730                 protected internal virtual void OnCellParsing (DataGridViewCellParsingEventArgs e)
3731                 {
3732                         DataGridViewCellParsingEventHandler eh = (DataGridViewCellParsingEventHandler)(Events [CellParsingEvent]);
3733                         if (eh != null)
3734                                 eh (this, e);
3735                 }
3736
3737                 internal void OnCellStateChangedInternal (DataGridViewCellStateChangedEventArgs e) {
3738                         this.OnCellStateChanged (e);
3739                 }
3740
3741                 protected virtual void OnCellStateChanged (DataGridViewCellStateChangedEventArgs e)
3742                 {
3743                         DataGridViewCellStateChangedEventHandler eh = (DataGridViewCellStateChangedEventHandler)(Events [CellStateChangedEvent]);
3744                         if (eh != null)
3745                                 eh (this, e);
3746                 }
3747
3748                 protected virtual void OnCellStyleChanged (DataGridViewCellEventArgs e)
3749                 {
3750                         DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellStyleChangedEvent]);
3751                         if (eh != null)
3752                                 eh (this, e);
3753                 }
3754
3755                 protected virtual void OnCellStyleContentChanged (DataGridViewCellStyleContentChangedEventArgs e) {
3756                         DataGridViewCellStyleContentChangedEventHandler eh = (DataGridViewCellStyleContentChangedEventHandler)(Events [CellStyleContentChangedEvent]);
3757                         if (eh != null)
3758                                 eh (this, e);
3759                 }
3760
3761                 protected virtual void OnCellToolTipTextChanged (DataGridViewCellEventArgs e) {
3762                         DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellToolTipTextChangedEvent]);
3763                         if (eh != null)
3764                                 eh (this, e);
3765                 }
3766
3767                 protected virtual void OnCellToolTipTextNeeded (DataGridViewCellToolTipTextNeededEventArgs e)
3768                 {
3769                         DataGridViewCellToolTipTextNeededEventHandler eh = (DataGridViewCellToolTipTextNeededEventHandler)(Events [CellToolTipTextNeededEvent]);
3770                         if (eh != null)
3771                                 eh (this, e);
3772                 }
3773
3774                 protected virtual void OnCellValidated (DataGridViewCellEventArgs e)
3775                 {
3776                         DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellValidatedEvent]);
3777                         if (eh != null)
3778                                 eh (this, e);
3779                 }
3780
3781                 protected virtual void OnCellValidating (DataGridViewCellValidatingEventArgs e)
3782                 {
3783                         DataGridViewCellValidatingEventHandler eh = (DataGridViewCellValidatingEventHandler)(Events [CellValidatingEvent]);
3784                         if (eh != null)
3785                                 eh (this, e);
3786                 }
3787
3788                 protected virtual void OnCellValueChanged (DataGridViewCellEventArgs e)
3789                 {
3790                         DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellValueChangedEvent]);
3791                         if (eh != null)
3792                                 eh (this, e);
3793                 }
3794
3795                 protected internal virtual void OnCellValueNeeded (DataGridViewCellValueEventArgs e)
3796                 {
3797                         DataGridViewCellValueEventHandler eh = (DataGridViewCellValueEventHandler)(Events [CellValueNeededEvent]);
3798                         if (eh != null)
3799                                 eh (this, e);
3800                 }
3801
3802                 protected internal virtual void OnCellValuePushed (DataGridViewCellValueEventArgs e)
3803                 {
3804                         DataGridViewCellValueEventHandler eh = (DataGridViewCellValueEventHandler)(Events [CellValuePushedEvent]);
3805                         if (eh != null)
3806                                 eh (this, e);
3807                 }
3808
3809                 internal void OnColumnAddedInternal (DataGridViewColumnEventArgs e)
3810                 {
3811                         e.Column.DataColumnIndex = FindDataColumnIndex (e.Column);
3812
3813                         if (e.Column.CellTemplate != null) {
3814                                 // The first column has just been added programatically instead of 
3815                                 // autogenerated so we need to create the rows for the first time.
3816                                 //
3817                                 if (!is_autogenerating_columns && columns.Count == 1)
3818                                         ReBind ();
3819
3820                                 // Add/Remove/Update the cells in the existing rows
3821                                 foreach (DataGridViewRow row in Rows) {
3822                                         if (row.Index == NewRowIndex)
3823                                                 continue;
3824
3825                                         DataGridViewCell newCell = (DataGridViewCell)e.Column.CellTemplate.Clone ();
3826                                         if (row.Cells.Count == columns.Count) {
3827                                                 DataGridViewCell oldCell = row.Cells[e.Column.Index];
3828                                                 if (currentCell != null && oldCell == currentCell)
3829                                                         currentCell = newCell;
3830                                                 // copy the value only if the cell is not-databound
3831                                                 if (!e.Column.IsDataBound && oldCell.OwningRow.DataBoundItem == null)
3832                                                         newCell.Value = oldCell.Value;
3833                                                 row.Cells.Replace (e.Column.Index, newCell);
3834                                         } else if (e.Column.Index >= row.Cells.Count)
3835                                                 row.Cells.Add (newCell);
3836                                         else
3837                                                 row.Cells.Insert (e.Column.Index, newCell);
3838                                 }
3839                         }
3840                         
3841                         AutoResizeColumnsInternal ();
3842                         OnColumnAdded (e);
3843                         PrepareEditingRow (false, true);
3844                 }
3845
3846                 private int FindDataColumnIndex (DataGridViewColumn column)
3847                 {
3848                         if (column != null && DataManager != null) {
3849                                 PropertyDescriptorCollection properties = DataManager.GetItemProperties();
3850                                 for (int i = 0; i < properties.Count; i++) {
3851                                         if (String.Compare (column.DataPropertyName, properties[i].Name, true) == 0)
3852                                                 return i;
3853                                 }
3854                         }
3855
3856                         return -1;
3857                 }
3858
3859                 protected virtual void OnColumnAdded (DataGridViewColumnEventArgs e)
3860                 {
3861                         DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnAddedEvent]);
3862                         if (eh != null)
3863                                 eh (this, e);
3864                 }
3865
3866                 protected internal virtual void OnColumnContextMenuStripChanged (DataGridViewColumnEventArgs e)
3867                 {
3868                         DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnContextMenuStripChangedEvent]);
3869                         if (eh != null)
3870                                 eh (this, e);
3871                 }
3872
3873                 protected internal virtual void OnColumnDataPropertyNameChanged (DataGridViewColumnEventArgs e)
3874                 {
3875                         DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDataPropertyNameChangedEvent]);
3876                         if (eh != null)
3877                                 eh (this, e);
3878                 }
3879
3880                 protected internal virtual void OnColumnDefaultCellStyleChanged (DataGridViewColumnEventArgs e)
3881                 {
3882                         DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDefaultCellStyleChangedEvent]);
3883                         if (eh != null)
3884                                 eh (this, e);
3885                 }
3886
3887                 protected internal virtual void OnColumnDisplayIndexChanged (DataGridViewColumnEventArgs e)
3888                 {
3889                         DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDisplayIndexChangedEvent]);
3890                         if (eh != null)
3891                                 eh (this, e);
3892                 }
3893
3894                 protected virtual void OnColumnDividerDoubleClick (DataGridViewColumnDividerDoubleClickEventArgs e)
3895                 {
3896                         DataGridViewColumnDividerDoubleClickEventHandler eh = (DataGridViewColumnDividerDoubleClickEventHandler)(Events [ColumnDividerDoubleClickEvent]);
3897                         if (eh != null)
3898                                 eh (this, e);
3899                 }
3900
3901                 protected internal virtual void OnColumnDividerWidthChanged (DataGridViewColumnEventArgs e)
3902                 {
3903                         DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDividerWidthChangedEvent]);
3904                         if (eh != null)
3905                                 eh (this, e);
3906                 }
3907
3908                 protected internal virtual void OnColumnHeaderCellChanged (DataGridViewColumnEventArgs e)
3909                 {
3910                         DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnHeaderCellChangedEvent]);
3911                         if (eh != null)
3912                                 eh (this, e);
3913                 }
3914
3915                 protected virtual void OnColumnHeaderMouseClick (DataGridViewCellMouseEventArgs e)
3916                 {
3917                         DataGridViewColumn col = Columns[e.ColumnIndex];
3918                         
3919                         if (col.SortMode == DataGridViewColumnSortMode.Automatic) {
3920                                 ListSortDirection new_order;
3921                                 
3922                                 // Always use ascending unless we are clicking on a
3923                                 // column that is already sorted ascending.
3924                                 if (SortedColumn != col || sortOrder != SortOrder.Ascending)
3925                                         new_order = ListSortDirection.Ascending;
3926                                 else
3927                                         new_order = ListSortDirection.Descending;
3928
3929                                 Sort (col, new_order);
3930                         }
3931                         
3932                         DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [ColumnHeaderMouseClickEvent]);
3933                         if (eh != null)
3934                                 eh (this, e);
3935                 }
3936
3937                 protected virtual void OnColumnHeaderMouseDoubleClick (DataGridViewCellMouseEventArgs e)
3938                 {
3939                         DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [ColumnHeaderMouseDoubleClickEvent]);
3940                         if (eh != null)
3941                                 eh (this, e);
3942                 }
3943
3944                 protected virtual void OnColumnHeadersBorderStyleChanged (EventArgs e)
3945                 {
3946                         EventHandler eh = (EventHandler)(Events [ColumnHeadersBorderStyleChangedEvent]);
3947                         if (eh != null)
3948                                 eh (this, e);
3949                 }
3950
3951                 protected virtual void OnColumnHeadersDefaultCellStyleChanged (EventArgs e)
3952                 {
3953                         EventHandler eh = (EventHandler)(Events [ColumnHeadersDefaultCellStyleChangedEvent]);
3954                         if (eh != null)
3955                                 eh (this, e);
3956                 }
3957
3958                 protected virtual void OnColumnHeadersHeightChanged (EventArgs e)
3959                 {
3960                         EventHandler eh = (EventHandler)(Events [ColumnHeadersHeightChangedEvent]);
3961                         if (eh != null)
3962                                 eh (this, e);
3963                 }
3964
3965                 protected virtual void OnColumnHeadersHeightSizeModeChanged (DataGridViewAutoSizeModeEventArgs e)
3966                 {
3967                         DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [ColumnHeadersHeightSizeModeChangedEvent]);
3968                         if (eh != null)
3969                                 eh (this, e);
3970                 }
3971
3972                 protected internal virtual void OnColumnMinimumWidthChanged (DataGridViewColumnEventArgs e)
3973                 {
3974                         DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnMinimumWidthChangedEvent]);
3975                         if (eh != null)
3976                                 eh (this, e);
3977                 }
3978
3979                 protected internal virtual void OnColumnNameChanged (DataGridViewColumnEventArgs e)
3980                 {
3981                         DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnNameChangedEvent]);
3982                         if (eh != null)
3983                                 eh (this, e);
3984                 }
3985
3986                 internal void OnColumnPreRemovedInternal (DataGridViewColumnEventArgs e)
3987                 {
3988                         // The removed column should be removed from the selection too.
3989                         if (selected_columns != null)
3990                                 SetSelectedColumnCore (e.Column.Index, false);
3991
3992                         if (Columns.Count - 1 == 0) {
3993                                 MoveCurrentCell (-1, -1, true, false, false, true);
3994                                 rows.ClearInternal ();
3995                         } else if (currentCell != null && CurrentCell.ColumnIndex == e.Column.Index) {
3996                                 int nextColumnIndex = e.Column.Index;
3997                                 if (nextColumnIndex >= Columns.Count - 1)
3998                                         nextColumnIndex = Columns.Count - 1 - 1;
3999                                 MoveCurrentCell (nextColumnIndex, currentCell.RowIndex, true, false, false, true);
4000                                 if (hover_cell != null && hover_cell.ColumnIndex >= e.Column.Index)
4001                                         hover_cell = null;
4002                         }
4003                 }
4004
4005                 private void OnColumnPostRemovedInternal (DataGridViewColumnEventArgs e)
4006                 {
4007                         if (e.Column.CellTemplate != null) {
4008                                 int index = e.Column.Index;
4009
4010                                 foreach (DataGridViewRow row in Rows)
4011                                         row.Cells.RemoveAt (index);
4012                         }
4013
4014                         AutoResizeColumnsInternal ();
4015                         PrepareEditingRow (false, true);
4016
4017                         OnColumnRemoved (e);
4018                 }
4019
4020                 protected virtual void OnColumnRemoved (DataGridViewColumnEventArgs e)
4021                 {
4022                         DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnRemovedEvent]);
4023                         if (eh != null)
4024                                 eh (this, e);
4025                 }
4026
4027                 protected internal virtual void OnColumnSortModeChanged (DataGridViewColumnEventArgs e)
4028                 {
4029                         DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnSortModeChangedEvent]);
4030                         if (eh != null)
4031                                 eh (this, e);
4032                 }
4033
4034                 protected internal virtual void OnColumnStateChanged (DataGridViewColumnStateChangedEventArgs e)
4035                 {
4036                         DataGridViewColumnStateChangedEventHandler eh = (DataGridViewColumnStateChangedEventHandler)(Events [ColumnStateChangedEvent]);
4037                         if (eh != null)
4038                                 eh (this, e);
4039                 }
4040
4041                 protected internal virtual void OnColumnToolTipTextChanged (DataGridViewColumnEventArgs e)
4042                 {
4043                         DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnToolTipTextChangedEvent]);
4044                         if (eh != null)
4045                                 eh (this, e);
4046                 }
4047
4048                 protected internal virtual void OnColumnWidthChanged (DataGridViewColumnEventArgs e)
4049                 {
4050                         DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnWidthChangedEvent]);
4051                         if (eh != null)
4052                                 eh (this, e);
4053                 }
4054
4055                 protected virtual void OnCurrentCellChanged (EventArgs e)
4056                 {
4057                         EventHandler eh = (EventHandler)(Events [CurrentCellChangedEvent]);
4058                         if (eh != null)
4059                                 eh (this, e);
4060                 }
4061
4062                 protected virtual void OnCurrentCellDirtyStateChanged (EventArgs e)
4063                 {
4064                         EventHandler eh = (EventHandler)(Events [CurrentCellDirtyStateChangedEvent]);
4065                         if (eh != null)
4066                                 eh (this, e);
4067                 }
4068
4069                 protected override void OnCursorChanged (EventArgs e)
4070                 {
4071                         base.OnCursorChanged (e);
4072                 }
4073
4074                 protected virtual void OnDataBindingComplete (DataGridViewBindingCompleteEventArgs e)
4075                 {
4076                         DataGridViewBindingCompleteEventHandler eh = (DataGridViewBindingCompleteEventHandler)(Events [DataBindingCompleteEvent]);
4077                         if (eh != null)
4078                                 eh (this, e);
4079                 }
4080
4081                 protected virtual void OnDataError (bool displayErrorDialogIfNoHandler, DataGridViewDataErrorEventArgs e)
4082                 {
4083                         DataGridViewDataErrorEventHandler eh = (DataGridViewDataErrorEventHandler)(Events [DataErrorEvent]);
4084                         
4085                         if (eh != null)
4086                                 eh (this, e);
4087                         else if (displayErrorDialogIfNoHandler)
4088                                 MessageBox.Show (e.ToString ());
4089                 }
4090                 protected virtual void OnDataMemberChanged (EventArgs e) {
4091                         EventHandler eh = (EventHandler)(Events [DataMemberChangedEvent]);
4092                         if (eh != null)
4093                                 eh (this, e);
4094                 }
4095
4096                 protected virtual void OnDataSourceChanged (EventArgs e) {
4097                         EventHandler eh = (EventHandler)(Events [DataSourceChangedEvent]);
4098                         if (eh != null)
4099                                 eh (this, e);
4100                 }
4101
4102                 protected virtual void OnDefaultCellStyleChanged (EventArgs e) {
4103                         EventHandler eh = (EventHandler)(Events [DefaultCellStyleChangedEvent]);
4104                         if (eh != null)
4105                                 eh (this, e);
4106                 }
4107
4108                 protected virtual void OnDefaultValuesNeeded (DataGridViewRowEventArgs e) {
4109                         DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [DefaultValuesNeededEvent]);
4110                         if (eh != null)
4111                                 eh (this, e);
4112                 }
4113
4114                 protected override void OnDoubleClick (EventArgs e) {
4115                         base.OnDoubleClick(e);
4116
4117                         Point mouseLocation = this.PointToClient (Control.MousePosition);
4118                         HitTestInfo hitInfo = HitTest (mouseLocation.X, mouseLocation.Y);
4119                         if (hitInfo.Type == DataGridViewHitTestType.Cell)
4120                                 OnCellDoubleClick (new DataGridViewCellEventArgs (hitInfo.ColumnIndex, hitInfo.RowIndex));
4121                 }
4122
4123                 protected virtual void OnEditingControlShowing (DataGridViewEditingControlShowingEventArgs e) {
4124                         DataGridViewEditingControlShowingEventHandler eh = (DataGridViewEditingControlShowingEventHandler)(Events [EditingControlShowingEvent]);
4125                         if (eh != null)
4126                                 eh (this, e);
4127                 }
4128
4129                 protected virtual void OnEditModeChanged (EventArgs e)
4130                 {
4131                         EventHandler eh = (EventHandler)(Events [EditModeChangedEvent]);
4132                         if (eh != null)
4133                                 eh (this, e);
4134                 }
4135
4136                 protected override void OnEnabledChanged (EventArgs e)
4137                 {
4138                         base.OnEnabledChanged(e);
4139                 }
4140
4141                 protected override void OnEnter (EventArgs e )
4142                 {
4143                         base.OnEnter(e);
4144                 }
4145
4146                 protected override void OnGotFocus(EventArgs e)
4147                 {
4148                         base.OnGotFocus (e);
4149
4150                         // To add focus rectangle if needed
4151                         if (currentCell != null && ShowFocusCues)
4152                                 InvalidateCell (currentCell);
4153                 }
4154
4155                 protected override void OnFontChanged (EventArgs e)
4156                 {
4157                         base.OnFontChanged(e);
4158                 }
4159
4160                 protected override void OnForeColorChanged (EventArgs e)
4161                 {
4162                         base.OnForeColorChanged(e);
4163                 }
4164
4165                 protected virtual void OnGridColorChanged (EventArgs e)
4166                 {
4167                         EventHandler eh = (EventHandler)(Events [GridColorChangedEvent]);
4168                         if (eh != null)
4169                                 eh (this, e);
4170                 }
4171
4172                 protected override void OnHandleCreated (EventArgs e)
4173                 {
4174                         base.OnHandleCreated(e);
4175                         ReBind ();
4176                         
4177                         if (DataManager == null && CurrentCell == null && Rows.Count > 0 && Columns.Count > 0)
4178                                 MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, false, false, false);
4179                 }
4180
4181                 protected override void OnHandleDestroyed(EventArgs e)
4182                 {
4183                         base.OnHandleDestroyed (e);
4184                 }
4185
4186                 [EditorBrowsable (EditorBrowsableState.Advanced)]
4187                 protected override void OnKeyDown (KeyEventArgs e)
4188                 {
4189                         base.OnKeyDown (e);
4190
4191                         e.Handled = ProcessDataGridViewKey (e);
4192                 }
4193
4194                 [EditorBrowsable (EditorBrowsableState.Advanced)]
4195                 protected override void OnKeyPress (KeyPressEventArgs e)
4196                 {
4197                         base.OnKeyPress(e);
4198                 }
4199
4200                 [EditorBrowsable (EditorBrowsableState.Advanced)]
4201                 protected override void OnKeyUp (KeyEventArgs e)
4202                 {
4203                         base.OnKeyUp(e);
4204                 }
4205
4206                 protected override void OnLayout (LayoutEventArgs e)
4207                 {
4208                         if (horizontalScrollBar.Visible && verticalScrollBar.Visible) {
4209                                 horizontalScrollBar.Bounds = new Rectangle (BorderWidth, Height - BorderWidth - horizontalScrollBar.Height, Width - (2 * BorderWidth) - verticalScrollBar.Width, horizontalScrollBar.Height);
4210                                 verticalScrollBar.Bounds = new Rectangle (Width - BorderWidth - verticalScrollBar.Width, BorderWidth, verticalScrollBar.Width, Height - (2 * BorderWidth) - horizontalScrollBar.Height);
4211                         } else if (horizontalScrollBar.Visible)
4212                                 horizontalScrollBar.Bounds = new Rectangle (BorderWidth, Height - BorderWidth - horizontalScrollBar.Height, Width - (2 * BorderWidth), horizontalScrollBar.Height);
4213                         else if (verticalScrollBar.Visible)
4214                                 verticalScrollBar.Bounds = new Rectangle (Width - BorderWidth - verticalScrollBar.Width, BorderWidth, verticalScrollBar.Width,  Height - (2 * BorderWidth));
4215
4216                         AutoResizeColumnsInternal ();
4217                         Invalidate ();
4218                 }
4219
4220                 protected override void OnLeave (EventArgs e)
4221                 {
4222                         EndEdit (DataGridViewDataErrorContexts.LeaveControl);
4223                         base.OnLeave(e);
4224                 }
4225
4226                 protected override void OnLostFocus(EventArgs e)
4227                 {
4228                         base.OnLostFocus (e);
4229
4230                         // To remove focus rectangle if needed
4231                         if (currentCell != null && ShowFocusCues)
4232                                 InvalidateCell (currentCell);
4233                 }
4234
4235                 protected override void OnMouseClick (MouseEventArgs e)
4236                 {
4237                         base.OnMouseClick(e);
4238                         
4239                         if (column_resize_active || row_resize_active)
4240                                 return;
4241                                 
4242                         //Console.WriteLine("Mouse: Clicks: {0}; Delta: {1}; X: {2}; Y: {3};", e.Clicks, e.Delta, e.X, e.Y);
4243                         HitTestInfo hit = HitTest (e.X, e.Y);
4244
4245                         switch (hit.Type) {
4246                                 case DataGridViewHitTestType.Cell:
4247                                         Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4248                                         Point cellpoint = new Point (e.X - display.X, e.Y - display.Y);
4249
4250                                         OnCellMouseClick (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, cellpoint.X, cellpoint.Y, e));
4251                                         
4252                                         DataGridViewCell cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex);
4253                                         
4254                                         if (cell.GetContentBounds (hit.RowIndex).Contains (cellpoint)) {
4255                                                 DataGridViewCellEventArgs dgvcea = new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex);
4256                                                 OnCellContentClick (dgvcea);
4257                                         }
4258                                                 
4259                                         break;
4260                                 case DataGridViewHitTestType.ColumnHeader:
4261                                         Rectangle display2 = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4262                                         Point cellpoint2 = new Point (e.X - display2.X, e.Y - display2.Y);
4263                                         
4264                                         OnColumnHeaderMouseClick (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, cellpoint2.X, cellpoint2.Y, e));
4265                                         break;
4266                         }
4267                 }
4268
4269                 protected override void OnMouseDoubleClick (MouseEventArgs e)
4270                 {
4271                         base.OnMouseDoubleClick(e);
4272
4273                         HitTestInfo hitInfo = HitTest (e.X, e.Y);
4274                         if (hitInfo.Type == DataGridViewHitTestType.Cell)
4275                                 OnCellMouseDoubleClick (new DataGridViewCellMouseEventArgs (hitInfo.ColumnIndex, hitInfo.RowIndex,
4276                                                                                             hitInfo.ColumnX, hitInfo.RowY, e));
4277                 }
4278
4279                 private void DoSelectionOnMouseDown (HitTestInfo hitTest)
4280                 {
4281                         Keys modifiers = Control.ModifierKeys;
4282                         bool isControl = (modifiers & Keys.Control) != 0;
4283                         bool isShift = (modifiers & Keys.Shift) != 0;
4284                         //bool isRowHeader = hitTest.Type == DataGridViewHitTestType.RowHeader;
4285                         //bool isColHeader = hitTest.Type == DataGridViewHitTestType.ColumnHeader;
4286                         DataGridViewSelectionMode mode;
4287                         
4288                         switch (hitTest.Type) {
4289                         case DataGridViewHitTestType.Cell:
4290                                 mode = selectionMode;
4291                                 break;
4292                         case DataGridViewHitTestType.ColumnHeader:
4293                                 mode = selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect ? DataGridViewSelectionMode.FullColumnSelect : selectionMode;
4294                                 
4295                                 if (mode != DataGridViewSelectionMode.FullColumnSelect)
4296                                         return;
4297                                 break;
4298                         case DataGridViewHitTestType.RowHeader:
4299                                 mode = selectionMode == DataGridViewSelectionMode.RowHeaderSelect ?  DataGridViewSelectionMode.FullRowSelect : selectionMode;
4300
4301                                 if (mode != DataGridViewSelectionMode.FullRowSelect)
4302                                         return;
4303                                 break; // Handled below
4304                         default:
4305                                 return;
4306                         }
4307                         
4308                         if (!isControl) {
4309                                 // If SHIFT is pressed:
4310                                 //      Select all from selected_row/column/cell to current row/column/cell, unselect everything else
4311                                 // otherwise:
4312                                 //      Unselect all rows/columns/cells, select the clicked one
4313                                 int min_row, max_row;
4314                                 int min_col, max_col;
4315                                 if (!isShift) {
4316                                         selected_row = hitTest.RowIndex;
4317                                         selected_column = hitTest.ColumnIndex;
4318                                 } 
4319                                 if (!isShift) {
4320                                         if (selected_row != -1)
4321                                                 selected_row = hitTest.RowIndex;
4322                                         if (selected_column != -1)
4323                                                 selected_column = hitTest.ColumnIndex;
4324                                 }
4325                                 if (selected_row >= hitTest.RowIndex) {
4326                                         min_row = hitTest.RowIndex;
4327                                         max_row = isShift ? selected_row : min_row;
4328                                 } else {
4329                                         max_row = hitTest.RowIndex;
4330                                         min_row = isShift ? selected_row : max_row;
4331                                 }
4332                                 if (selected_column >= hitTest.ColumnIndex) {
4333                                         min_col = hitTest.ColumnIndex;
4334                                         max_col = isShift ? selected_column : min_col;
4335                                 } else {
4336                                         max_col = hitTest.ColumnIndex;
4337                                         min_col = isShift ? selected_column : max_col;
4338                                 }
4339
4340                                 switch (mode) {
4341                                 case DataGridViewSelectionMode.FullRowSelect:
4342                                         for (int i = 0; i < RowCount; i++) {
4343                                                 bool select = i >= min_row && i <= max_row;
4344                                                 if (!select) {
4345                                                         for (int c = 0; c < ColumnCount; c++) {
4346                                                                 if (Rows [i].Cells [c].Selected) {
4347                                                                         SetSelectedCellCore (c, i, false);
4348                                                                 }
4349                                                         }
4350                                                 }
4351                                                 if (select != Rows [i].Selected) {
4352                                                         SetSelectedRowCore (i, select);
4353                                                 }
4354                                         }
4355                                         break;
4356                                 case DataGridViewSelectionMode.FullColumnSelect:
4357                                         for (int i = 0; i < ColumnCount; i++) {
4358                                                 bool select = i >= min_col && i <= max_col;
4359                                                 if (!select) {
4360                                                         for (int r = 0; r < RowCount; r++) {
4361                                                                 if (Rows [r].Cells [i].Selected) {
4362                                                                         SetSelectedCellCore (i, r, false);
4363                                                                 }
4364                                                         }
4365                                                 }
4366                                                 if (select != Columns [i].Selected) {
4367                                                         SetSelectedColumnCore (i, select);
4368                                                 }
4369                                         }
4370                                         break;
4371                                 case DataGridViewSelectionMode.ColumnHeaderSelect:
4372                                 case DataGridViewSelectionMode.RowHeaderSelect:
4373                                         //break;
4374                                 case DataGridViewSelectionMode.CellSelect:
4375                                         if (!isShift) {
4376                                                 for (int c = 0; c < ColumnCount; c++) {
4377                                                         if (columns [c].Selected)
4378                                                                 SetSelectedColumnCore (c, false);
4379                                                 }
4380                                                 
4381                                                 for (int r = 0; r < RowCount; r++) {
4382                                                         if (rows [r].Selected)
4383                                                                 SetSelectedRowCore (r, false);
4384                                                 }
4385                                         }
4386                                         for (int r = 0; r < RowCount; r++) {
4387                                                 for (int c = 0; c < ColumnCount; c++) {
4388                                                         bool select = (r >= min_row && r <= max_row) && (c >= min_col && c <= max_col);
4389                                                         if (select != Rows [r].Cells [c].Selected)
4390                                                                 SetSelectedCellCore (c, r, select);
4391                                                 }
4392                                         }
4393                                         break;
4394                                 }
4395                                 
4396                         } else if (isControl) {
4397                                 // Switch the selected state of the row.
4398                                 switch (mode) {
4399                                 case DataGridViewSelectionMode.FullRowSelect:
4400                                         SetSelectedRowCore (hitTest.RowIndex, !rows [hitTest.RowIndex].Selected);
4401                                         break;
4402                                 case DataGridViewSelectionMode.FullColumnSelect:
4403                                         SetSelectedColumnCore (hitTest.ColumnIndex, !columns [hitTest.ColumnIndex].Selected);
4404                                         break;
4405                                 case DataGridViewSelectionMode.ColumnHeaderSelect:
4406                                 case DataGridViewSelectionMode.RowHeaderSelect:
4407                                         //break;
4408                                 case DataGridViewSelectionMode.CellSelect:
4409                                         if (hitTest.ColumnIndex >= 0 && hitTest.RowIndex >= 0) {
4410                                                 SetSelectedCellCore (hitTest.ColumnIndex, hitTest.RowIndex, !Rows [hitTest.RowIndex].Cells [hitTest.ColumnIndex].Selected);
4411                                         }
4412                                         break;
4413                                 }
4414                         }
4415                         
4416                 }
4417
4418                 protected override void OnMouseDown (MouseEventArgs e)
4419                 {
4420                         base.OnMouseDown(e);
4421                         
4422                         if (!EndEdit ())
4423                                 return;
4424
4425                         HitTestInfo hitTest = HitTest(e.X, e.Y);
4426                         
4427                         DataGridViewCell cell = null;
4428                         DataGridViewRow row = null;
4429                         Rectangle cellBounds;
4430
4431                         if ((hitTest.Type == DataGridViewHitTestType.ColumnHeader ||
4432                              (hitTest.Type == DataGridViewHitTestType.Cell && !ColumnHeadersVisible)) 
4433                             && MouseOverColumnResize (hitTest.ColumnIndex, e.X)) {
4434                                 if (e.Clicks == 2) {
4435                                         AutoResizeColumn (hitTest.ColumnIndex);
4436                                         return;
4437                                 }
4438                                 
4439                                 resize_band = hitTest.ColumnIndex;
4440                                 column_resize_active = true;
4441                                 resize_band_start = e.X;
4442                                 resize_band_delta = 0;
4443                                 DrawVerticalResizeLine (resize_band_start);
4444                                 return;
4445                         }
4446
4447                         if ((hitTest.Type == DataGridViewHitTestType.RowHeader ||
4448                              (hitTest.Type == DataGridViewHitTestType.Cell && !RowHeadersVisible))
4449                             && MouseOverRowResize (hitTest.RowIndex, e.Y)) {
4450                                 if (e.Clicks == 2) {
4451                                         AutoResizeRow (hitTest.RowIndex);
4452                                         return;
4453                                 }
4454
4455                                 resize_band = hitTest.RowIndex;
4456                                 row_resize_active = true;
4457                                 resize_band_start = e.Y;
4458                                 resize_band_delta = 0;
4459                                 DrawHorizontalResizeLine (resize_band_start);
4460                                 return;
4461                         }
4462
4463                         if (hitTest.Type == DataGridViewHitTestType.Cell) {
4464                                 row = rows [hitTest.RowIndex];
4465                                 cell = row.Cells [hitTest.ColumnIndex];
4466                                 SetCurrentCellAddressCore (cell.ColumnIndex, cell.RowIndex, false, true, true);
4467                                 cellBounds = GetCellDisplayRectangle (hitTest.ColumnIndex, hitTest.RowIndex, false);
4468                                 OnCellMouseDown (new DataGridViewCellMouseEventArgs (hitTest.ColumnIndex, hitTest.RowIndex, e.X - cellBounds.X, e.Y - cellBounds.Y, e));
4469                                 OnCellClick (new DataGridViewCellEventArgs (hitTest.ColumnIndex, hitTest.RowIndex));
4470                         }
4471                         
4472                         DoSelectionOnMouseDown (hitTest);
4473                         
4474                         if (hitTest.Type != DataGridViewHitTestType.Cell) {
4475                                 if (hitTest.Type == DataGridViewHitTestType.ColumnHeader)
4476                                         pressed_header_cell = columns [hitTest.ColumnIndex].HeaderCell;
4477                                 else if (hitTest.Type == DataGridViewHitTestType.RowHeader)
4478                                         pressed_header_cell = rows [hitTest.RowIndex].HeaderCell;
4479                                 Invalidate ();
4480                                 return;
4481                         }
4482                         
4483                         Invalidate();
4484                         return;
4485                 }
4486
4487                 private void UpdateBindingPosition (int position)
4488                 {
4489                         if (DataManager != null)
4490                                 DataManager.Position = position;
4491                 }
4492
4493                 protected override void OnMouseEnter (EventArgs e)
4494                 {
4495                         base.OnMouseEnter(e);
4496                 }
4497
4498                 protected override void OnMouseLeave (EventArgs e)
4499                 {
4500                         base.OnMouseLeave (e);
4501                         
4502                         if (hover_cell != null) {
4503                                 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4504                                 hover_cell = null;
4505                         }
4506                         
4507                         EnteredHeaderCell = null;
4508                 }
4509                 
4510                 protected override void OnMouseMove (MouseEventArgs e)
4511                 {
4512                         base.OnMouseMove (e);
4513
4514                         if (column_resize_active) {
4515                                 // Erase the old line
4516                                 DrawVerticalResizeLine (resize_band_start + resize_band_delta);
4517
4518                                 resize_band_delta = e.X - resize_band_start;
4519
4520                                 // Draw the new line
4521                                 DrawVerticalResizeLine (resize_band_start + resize_band_delta);
4522                                 return;
4523                         }
4524
4525                         if (row_resize_active) {
4526                                 // Erase the old line
4527                                 DrawHorizontalResizeLine (resize_band_start + resize_band_delta);
4528
4529                                 resize_band_delta = e.Y - resize_band_start;
4530
4531                                 // Draw the new line
4532                                 DrawHorizontalResizeLine (resize_band_start + resize_band_delta);
4533                                 return;
4534                         }
4535
4536                         Cursor new_cursor = Cursors.Default;
4537                         HitTestInfo hit = this.HitTest (e.X, e.Y);
4538                         
4539                         if (hit.Type == DataGridViewHitTestType.ColumnHeader || 
4540                             (!ColumnHeadersVisible && hit.Type == DataGridViewHitTestType.Cell && MouseOverColumnResize (hit.ColumnIndex, e.X))) {
4541                                 EnteredHeaderCell = Columns [hit.ColumnIndex].HeaderCell;
4542                                 if (MouseOverColumnResize (hit.ColumnIndex, e.X))
4543                                         new_cursor = Cursors.VSplit;
4544                         } else if (!RowHeadersVisible && hit.Type == DataGridViewHitTestType.Cell && MouseOverRowResize (hit.RowIndex, e.Y)) {
4545                                 EnteredHeaderCell = Rows[hit.RowIndex].HeaderCell;
4546                                 new_cursor = Cursors.HSplit;
4547                         } else if (hit.Type == DataGridViewHitTestType.Cell) {
4548                                 EnteredHeaderCell = null;
4549
4550                                 DataGridViewCell new_cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex);
4551                                 
4552                                 // Check if we have moved into an error icon area
4553                                 Rectangle icon = new_cell.ErrorIconBounds;
4554
4555                                 if (!icon.IsEmpty) {
4556                                         Point loc = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false).Location;
4557                                         
4558                                         icon.X += loc.X;
4559                                         icon.Y += loc.Y;
4560                                         
4561                                         if (icon.Contains (e.X, e.Y)) {
4562                                                 if (tooltip_currently_showing != new_cell)
4563                                                         MouseEnteredErrorIcon (new_cell);
4564                                         } else
4565                                                 MouseLeftErrorIcon (new_cell);
4566                                 }
4567                                 
4568                                 Cursor = new_cursor;
4569
4570                                 // We have never been in a cell before
4571                                 if (hover_cell == null) {
4572                                         hover_cell = new_cell;
4573                                         OnCellMouseEnter (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex));
4574                                         
4575                                         Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4576                                         OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4577                                         
4578                                         return;
4579                                 }
4580                         
4581                                 // Were we already in this cell?
4582                                 if (hover_cell.RowIndex == hit.RowIndex && hover_cell.ColumnIndex == hit.ColumnIndex) {
4583                                         Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4584                                         OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4585                                 
4586                                         return;
4587                                 }
4588                         
4589                                 // We are changing cells
4590                                 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4591
4592                                 hover_cell = new_cell;
4593                                 
4594                                 OnCellMouseEnter (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex));
4595
4596                                 Rectangle display2 = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4597                                 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display2.X, e.Y - display2.Y, e));
4598
4599                                 return;
4600                         } else if (hit.Type == DataGridViewHitTestType.RowHeader) {
4601                                 DataGridViewRowHeaderCell new_cell = Rows[hit.RowIndex].HeaderCell;
4602
4603                                 EnteredHeaderCell = new_cell;
4604
4605                                 if (MouseOverRowResize (hit.RowIndex, e.Y))
4606                                         new_cursor = Cursors.HSplit;
4607
4608                                 // Check if we have moved into an error icon area
4609                                 Rectangle icon = new_cell.InternalErrorIconsBounds;
4610
4611                                 if (!icon.IsEmpty) {
4612                                         Point loc = GetCellDisplayRectangle (0, hit.RowIndex, false).Location;
4613
4614                                         icon.X += BorderWidth;
4615                                         icon.Y += loc.Y;
4616
4617                                         if (icon.Contains (e.X, e.Y)) {
4618                                                 if (tooltip_currently_showing != new_cell)
4619                                                         MouseEnteredErrorIcon (new_cell);
4620                                         } else
4621                                                 MouseLeftErrorIcon (new_cell);
4622                                 }
4623                         } else if (hit.Type == DataGridViewHitTestType.TopLeftHeader) {
4624                                 EnteredHeaderCell = null;
4625
4626                                 DataGridViewTopLeftHeaderCell new_cell = (DataGridViewTopLeftHeaderCell)TopLeftHeaderCell;
4627
4628                                 // Check if we have moved into an error icon area
4629                                 Rectangle icon = new_cell.InternalErrorIconsBounds;
4630
4631                                 if (!icon.IsEmpty) {
4632                                         Point loc = Point.Empty;
4633
4634                                         icon.X += BorderWidth;
4635                                         icon.Y += loc.Y;
4636
4637                                         if (icon.Contains (e.X, e.Y)) {
4638                                                 if (tooltip_currently_showing != new_cell)
4639                                                         MouseEnteredErrorIcon (new_cell);
4640                                         } else
4641                                                 MouseLeftErrorIcon (new_cell);
4642                                 }
4643                         
4644                         } else {
4645                                 EnteredHeaderCell = null;
4646
4647                                 // We have left the cell area
4648                                 if (hover_cell != null) {
4649                                         OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4650                                         hover_cell = null;
4651                                 }
4652                         }
4653                         
4654                         Cursor = new_cursor;
4655                 }
4656
4657                 protected override void OnMouseUp (MouseEventArgs e)
4658                 {
4659                         base.OnMouseUp(e);
4660
4661                         if (column_resize_active) {
4662                                 column_resize_active = false;
4663                                 
4664                                 if (resize_band_delta + Columns[resize_band].Width < 0)
4665                                         resize_band_delta = -Columns[resize_band].Width;
4666
4667                                 Columns[resize_band].Width = Math.Max (resize_band_delta + Columns[resize_band].Width, Columns[resize_band].MinimumWidth);
4668                                 Invalidate ();
4669                                 return;
4670                         }
4671
4672                         if (row_resize_active) {
4673                                 row_resize_active = false;
4674
4675                                 if (resize_band_delta + Rows[resize_band].Height < 0)
4676                                         resize_band_delta = -Rows[resize_band].Height;
4677
4678                                 Rows[resize_band].Height = Math.Max (resize_band_delta + Rows[resize_band].Height, Rows[resize_band].MinimumHeight);
4679                                 Invalidate ();
4680                                 return;
4681                         }
4682                 
4683                         HitTestInfo hit = this.HitTest (e.X, e.Y);
4684
4685                         if (hit.Type == DataGridViewHitTestType.Cell) {
4686                                 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4687                                 OnCellMouseUp (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4688                         }
4689
4690                         if (pressed_header_cell != null) {
4691                                 DataGridViewHeaderCell cell = pressed_header_cell;
4692                                 pressed_header_cell = null;
4693                                 if (ThemeEngine.Current.DataGridViewHeaderCellHasPressedStyle (this))
4694                                         Invalidate (GetHeaderCellBounds (cell));
4695                         }
4696                 }
4697
4698                 protected override void OnMouseWheel (MouseEventArgs e)
4699                 {
4700                         base.OnMouseWheel(e);
4701
4702                         int delta = SystemInformation.MouseWheelScrollLines * verticalScrollBar.SmallChange;
4703                         if (e.Delta < 0)
4704                                 verticalScrollBar.SafeValueSet (verticalScrollBar.Value + delta);
4705                         else
4706                                 verticalScrollBar.SafeValueSet (verticalScrollBar.Value - delta);
4707
4708                         OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
4709                 }
4710
4711                 protected virtual void OnMultiSelectChanged (EventArgs e)
4712                 {
4713                         EventHandler eh = (EventHandler)(Events [MultiSelectChangedEvent]);
4714                         if (eh != null) eh (this, e);
4715                 }
4716
4717                 protected virtual void OnNewRowNeeded (DataGridViewRowEventArgs e) {
4718                         DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [NewRowNeededEvent]);
4719                         if (eh != null) eh (this, e);
4720                 }
4721
4722                 int first_row_index = 0;
4723                 internal int first_col_index = 0;
4724
4725                 protected override void OnPaint (PaintEventArgs e)
4726                 {
4727                         Graphics g = e.Graphics;
4728                         Rectangle bounds = ClientRectangle;
4729                         
4730                         // Paint the background
4731                         PaintBackground (g, e.ClipRectangle, bounds);
4732
4733                         List<DataGridViewColumn> sortedColumns = columns.ColumnDisplayIndexSortedArrayList;
4734                         
4735                         // Take borders into account
4736                         bounds.Inflate (-BorderWidth, -BorderWidth);
4737                         
4738                         // Paint the top left cell
4739                         if (rowHeadersVisible && columnHeadersVisible && ColumnCount > 0) {
4740                                 Rectangle topleftbounds = new Rectangle (bounds.X, bounds.Y, rowHeadersWidth, columnHeadersHeight);
4741                                 
4742                                 TopLeftHeaderCell.PaintWork (g, e.ClipRectangle, topleftbounds, -1, TopLeftHeaderCell.State, ColumnHeadersDefaultCellStyle, AdvancedColumnHeadersBorderStyle, DataGridViewPaintParts.All);
4743                         }
4744                         
4745                         // Paint the column headers
4746                         if (columnHeadersVisible) {
4747                                 Rectangle headerBounds = bounds;
4748                                 headerBounds.Height = columnHeadersHeight;
4749                                 
4750                                 if (rowHeadersVisible)
4751                                         headerBounds.X += rowHeadersWidth;
4752                                 
4753                                 for (int index = first_col_index; index < sortedColumns.Count; index++) {
4754                                         DataGridViewColumn col = sortedColumns[index];
4755                                         
4756                                         if (!col.Visible)
4757                                                 continue;
4758                                         
4759                                         headerBounds.Width = col.Width;
4760                                         DataGridViewCell cell = col.HeaderCell;
4761
4762                                         DataGridViewAdvancedBorderStyle intermediateBorderStyle = (DataGridViewAdvancedBorderStyle)((ICloneable)this.AdvancedColumnHeadersBorderStyle).Clone ();
4763                                         DataGridViewAdvancedBorderStyle borderStyle = AdjustColumnHeaderBorderStyle (this.AdvancedColumnHeadersBorderStyle, intermediateBorderStyle, cell.ColumnIndex == 0, cell.ColumnIndex == columns.Count - 1);
4764
4765                                         cell.PaintWork (g, e.ClipRectangle, headerBounds, -1, cell.State, cell.InheritedStyle, borderStyle, DataGridViewPaintParts.All);
4766                                         
4767                                         headerBounds.X += col.Width;
4768                                 }
4769
4770                                 bounds.Y += columnHeadersHeight;
4771                         }
4772                         
4773                         // Reset not displayed columns to !Displayed
4774                         for (int i = 0; i < first_col_index; i++)
4775                                 Columns[i].DisplayedInternal = false;
4776                         
4777                         int gridWidth = rowHeadersVisible ? rowHeadersWidth : 0;
4778
4779                         // Set Displayed columns
4780                         for (int i = first_col_index; i < Columns.Count; i++) {
4781                                 DataGridViewColumn col = Columns.ColumnDisplayIndexSortedArrayList[i];
4782
4783                                 if (!col.Visible)
4784                                         continue;
4785                         
4786                                 col.DisplayedInternal = true;
4787                                 gridWidth += col.Width;
4788                                 if (gridWidth >= Width)
4789                                         break;
4790                         }
4791                         
4792                         // Reset all not displayed rows to !Displayed
4793                         for (int i = 0; i < first_row_index; i++)
4794                                 GetRowInternal (i).DisplayedInternal = false;
4795                         
4796                         // Draw rows
4797                         for (int index = first_row_index; index < Rows.Count; index++) {
4798                                 DataGridViewRow row = Rows[index];
4799                                 if (!row.Visible)
4800                                         continue;
4801                                 GetRowInternal (index).DisplayedInternal = true;
4802         
4803                                 bounds.Height = row.Height;
4804                                 bool is_first = row.Index == 0;
4805                                 bool is_last = row.Index == rows.Count - 1;
4806
4807                                 row.Paint (g, e.ClipRectangle, bounds, row.Index, row.GetState (row.Index), is_first, is_last);
4808
4809                                 bounds.Y += bounds.Height;
4810                                 bounds.X = BorderWidth;
4811                                 
4812                                 if (bounds.Y >= ClientSize.Height - (horizontalScrollBar.Visible ? horizontalScrollBar.Height : 0))
4813                                         break;
4814                         }
4815
4816                         RefreshScrollBars ();
4817                         
4818                         // Paint the bottom right square if both scrollbars are displayed
4819                         if (horizontalScrollBar.Visible && verticalScrollBar.Visible)
4820                                 g.FillRectangle (SystemBrushes.Control, new Rectangle (horizontalScrollBar.Right, verticalScrollBar.Bottom, verticalScrollBar.Width, horizontalScrollBar.Height));
4821
4822                         // Paint the border
4823                         bounds = ClientRectangle;
4824                         
4825                         switch (BorderStyle) {
4826                                 case BorderStyle.FixedSingle:
4827                                         g.DrawRectangle (Pens.Black, new Rectangle (bounds.Left, bounds.Top, bounds.Width - 1, bounds.Height - 1));
4828                                         break;
4829                                 case BorderStyle.Fixed3D:
4830                                         ControlPaint.DrawBorder3D (g, bounds, Border3DStyle.Sunken);
4831                                         break;
4832                         }
4833
4834                         // Call the base impl at the end.
4835                         base.OnPaint(e);
4836                 }
4837
4838                 private void RefreshScrollBars ()
4839                 {
4840                         int gridWidth = 0;
4841                         int gridHeight = 0;
4842
4843                         foreach (DataGridViewColumn col in columns.ColumnDisplayIndexSortedArrayList)
4844                                 if (col.Visible)
4845                                         gridWidth += col.Width;
4846                         
4847                         foreach (DataGridViewRow row in Rows)
4848                                 if (row.Visible)
4849                                         gridHeight += row.Height;
4850
4851                         if (rowHeadersVisible)
4852                                 gridWidth += rowHeadersWidth;
4853                         if (columnHeadersVisible)
4854                                 gridHeight += columnHeadersHeight;
4855
4856                         bool horizontalVisible = false;
4857                         bool verticalVisible = false;
4858                         
4859                         if (AutoSize) {
4860                                 if (gridWidth > Size.Width || gridHeight > Size.Height)
4861                                         Size = new Size(gridWidth, gridHeight);
4862                         }
4863                         else {
4864                                 if (gridWidth > Size.Width)
4865                                         horizontalVisible = true;
4866                                 if (gridHeight > Size.Height)
4867                                         verticalVisible = true;
4868
4869                                 if (horizontalScrollBar.Visible && (gridHeight + horizontalScrollBar.Height) > Size.Height)
4870                                         verticalVisible = true;
4871                                 if (verticalScrollBar.Visible && (gridWidth + verticalScrollBar.Width) > Size.Width) 
4872                                         horizontalVisible = true;
4873
4874                                 if (horizontalVisible) {
4875                                         horizontalScrollBar.Minimum = 0;
4876                                         horizontalScrollBar.Maximum = gridWidth;
4877                                         horizontalScrollBar.SmallChange = Columns[first_col_index].Width;
4878                                         int largeChange = ClientSize.Width - rowHeadersWidth - horizontalScrollBar.Height;
4879                                         if (largeChange <= 0)
4880                                                 largeChange = ClientSize.Width;
4881                                         horizontalScrollBar.LargeChange = largeChange;
4882                                 }
4883
4884                                 if (verticalVisible) {
4885                                         verticalScrollBar.Minimum = 0;
4886                                         verticalScrollBar.Maximum = gridHeight;
4887                                         int first_row_height = Rows.Count > 0 ? Rows[Math.Min (Rows.Count - 1, first_row_index)].Height : 0;
4888                                         verticalScrollBar.SmallChange = first_row_height + 1;
4889                                         int largeChange = ClientSize.Height - columnHeadersHeight - verticalScrollBar.Width;
4890                                         if (largeChange <= 0)
4891                                                 largeChange = ClientSize.Height;
4892                                         verticalScrollBar.LargeChange = largeChange;
4893                                 }
4894
4895                                 // Force the visibility of the scrollbars *after* computing the scrolling values,
4896                                 // as we need them *always* for navigation purposes.
4897                                 if (scrollBars != ScrollBars.Vertical && scrollBars != ScrollBars.Both)
4898                                         verticalVisible = false;
4899                                 if (scrollBars != ScrollBars.Horizontal && scrollBars != ScrollBars.Both)
4900                                         horizontalVisible = false;
4901
4902                                 // MSNET compatibility here
4903                                 if (RowCount <= 1)
4904                                         verticalVisible = false;
4905
4906
4907                         }
4908
4909                         horizontalScrollBar.Visible = horizontalVisible;
4910                         verticalScrollBar.Visible = verticalVisible;
4911                 }
4912
4913                 protected virtual void OnReadOnlyChanged (EventArgs e) {
4914                         EventHandler eh = (EventHandler)(Events [ReadOnlyChangedEvent]);
4915                         if (eh != null)
4916                                 eh (this, e);
4917                 }
4918
4919                 protected override void OnResize (EventArgs e) {
4920                         base.OnResize(e);
4921                         AutoResizeColumnsInternal ();
4922                         
4923                         OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
4924                         OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
4925                 }
4926
4927                 protected override void OnRightToLeftChanged (EventArgs e) {
4928                         base.OnRightToLeftChanged(e);
4929                 }
4930
4931                 // In MSDN2 documentation there's no internal here
4932                 protected internal virtual void OnRowContextMenuStripChanged (DataGridViewRowEventArgs e)
4933                 {
4934                         DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowContextMenuStripChangedEvent]);
4935                         if (eh != null) eh (this, e);
4936                 }
4937
4938                 protected virtual void OnRowContextMenuStripNeeded (DataGridViewRowContextMenuStripNeededEventArgs e)
4939                 {
4940                         DataGridViewRowContextMenuStripNeededEventHandler eh = (DataGridViewRowContextMenuStripNeededEventHandler)(Events [RowContextMenuStripNeededEvent]);
4941                         if (eh != null) eh (this, e);
4942                 }
4943
4944                 protected internal virtual void OnRowDefaultCellStyleChanged (DataGridViewRowEventArgs e)
4945                 {
4946                         DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowDefaultCellStyleChangedEvent]);
4947                         if (eh != null) eh (this, e);
4948                 }
4949
4950                 protected virtual void OnRowDirtyStateNeeded (QuestionEventArgs e)
4951                 {
4952                         QuestionEventHandler eh = (QuestionEventHandler)(Events [RowDirtyStateNeededEvent]);
4953                         if (eh != null) eh (this, e);
4954                 }
4955
4956                 protected virtual void OnRowDividerDoubleClick (DataGridViewRowDividerDoubleClickEventArgs e)
4957                 {
4958                         DataGridViewRowDividerDoubleClickEventHandler eh = (DataGridViewRowDividerDoubleClickEventHandler)(Events [RowDividerDoubleClickEvent]);
4959                         if (eh != null) eh (this, e);
4960                 }
4961
4962                 protected virtual void OnRowDividerHeightChanged (DataGridViewRowEventArgs e)
4963                 {
4964                         DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowDividerHeightChangedEvent]);
4965                         if (eh != null) eh (this, e);
4966                 }
4967
4968                 protected virtual void OnRowEnter (DataGridViewCellEventArgs e)
4969                 {
4970                         DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowEnterEvent]);
4971                         if (eh != null) eh (this, e);
4972                 }
4973
4974                 protected internal virtual void OnRowErrorTextChanged (DataGridViewRowEventArgs e)
4975                 {
4976                         DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowErrorTextChangedEvent]);
4977                         if (eh != null) eh (this, e);
4978                 }
4979
4980                 protected virtual void OnRowErrorTextNeeded (DataGridViewRowErrorTextNeededEventArgs e)
4981                 {
4982                         DataGridViewRowErrorTextNeededEventHandler eh = (DataGridViewRowErrorTextNeededEventHandler)(Events [RowErrorTextNeededEvent]);
4983                         if (eh != null) eh (this, e);
4984                 }
4985
4986                 protected internal virtual void OnRowHeaderCellChanged (DataGridViewRowEventArgs e)
4987                 {
4988                         DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowHeaderCellChangedEvent]);
4989                         if (eh != null) eh (this, e);
4990                 }
4991
4992                 protected virtual void OnRowHeaderMouseClick (DataGridViewCellMouseEventArgs e)
4993                 {
4994                         DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [RowHeaderMouseClickEvent]);
4995                         if (eh != null) eh (this, e);
4996                 }
4997
4998                 protected virtual void OnRowHeaderMouseDoubleClick (DataGridViewCellMouseEventArgs e)
4999                 {
5000                         DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [RowHeaderMouseDoubleClickEvent]);
5001                         if (eh != null) eh (this, e);
5002                 }
5003
5004                 protected virtual void OnRowHeadersBorderStyleChanged (EventArgs e)
5005                 {
5006                         EventHandler eh = (EventHandler)(Events [RowHeadersBorderStyleChangedEvent]);
5007                         if (eh != null) eh (this, e);
5008                 }
5009
5010                 protected virtual void OnRowHeadersDefaultCellStyleChanged (EventArgs e)
5011                 {
5012                         EventHandler eh = (EventHandler)(Events [RowHeadersDefaultCellStyleChangedEvent]);
5013                         if (eh != null) eh (this, e);
5014                 }
5015
5016                 protected virtual void OnRowHeadersWidthChanged (EventArgs e)
5017                 {
5018                         EventHandler eh = (EventHandler)(Events [RowHeadersWidthChangedEvent]);
5019                         if (eh != null) eh (this, e);
5020                 }
5021
5022                 protected virtual void OnRowHeadersWidthSizeModeChanged (DataGridViewAutoSizeModeEventArgs e)
5023                 {
5024                         DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [RowHeadersWidthSizeModeChangedEvent]);
5025                         if (eh != null) eh (this, e);
5026                 }
5027
5028                 protected internal virtual void OnRowHeightChanged (DataGridViewRowEventArgs e)
5029                 {
5030                         UpdateRowHeightInfo (e.Row.Index, false);
5031                         DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowHeightChangedEvent]);
5032                         if (eh != null) eh (this, e);
5033                 }
5034
5035                 protected virtual void OnRowHeightInfoNeeded (DataGridViewRowHeightInfoNeededEventArgs e)
5036                 {
5037                         DataGridViewRowHeightInfoNeededEventHandler eh = (DataGridViewRowHeightInfoNeededEventHandler)(Events [RowHeightInfoNeededEvent]);
5038                         if (eh != null) eh (this, e);
5039                 }
5040
5041                 protected virtual void OnRowHeightInfoPushed (DataGridViewRowHeightInfoPushedEventArgs e)
5042                 {
5043                         DataGridViewRowHeightInfoPushedEventHandler eh = (DataGridViewRowHeightInfoPushedEventHandler)(Events [RowHeightInfoPushedEvent]);
5044                         if (eh != null) eh (this, e);
5045                 }
5046
5047                 protected virtual void OnRowLeave (DataGridViewCellEventArgs e)
5048                 {
5049                         DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowLeaveEvent]);
5050                         if (eh != null) eh (this, e);
5051                 }
5052
5053                 protected internal virtual void OnRowMinimumHeightChanged (DataGridViewRowEventArgs e)
5054                 {
5055                         DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowMinimumHeightChangedEvent]);
5056                         if (eh != null) eh (this, e);
5057                 }
5058
5059                 protected internal virtual void OnRowPostPaint (DataGridViewRowPostPaintEventArgs e)
5060                 {
5061                         DataGridViewRowPostPaintEventHandler eh = (DataGridViewRowPostPaintEventHandler)(Events [RowPostPaintEvent]);
5062                         if (eh != null) eh (this, e);
5063                 }
5064
5065                 protected internal virtual void OnRowPrePaint (DataGridViewRowPrePaintEventArgs e)
5066                 {
5067                         DataGridViewRowPrePaintEventHandler eh = (DataGridViewRowPrePaintEventHandler)(Events [RowPrePaintEvent]);
5068                         if (eh != null) eh (this, e);
5069                 }
5070
5071                 internal void OnRowsAddedInternal (DataGridViewRowsAddedEventArgs e)
5072                 {
5073                         if (hover_cell != null && hover_cell.RowIndex >= e.RowIndex)
5074                                 hover_cell = null;
5075
5076                         // Select the first row if we are not databound. 
5077                         // If we are databound selection is managed by the data manager.
5078                         if (IsHandleCreated && DataManager == null && CurrentCell == null && Rows.Count > 0 && Columns.Count > 0)
5079                                 MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, false, false, true);
5080
5081                         AutoResizeColumnsInternal ();
5082                         Invalidate ();
5083                         OnRowsAdded (e);
5084                 }
5085
5086                 protected virtual void OnRowsAdded (DataGridViewRowsAddedEventArgs e)
5087                 {
5088                         DataGridViewRowsAddedEventHandler eh = (DataGridViewRowsAddedEventHandler)(Events [RowsAddedEvent]);
5089                         if (eh != null) eh (this, e);
5090                 }
5091
5092                 protected virtual void OnRowsDefaultCellStyleChanged (EventArgs e)
5093                 {
5094                         EventHandler eh = (EventHandler)(Events [RowsDefaultCellStyleChangedEvent]);
5095                         if (eh != null) eh (this, e);
5096                 }
5097
5098                 internal void OnRowsPreRemovedInternal (DataGridViewRowsRemovedEventArgs e)
5099                 {
5100                         // All removed rows should be removed from the selection too.
5101                         if (selected_rows != null)
5102                         {
5103                                 int lastRowIndex = e.RowIndex + e.RowCount;
5104                                 for (int rowIndex = e.RowIndex; rowIndex < lastRowIndex; ++rowIndex)
5105                                         SetSelectedRowCore (rowIndex, false);
5106                         }
5107
5108                         if (Rows.Count - e.RowCount <= 0) {
5109                                 MoveCurrentCell (-1, -1, true, false, false, true);
5110                                 hover_cell = null;
5111                         } else if (Columns.Count == 0) {
5112                                 MoveCurrentCell (-1, -1, true, false, false, true);
5113                                 hover_cell = null;
5114                         } else if (currentCell != null && currentCell.RowIndex == e.RowIndex) {
5115                                 int nextRowIndex = e.RowIndex;
5116                                 if (nextRowIndex >= Rows.Count - e.RowCount)
5117                                         nextRowIndex = Rows.Count - 1 - e.RowCount;
5118                                 MoveCurrentCell (currentCell != null ? currentCell.ColumnIndex : 0, nextRowIndex, 
5119                                                  true, false, false, true);
5120                                 if (hover_cell != null && hover_cell.RowIndex >= e.RowIndex)
5121                                         hover_cell = null;
5122                         }
5123                 }
5124
5125                 internal void OnRowsPostRemovedInternal (DataGridViewRowsRemovedEventArgs e)
5126                 {
5127                         Invalidate ();
5128                         OnRowsRemoved (e);
5129                 }
5130
5131                 protected virtual void OnRowsRemoved (DataGridViewRowsRemovedEventArgs e)
5132                 {
5133                         DataGridViewRowsRemovedEventHandler eh = (DataGridViewRowsRemovedEventHandler)(Events [RowsRemovedEvent]);
5134                         if (eh != null) eh (this, e);
5135                 }
5136
5137                 protected internal virtual void OnRowStateChanged (int rowIndex, DataGridViewRowStateChangedEventArgs e)
5138                 {
5139                         DataGridViewRowStateChangedEventHandler eh = (DataGridViewRowStateChangedEventHandler)(Events [RowStateChangedEvent]);
5140                         if (eh != null) eh (this, e);
5141                 }
5142
5143                 protected virtual void OnRowUnshared (DataGridViewRowEventArgs e)
5144                 {
5145                         DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowUnsharedEvent]);
5146                         if (eh != null) eh (this, e);
5147                 }
5148
5149                 protected virtual void OnRowValidated (DataGridViewCellEventArgs e)
5150                 {
5151                         DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowValidatedEvent]);
5152                         if (eh != null) eh (this, e);
5153                 }
5154
5155                 protected virtual void OnRowValidating (DataGridViewCellCancelEventArgs e)
5156                 {
5157                         DataGridViewCellCancelEventHandler eh = (DataGridViewCellCancelEventHandler)(Events [RowValidatingEvent]);
5158                         if (eh != null) eh (this, e);
5159                 }
5160
5161                 protected virtual void OnScroll (ScrollEventArgs e)
5162                 {
5163                         ScrollEventHandler eh = (ScrollEventHandler)(Events [ScrollEvent]);
5164                         if (eh != null) eh (this, e);
5165                 }
5166
5167                 protected virtual void OnSelectionChanged (EventArgs e)
5168                 {
5169                         EventHandler eh = (EventHandler)(Events [SelectionChangedEvent]);
5170                         if (eh != null) eh (this, e);
5171                 }
5172
5173                 protected virtual void OnSortCompare (DataGridViewSortCompareEventArgs e) {
5174                         DataGridViewSortCompareEventHandler eh = (DataGridViewSortCompareEventHandler)(Events [SortCompareEvent]);
5175                         if (eh != null) eh (this, e);
5176                 }
5177
5178                 protected virtual void OnSorted (EventArgs e)
5179                 {
5180                         EventHandler eh = (EventHandler)(Events [SortedEvent]);
5181                         if (eh != null) eh (this, e);
5182                 }
5183
5184                 protected virtual void OnUserAddedRow (DataGridViewRowEventArgs e)
5185                 {
5186                         PrepareEditingRow (false, false);
5187
5188                         new_row_editing = true;
5189                         if (DataManager != null) {
5190                                 // Switch the current editing row with a real one
5191                                 if (editing_row != null) {
5192                                         Rows.RemoveInternal (editing_row);
5193                                         editing_row = null;
5194                                 }
5195                                 DataManager.AddNew (); // will raise OnListPositionChanged
5196                         }
5197
5198                         e = new DataGridViewRowEventArgs (Rows[NewRowIndex]);
5199                         DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [UserAddedRowEvent]);
5200                         if (eh != null) eh (this, e);
5201                 }
5202
5203                 protected virtual void OnUserDeletedRow (DataGridViewRowEventArgs e)
5204                 {
5205                         DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [UserDeletedRowEvent]);
5206                         if (eh != null) eh (this, e);
5207                 }
5208
5209                 protected virtual void OnUserDeletingRow (DataGridViewRowCancelEventArgs e)
5210                 {
5211                         DataGridViewRowCancelEventHandler eh = (DataGridViewRowCancelEventHandler)(Events [UserDeletingRowEvent]);
5212                         if (eh != null) eh (this, e);
5213                 }
5214
5215                 protected override void OnValidating (CancelEventArgs e)
5216                 {
5217                         base.OnValidating(e);
5218                 }
5219
5220                 protected override void OnVisibleChanged (EventArgs e)
5221                 {
5222                         base.OnVisibleChanged(e);
5223                 }
5224
5225                 protected virtual void PaintBackground (Graphics graphics, Rectangle clipBounds, Rectangle gridBounds)
5226                 {
5227                         graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (backgroundColor), gridBounds);
5228                 }
5229
5230                 protected bool ProcessAKey (Keys keyData)
5231                 {
5232                         if (!MultiSelect)
5233                                 return false;
5234                                 
5235                         if ((keyData & Keys.Control) == Keys.Control) {
5236                                 SelectAll ();
5237                                 return true;
5238                         }
5239                         
5240                         return false;
5241                 }
5242
5243                 protected virtual bool ProcessDataGridViewKey (KeyEventArgs e)
5244                 {
5245                         switch (e.KeyData & ~Keys.Modifiers) {
5246                                 case Keys.A:
5247                                         return ProcessAKey (e.KeyData);
5248                                 case Keys.Delete:
5249                                         return ProcessDeleteKey (e.KeyData);
5250                                 case Keys.Down:
5251                                         return ProcessDownKey (e.KeyData);
5252                                 case Keys.Escape:
5253                                         return ProcessEscapeKey (e.KeyData);
5254                                 case Keys.End:
5255                                         return ProcessEndKey (e.KeyData);
5256                                 case Keys.Enter:
5257                                         return ProcessEnterKey (e.KeyData);
5258                                 case Keys.F2:
5259                                         return ProcessF2Key (e.KeyData);
5260                                 case Keys.Home:
5261                                         return ProcessHomeKey (e.KeyData);
5262                                 case Keys.Left:
5263                                         return ProcessLeftKey (e.KeyData);
5264                                 case Keys.Next:
5265                                         return ProcessNextKey (e.KeyData);
5266                                 case Keys.Prior:
5267                                         return ProcessPriorKey (e.KeyData);
5268                                 case Keys.Right:
5269                                         return ProcessRightKey (e.KeyData);
5270                                 case Keys.Space:
5271                                         return ProcessSpaceKey (e.KeyData);
5272                                 case Keys.Tab:
5273                                         return ProcessTabKey (e.KeyData);
5274                                 case Keys.Up:
5275                                         return ProcessUpKey (e.KeyData);
5276                                 case Keys.D0:
5277                                 case Keys.NumPad0:
5278                                         return ProcessZeroKey (e.KeyData);
5279                         }
5280                         
5281                         return false;
5282                 }
5283
5284                 protected bool ProcessDeleteKey (Keys keyData)
5285                 {
5286                         if (!AllowUserToDeleteRows || SelectedRows.Count == 0)
5287                                 return false;
5288
5289                         for (int i = SelectedRows.Count - 1; i >= 0; i--) {
5290                                 DataGridViewRow row = SelectedRows[i];
5291
5292                                 if (row.IsNewRow)
5293                                         continue;
5294
5295                                 if (hover_cell != null && hover_cell.OwningRow == row)
5296                                         hover_cell = null;
5297                                         
5298                                 if (DataManager != null)
5299                                         DataManager.RemoveAt (row.Index);
5300                                 else
5301                                         Rows.RemoveAt (row.Index);
5302                         }
5303
5304                         return true;
5305                 }
5306
5307                 protected override bool ProcessDialogKey (Keys keyData)
5308                 {
5309                         switch (keyData) {
5310                                 case Keys.Tab:
5311                                 case Keys.Shift | Keys.Tab:
5312                                         if (standardTab)
5313                                                 return base.ProcessDialogKey (keyData & ~Keys.Control);
5314                                                 
5315                                         if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
5316                                                 return true;
5317                                                 
5318                                         break;
5319                                 case Keys.Control | Keys.Tab:
5320                                 case Keys.Control | Keys.Shift | Keys.Tab:
5321                                         if (!standardTab)
5322                                                 return base.ProcessDialogKey (keyData & ~Keys.Control);
5323
5324                                         if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
5325                                                 return true;
5326                                                 
5327                                         break;
5328                                 case Keys.Enter:
5329                                 case Keys.Escape:
5330                                         if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
5331                                                 return true;
5332                                                 
5333                                         break;
5334                         }
5335                         
5336                         return base.ProcessDialogKey(keyData);
5337                 }
5338
5339                 protected bool ProcessDownKey (Keys keyData)
5340                 {
5341                         int current_row = CurrentCellAddress.Y;
5342                         
5343                         if (current_row < Rows.Count - 1) {
5344                                 // Move to the last cell in the column
5345                                 if ((keyData & Keys.Control) == Keys.Control)
5346                                         MoveCurrentCell (CurrentCellAddress.X, Rows.Count - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5347                                 // Move one cell down
5348                                 else
5349                                         MoveCurrentCell (CurrentCellAddress.X, current_row + 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5350                                 
5351                                 return true;
5352                         }
5353                         
5354                         return false;
5355                 }
5356
5357                 protected bool ProcessEndKey (Keys keyData)
5358                 {
5359                         int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5360
5361                         // Move to the last cell in the control
5362                         if ((keyData & Keys.Control) == Keys.Control) {
5363                                 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), Rows.Count - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5364                                 return true;
5365                         }
5366                         
5367                         // Move to the last cell in the row
5368                         if (disp_index < Columns.Count - 1) {
5369                                 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5370                                 return true;
5371                         }
5372
5373                         return false;
5374                 }
5375
5376                 protected bool ProcessEnterKey (Keys keyData)
5377                 {
5378                         if (ProcessDownKey (keyData))
5379                                 return true;
5380                         
5381                         // ProcessDown may fail if we are on the last row,
5382                         // but Enter should still EndEdit if this is the last row
5383                         EndEdit ();
5384                         return true;
5385                 }
5386
5387                 protected bool ProcessEscapeKey (Keys keyData)
5388                 {
5389                         if (!IsCurrentCellInEditMode)
5390                                 return false;
5391
5392                         CancelEdit ();
5393                         return true;
5394                 }
5395
5396                 protected bool ProcessF2Key (Keys keyData)
5397                 {
5398                         if (editMode == DataGridViewEditMode.EditOnF2 || editMode == DataGridViewEditMode.EditOnKeystrokeOrF2) {
5399                                 BeginEdit (true);
5400                                 return true;
5401                         }
5402                         
5403                         return false;
5404                 }
5405
5406                 protected bool ProcessHomeKey (Keys keyData)
5407                 {
5408                         int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5409
5410                         // Move to the first cell in the control
5411                         if ((keyData & Keys.Control) == Keys.Control) {
5412                                 MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5413                                 return true;
5414                         }
5415                         
5416                         // Move to the first cell in the row
5417                         if (disp_index > 0) {
5418                                 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5419                                 return true;
5420                         }
5421
5422                         return false;
5423                 }
5424
5425                 [MonoInternalNote ("What does insert do?")]
5426                 protected bool ProcessInsertKey (Keys keyData)
5427                 {
5428                         return false;
5429                 }
5430
5431                 protected override bool ProcessKeyEventArgs (ref Message m)
5432                 {
5433                         DataGridViewCell cell = CurrentCell;
5434                         
5435                         if (cell != null) {
5436                                 if (cell.KeyEntersEditMode (new KeyEventArgs ((Keys)m.WParam.ToInt32 ())))
5437                                         BeginEdit (true);
5438                                 if (EditingControl != null && ((Msg)m.Msg == Msg.WM_KEYDOWN || (Msg)m.Msg == Msg.WM_CHAR))
5439                                         XplatUI.SendMessage (EditingControl.Handle, (Msg)m.Msg, m.WParam, m.LParam);
5440                         }
5441
5442                         return base.ProcessKeyEventArgs (ref m);
5443                 }
5444
5445                 protected override bool ProcessKeyPreview (ref Message m)
5446                 {
5447                         if ((Msg)m.Msg == Msg.WM_KEYDOWN && (IsCurrentCellInEditMode || m.HWnd == horizontalScrollBar.Handle || m.HWnd == verticalScrollBar.Handle)) {
5448                                 KeyEventArgs e = new KeyEventArgs ((Keys)m.WParam.ToInt32 ());
5449                         
5450                                 IDataGridViewEditingControl ctrl = (IDataGridViewEditingControl)EditingControlInternal;
5451                                 
5452                                 if (ctrl != null)
5453                                         if (ctrl.EditingControlWantsInputKey (e.KeyData, false))
5454                                                 return false;
5455
5456                                 switch (e.KeyData) {
5457                                         case Keys.Escape:
5458                                         case Keys.Down:
5459                                         case Keys.Up:
5460                                         case Keys.Left:
5461                                         case Keys.Right:
5462                                         case Keys.Tab:
5463                                         case Keys.Prior:
5464                                         case Keys.Next:
5465                                                 return ProcessDataGridViewKey (e);
5466                                 }
5467                         }
5468                         
5469                         return base.ProcessKeyPreview (ref m);
5470                 }
5471
5472                 protected bool ProcessLeftKey (Keys keyData)
5473                 {
5474                         int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5475
5476                         if (disp_index > 0) {
5477                                 // Move to the first cell in the row
5478                                 if ((keyData & Keys.Control) == Keys.Control)
5479                                         MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5480                                 // Move one cell to the left
5481                                 else
5482                                         MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5483
5484                                 return true;
5485                         }
5486
5487                         return false;
5488                 }
5489
5490                 // Page Down
5491                 protected bool ProcessNextKey (Keys keyData)
5492                 {
5493                         int current_row = CurrentCellAddress.Y;
5494
5495                         if (current_row < Rows.Count - 1) {
5496                                 // Move one "page" of cells down
5497                                 int new_row = Math.Min (Rows.Count - 1, current_row + DisplayedRowCount (false));
5498
5499                                 MoveCurrentCell (CurrentCellAddress.X, new_row, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5500
5501                                 return true;
5502                         }
5503
5504                         return false;
5505                 }
5506
5507                 // Page Up
5508                 protected bool ProcessPriorKey (Keys keyData)
5509                 {
5510                         int current_row = CurrentCellAddress.Y;
5511
5512                         if (current_row > 0) {
5513                                 // Move one "page" of cells up
5514                                 int new_row = Math.Max (0, current_row - DisplayedRowCount (false));
5515
5516                                 MoveCurrentCell (CurrentCellAddress.X, new_row, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5517
5518                                 return true;
5519                         }
5520
5521                         return false;
5522                 }
5523
5524                 protected bool ProcessRightKey (Keys keyData)
5525                 {
5526                         int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5527
5528                         if (disp_index < Columns.Count - 1) {
5529                                 // Move to the last cell in the row
5530                                 if ((keyData & Keys.Control) == Keys.Control)
5531                                         MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5532                                 // Move one cell to the right
5533                                 else
5534                                         MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index + 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5535                                 
5536                                 return true;
5537                         }
5538
5539                         return false;
5540                 }
5541
5542                 protected bool ProcessSpaceKey (Keys keyData)
5543                 {
5544                         if ((keyData & Keys.Shift) == Keys.Shift) {
5545                                 if (selectionMode == DataGridViewSelectionMode.RowHeaderSelect) {
5546                                         SetSelectedRowCore (CurrentCellAddress.Y, true);
5547                                         InvalidateRow (CurrentCellAddress.Y);
5548                                         return true;
5549                                 }
5550                                 if (selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect) {
5551                                         SetSelectedColumnCore (CurrentCellAddress.X, true);
5552                                         InvalidateColumn (CurrentCellAddress.X);
5553                                         return true;
5554                                 }
5555                         }
5556                         
5557                         if (CurrentCell is DataGridViewButtonCell || CurrentCell is DataGridViewLinkCell || CurrentCell is DataGridViewCheckBoxCell) {
5558                                 DataGridViewCellEventArgs e = new DataGridViewCellEventArgs (CurrentCell.ColumnIndex, CurrentCell.RowIndex);
5559                                 
5560                                 OnCellClick (e);
5561                                 OnCellContentClick (e);
5562                                 
5563                                 if (CurrentCell is DataGridViewButtonCell)
5564                                         (CurrentCell as DataGridViewButtonCell).OnClickInternal (e);
5565                                 if (CurrentCell is DataGridViewCheckBoxCell)
5566                                         (CurrentCell as DataGridViewCheckBoxCell).OnClickInternal (e);
5567                                         
5568                                 return true;
5569                         }
5570                         
5571                         return false;
5572                 }
5573
5574                 protected bool ProcessTabKey (Keys keyData)
5575                 {
5576                         Form f = FindForm ();
5577                         
5578                         if (f != null)
5579                                 f.ActivateFocusCues ();
5580                         
5581                         int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5582
5583                         // Tab goes forward
5584                         // Shift-tab goes backwards
5585                         if ((keyData & Keys.Shift) == Keys.Shift) {
5586                                 if (disp_index > 0) {
5587                                         // Move one cell to the left
5588                                         MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, false, true);
5589                                         return true;
5590                                 } else if (currentCellAddress.Y > 0) {
5591                                         // Move to the last cell in the previous row
5592                                         MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y - 1, true, false, false, true);
5593                                         return true;
5594                                 }
5595                         
5596                         } else {
5597                                 if (disp_index < Columns.Count - 1) {
5598                                         // Move one cell to the right
5599                                         MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index + 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, false, true);
5600
5601                                         return true;
5602                                 } else if (currentCellAddress.Y < Rows.Count - 1) {
5603                                         // Move to the first cell in the next row
5604                                         MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y + 1, true, false, false, true);
5605                                         return true;
5606                                 }
5607
5608                         
5609                         }
5610                         
5611                         return false;
5612                 }
5613
5614                 protected bool ProcessUpKey (Keys keyData)
5615                 {
5616                         int current_row = CurrentCellAddress.Y;
5617
5618                         if (current_row > 0) {
5619                                 // Move to the first cell in the column
5620                                 if ((keyData & Keys.Control) == Keys.Control)
5621                                         MoveCurrentCell (CurrentCellAddress.X, 0, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5622                                 // Move one cell up
5623                                 else
5624                                         MoveCurrentCell (CurrentCellAddress.X, current_row - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5625
5626                                 return true;
5627                         }
5628
5629                         return false;
5630                 }
5631
5632                 protected bool ProcessZeroKey (Keys keyData)
5633                 {
5634                         if ((keyData & Keys.Control) == Keys.Control && CurrentCell.EditType != null) {
5635                                 CurrentCell.Value = DBNull.Value;
5636                                 InvalidateCell (CurrentCell);
5637                                 return true;
5638                         }
5639                         
5640                         return false;
5641                 }
5642
5643                 protected override void SetBoundsCore (int x, int y, int width, int height, BoundsSpecified specified) {
5644                         base.SetBoundsCore(x, y, width, height, specified);
5645                 }
5646
5647                 [MonoTODO ("Does not use validateCurrentCell")]
5648                 protected virtual bool SetCurrentCellAddressCore (int columnIndex, int rowIndex, bool setAnchorCellAddress, bool validateCurrentCell, bool throughMouseClick)
5649                 {
5650                         if ((columnIndex < 0 || columnIndex > Columns.Count - 1) && rowIndex != -1)
5651                                 throw new ArgumentOutOfRangeException ("columnIndex");
5652                         if ((rowIndex < 0 || rowIndex > Rows.Count - 1) && columnIndex != -1)
5653                                 throw new ArgumentOutOfRangeException ("rowIndex");
5654                         
5655                         DataGridViewCell cell;
5656                         
5657                         if (columnIndex == -1 && rowIndex == -1)
5658                                 cell = null;
5659                         else
5660                                 cell = Rows.SharedRow (rowIndex).Cells[columnIndex];
5661                         
5662                         if (cell != null && !cell.Visible)
5663                                 throw new InvalidOperationException ("cell is not visible");
5664                                 
5665                         // Always update the current cell address property
5666                         // If the row has moved it would be out of date.
5667                         if (currentCell != null) {
5668                                 if (setAnchorCellAddress) {
5669                                         anchor_cell.X = currentCell.ColumnIndex;
5670                                         anchor_cell.Y = currentCell.RowIndex;
5671                                 }
5672                                 currentCellAddress.X = currentCell.ColumnIndex;
5673                                 currentCellAddress.Y = currentCell.RowIndex;
5674                         }
5675
5676                         if (cell != currentCell) {
5677                                 if (currentCell != null) {
5678                                         if (currentCell.IsInEditMode) {
5679                                                 if (!EndEdit ())
5680                                                         return false;
5681                                                 else if (currentCell.RowIndex == NewRowIndex && new_row_editing)
5682                                                         CancelEdit ();
5683                                         } else {
5684                                                 // CancelEdit will replace the uncommited real editing row with a place holder row
5685                                                 if (new_row_editing && currentCell.RowIndex == NewRowIndex)
5686                                                         CancelEdit ();
5687                                         }
5688                                         OnCellLeave (new DataGridViewCellEventArgs(currentCell.ColumnIndex, currentCell.RowIndex));
5689                                         OnRowLeave (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
5690                                 }
5691
5692                                 currentCell = cell;
5693                                 if (setAnchorCellAddress)
5694                                         anchor_cell = new Point (columnIndex, rowIndex);
5695                                 currentCellAddress = new Point (columnIndex, rowIndex);
5696
5697                                 if (cell != null) {
5698                                         UpdateBindingPosition (cell.RowIndex);
5699                                         OnRowEnter (new DataGridViewCellEventArgs (cell.ColumnIndex, cell.RowIndex));
5700                                         OnCellEnter (new DataGridViewCellEventArgs(cell.ColumnIndex, cell.RowIndex));
5701                                 }
5702                                 OnCurrentCellChanged (EventArgs.Empty);
5703
5704                                 if (cell != null) {
5705                                         // If the user begins an edit in the NewRow, add a new real row
5706                                         if (AllowUserToAddRows && cell.RowIndex == NewRowIndex && !is_binding && !new_row_editing) {
5707                                                 // OnUserAddedRow will add a real row and reset the current cell
5708                                                 OnUserAddedRow (new DataGridViewRowEventArgs (Rows[NewRowIndex]));
5709                                         } else {
5710                                                 if (editMode == DataGridViewEditMode.EditOnEnter)
5711                                                         BeginEdit (true);
5712                                         }
5713                                 }
5714                         } else {
5715                                 if (cell != null && throughMouseClick)
5716                                         BeginEdit (true);
5717                         }
5718
5719                         return true;
5720                 }
5721
5722                 protected virtual void SetSelectedCellCore (int columnIndex, int rowIndex, bool selected) {
5723                         rows [rowIndex].Cells [columnIndex].Selected = selected;
5724                         
5725                         OnSelectionChanged (EventArgs.Empty);
5726                 }
5727
5728                 internal void SetSelectedColumnCoreInternal (int columnIndex, bool selected) {
5729                         SetSelectedColumnCore (columnIndex, selected);
5730                 }       
5731                 
5732                 protected virtual void SetSelectedColumnCore (int columnIndex, bool selected) {
5733                         if (selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect && selectionMode != DataGridViewSelectionMode.FullColumnSelect)
5734                                 return; 
5735                         
5736                         DataGridViewColumn col = columns [columnIndex];
5737                         
5738                         col.SelectedInternal = selected;
5739                         
5740                         if (selected_columns == null)
5741                                 selected_columns = new DataGridViewSelectedColumnCollection ();
5742
5743                         bool selectionChanged = false;
5744                         if (!selected && selected_columns.Contains (col)) {
5745                                 selected_columns.InternalRemove (col);
5746                                 selectionChanged = true;
5747                         } else if (selected && !selected_columns.Contains (col)) {
5748                                 selected_columns.InternalAdd (col);
5749                                 selectionChanged = true;
5750                         }
5751
5752                         if (selectionChanged)
5753                                 OnSelectionChanged (EventArgs.Empty);
5754
5755                         Invalidate();
5756                 }
5757
5758                 internal void SetSelectedRowCoreInternal (int rowIndex, bool selected) {
5759                         if (rowIndex >= 0 && rowIndex < Rows.Count)
5760                                 SetSelectedRowCore (rowIndex, selected);
5761                 }       
5762
5763                 protected virtual void SetSelectedRowCore (int rowIndex, bool selected) {
5764                         DataGridViewRow row = rows [rowIndex];
5765                         
5766                         row.SelectedInternal = selected;
5767                         
5768                         if (selected_rows == null)
5769                                 selected_rows = new DataGridViewSelectedRowCollection (this);
5770
5771                         bool selectionChanged = false;
5772                         if (!selected && selected_rows.Contains (row)) {
5773                                 selected_rows.InternalRemove (row);
5774                                 selectionChanged = true;
5775                         } else if (selected && !selected_rows.Contains (row)) {
5776                                 selected_rows.InternalAdd (row);
5777                                 selectionChanged = true;
5778                         }
5779
5780                         if (selectionChanged)
5781                                 OnSelectionChanged (EventArgs.Empty);
5782
5783                         Invalidate();
5784                 }
5785
5786                 protected override void WndProc (ref Message m)
5787                 {
5788                         base.WndProc (ref m);
5789                 }
5790
5791                 internal void InternalOnCellClick (DataGridViewCellEventArgs e)
5792                 {
5793                         OnCellClick (e);
5794                 }
5795
5796                 internal void InternalOnCellContentClick (DataGridViewCellEventArgs e)
5797                 {
5798                         OnCellContentClick (e);
5799                 }
5800
5801                 internal void InternalOnCellContentDoubleClick (DataGridViewCellEventArgs e)
5802                 {
5803                         OnCellContentDoubleClick (e);
5804                 }
5805
5806                 internal void InternalOnCellValueChanged (DataGridViewCellEventArgs e)
5807                 {
5808                         OnCellValueChanged (e);
5809                 }
5810
5811                 internal void InternalOnDataError (DataGridViewDataErrorEventArgs e)
5812                 {
5813                         /////////////// false? ////////////
5814                         OnDataError (false, e);
5815                 }
5816
5817                 internal void InternalOnMouseWheel (MouseEventArgs e)
5818                 {
5819                         OnMouseWheel (e);
5820                 }
5821
5822                 internal void OnHScrollBarScroll (object sender, ScrollEventArgs e)
5823                 {
5824                         int lastRightVisibleColumntIndex = Columns.Count - DisplayedColumnCount (false);
5825                         horizontalScrollingOffset = e.NewValue;
5826                         int left = 0;
5827
5828                         for (int index = 0; index < Columns.Count; index++) {
5829                                 DataGridViewColumn col = Columns[index];
5830
5831                                 if (col.Index >= lastRightVisibleColumntIndex) {
5832                                         first_col_index = lastRightVisibleColumntIndex;
5833                                         Invalidate ();
5834                                         OnScroll (e);
5835                                 } else if (e.NewValue < left + col.Width) {
5836                                         if (first_col_index != index) {
5837                                                 first_col_index = index;
5838                                                 Invalidate ();
5839                                                 OnScroll (e);
5840                                         }
5841
5842                                         return;
5843                                 }
5844
5845                                 left += col.Width;
5846                         }
5847                 }
5848
5849                 internal void OnVScrollBarScroll (object sender, ScrollEventArgs e)
5850                 {
5851                         verticalScrollingOffset = e.NewValue;
5852                         if (Rows.Count == 0)
5853                                 return;
5854
5855                         int top = 0;
5856                         int lastTopVisibleRowIndex = Rows.Count - DisplayedRowCount (false);
5857
5858                         for (int index = 0; index < Rows.Count; index++) {
5859                                 DataGridViewRow row = Rows[index];
5860                                 if (!row.Visible)
5861                                         continue;
5862
5863                                 if (row.Index >= lastTopVisibleRowIndex) {
5864                                         first_row_index = lastTopVisibleRowIndex;
5865                                         Invalidate ();
5866                                         OnScroll (e);
5867                                 } else if (e.NewValue < top + row.Height) {
5868                                         if (first_row_index != index) {
5869                                                 first_row_index = index;
5870                                                 Invalidate ();
5871                                                 OnScroll (e);
5872                                         }
5873                                         
5874                                         return;
5875                                 }
5876                                 
5877                                 top += row.Height;
5878                         }
5879                         
5880                         first_row_index = lastTopVisibleRowIndex;
5881                         Invalidate ();
5882                         OnScroll (e);
5883                 }
5884
5885                 internal void RaiseCellStyleChanged (DataGridViewCellEventArgs e) {
5886                         OnCellStyleChanged(e);
5887                 }
5888
5889                 internal void OnColumnCollectionChanged (object sender, CollectionChangeEventArgs e) {
5890                         switch (e.Action) {
5891                                 case CollectionChangeAction.Add:
5892                                         OnColumnAddedInternal(new DataGridViewColumnEventArgs(e.Element as DataGridViewColumn));
5893                                         break;
5894                                 case CollectionChangeAction.Remove:
5895                                         OnColumnPostRemovedInternal(new DataGridViewColumnEventArgs(e.Element as DataGridViewColumn));
5896                                         break;
5897                                 case CollectionChangeAction.Refresh:
5898                                         hover_cell = null;
5899                                         MoveCurrentCell (-1, -1, true, false, false, true);
5900                                         break;
5901                         }
5902                 }
5903
5904                 // Resizes all columns according to their AutoResizeMode property.
5905                 // First all the columns that aren't Filled are resized, then we resize all the Filled columns.
5906                 internal void AutoResizeColumnsInternal ()
5907                 {
5908                         for (int i = 0; i < Columns.Count; i++)
5909                                 AutoResizeColumnInternal (i, Columns [i].InheritedAutoSizeMode);
5910                         
5911                         AutoFillColumnsInternal ();
5912                 }
5913
5914                 internal void AutoFillColumnsInternal ()
5915                 {
5916                         float totalFillWeight = 0;
5917                         int FillCount = 0; // The number of columns that has AutoSizeMode.Fill set
5918                         int spaceLeft = ClientSize.Width - (verticalScrollBar.VisibleInternal ? verticalScrollBar.Width : 0);
5919
5920                         if (RowHeadersVisible) {
5921                                 spaceLeft -= RowHeadersWidth;
5922                         }
5923                         spaceLeft -= BorderWidth * 2;
5924                         
5925                         int [] fixed_widths = new int [Columns.Count];
5926                         int [] new_widths = new int [Columns.Count];
5927                         bool fixed_any = false;
5928                         
5929                         for (int i = 0; i < Columns.Count; i++) {
5930                                 DataGridViewColumn col = Columns [i];
5931
5932                                 if (!col.Visible)
5933                                         continue;
5934
5935                                 switch (col.InheritedAutoSizeMode) {
5936                                 case DataGridViewAutoSizeColumnMode.Fill:
5937                                         FillCount++;
5938                                         totalFillWeight += col.FillWeight;
5939                                         break;
5940                                 case DataGridViewAutoSizeColumnMode.AllCellsExceptHeader:
5941                                 case DataGridViewAutoSizeColumnMode.AllCells:
5942                                 case DataGridViewAutoSizeColumnMode.DisplayedCells:
5943                                 case DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader:
5944                                 case DataGridViewAutoSizeColumnMode.None:
5945                                 case DataGridViewAutoSizeColumnMode.NotSet:
5946                                         spaceLeft -= Columns [i].Width;
5947                                         break;
5948                                 }
5949                         }
5950
5951                         spaceLeft = Math.Max (0, spaceLeft);
5952                         
5953                         do {
5954                                 fixed_any = false;
5955                                 for (int i = 0; i < columns.Count; i++) {
5956                                         DataGridViewColumn col = Columns [i];
5957                                         int width;
5958                                         
5959                                         if (col.InheritedAutoSizeMode != DataGridViewAutoSizeColumnMode.Fill)
5960                                                 continue;
5961                                 
5962                                         if (!col.Visible)
5963                                                 continue;
5964                                                 
5965                                         if (fixed_widths [i] != 0)
5966                                                 continue;
5967                                         
5968                                         width = (totalFillWeight == 0) ? 0 : (int) Math.Round (spaceLeft * (col.FillWeight / totalFillWeight), 0);
5969                                         
5970                                         if (width < 0)
5971                                                 width = 0;
5972                                         
5973                                         if (width < col.MinimumWidth) {
5974                                                 width = col.MinimumWidth;
5975                                                 fixed_widths [i] = width;
5976                                                 fixed_any = true;
5977                                                 spaceLeft -= width;
5978                                                 totalFillWeight -= col.FillWeight;
5979                                         }
5980
5981                                         new_widths [i] = width;
5982                                 }
5983                         } while (fixed_any);
5984
5985                         for (int i = 0; i < columns.Count; i++) {
5986                                 if (Columns [i].InheritedAutoSizeMode != DataGridViewAutoSizeColumnMode.Fill)
5987                                         continue;
5988
5989                                 if (!Columns[i].Visible)
5990                                         continue;
5991
5992                                 Columns [i].Width = new_widths [i];
5993                         }
5994                 }
5995
5996                 internal void AutoResizeColumnInternal (int columnIndex, DataGridViewAutoSizeColumnMode mode)
5997                 {
5998                         // http://msdn2.microsoft.com/en-us/library/ms171605.aspx
5999                         int size = 0;
6000
6001                         DataGridViewColumn col = Columns [columnIndex];
6002                         
6003                         switch (mode) {
6004                         case DataGridViewAutoSizeColumnMode.Fill:
6005                                 return;
6006                         case DataGridViewAutoSizeColumnMode.AllCellsExceptHeader:
6007                         case DataGridViewAutoSizeColumnMode.AllCells:
6008                         case DataGridViewAutoSizeColumnMode.DisplayedCells:
6009                         case DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader:
6010                                 size  = Math.Max (CalculateColumnCellWidth (columnIndex, col.InheritedAutoSizeMode), 
6011                                                   col.HeaderCell.ContentBounds.Width);
6012                                 break;
6013                         case DataGridViewAutoSizeColumnMode.ColumnHeader:
6014                                 size = col.HeaderCell.ContentBounds.Width;
6015                                 break;
6016                         default:
6017                                 size = col.Width;
6018                                 break;
6019                         }
6020
6021                         if (size < 0)
6022                                 size = 0;
6023                         if (size < col.MinimumWidth)
6024                                 size = col.MinimumWidth;
6025
6026                         col.Width = size;
6027                 }
6028                 
6029                 internal int CalculateColumnCellWidth (int index, DataGridViewAutoSizeColumnMode mode)
6030                 {
6031                         int first_row = 0;
6032                         int last_row = Rows.Count;
6033                         int result = 0;
6034
6035                         if (mode == DataGridViewAutoSizeColumnMode.DisplayedCells || 
6036                             mode == DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader) {
6037                                 first_row = first_row_index;
6038                                 last_row = DisplayedRowCount (true);;
6039                         }
6040                         
6041                         for (int i = first_row; i < last_row; i++) {
6042                                 if (!Rows[i].Visible)
6043                                         continue;
6044                                 
6045                                 int cell_width = Rows[i].Cells[index].PreferredSize.Width;
6046                                 result = Math.Max (result, cell_width);
6047                         }
6048                         
6049                         return result;
6050                 }
6051
6052                 Rectangle GetHeaderCellBounds (DataGridViewHeaderCell cell)
6053                 {
6054                         Rectangle bounds = new Rectangle (ClientRectangle.Location, cell.Size);
6055                         if (cell is DataGridViewColumnHeaderCell) {
6056                                 if (RowHeadersVisible)
6057                                         bounds.X += RowHeadersWidth;
6058                                 List<DataGridViewColumn> sortedColumns = columns.ColumnDisplayIndexSortedArrayList;
6059                                 for (int index = first_col_index; index < sortedColumns.Count; index++) {
6060                                         DataGridViewColumn column = sortedColumns [index];
6061                                         if (column.Index == cell.ColumnIndex)
6062                                                 break;
6063                                         bounds.X += column.Width;
6064                                 }
6065                         } else {
6066                                 if (ColumnHeadersVisible)
6067                                         bounds.Y += ColumnHeadersHeight;
6068                                 for (int index = first_row_index; index < Rows.Count; index++) {
6069                                         DataGridViewRow row = GetRowInternal (index);
6070                                         if (row.HeaderCell == cell)
6071                                                 break;
6072                                         bounds.Y += row.Height;
6073                                 }
6074                         }
6075                         return bounds;
6076                 }
6077
6078                 private void PrepareEditingRow (bool cell_changed, bool column_changed)
6079                 {
6080                         if (new_row_editing)
6081                                 return;
6082
6083                         bool show = false;
6084                         
6085                         show = ColumnCount > 0 && AllowUserToAddRows;
6086
6087                         if (!show) {
6088                                 RemoveEditingRow ();
6089                         } else if (show) {
6090                                 if (editing_row != null && (cell_changed || column_changed)) {
6091                                         // The row changed, it's no longer an editing row.
6092                                         //    or
6093                                         // The number of columns has changed, we need a new editing row.
6094                                         RemoveEditingRow ();
6095                                 }
6096                                 if (editing_row == null) {
6097                                         editing_row = RowTemplateFull;
6098                                         Rows.AddInternal (editing_row, false);
6099                                 }
6100                         }
6101                 }
6102                 
6103                 internal void RemoveEditingRow ()
6104                 {
6105                         if (editing_row != null) {
6106                                 if (Rows.Contains (editing_row))
6107                                     Rows.RemoveInternal (editing_row);
6108                                 editing_row = null;
6109                         }
6110                 }
6111
6112                 internal DataGridViewRow EditingRow {
6113                         get { return editing_row; }
6114                 }
6115
6116                 private void AddBoundRow (object element)
6117                 {
6118                         // Don't add rows if there are no columns
6119                         if (ColumnCount == 0)
6120                                 return;
6121                                 
6122                         DataGridViewRow row = (DataGridViewRow)RowTemplateFull;
6123                         rows.AddInternal (row, false);
6124                 }
6125                 
6126                 private bool IsColumnAlreadyBound (string name)
6127                 {
6128                         foreach (DataGridViewColumn col in Columns)
6129                                 if (String.Compare (col.DataPropertyName, name, true) == 0)
6130                                         return true;
6131
6132                         return false;
6133                 }
6134
6135                 private DataGridViewColumn CreateColumnByType (Type type)
6136                 {
6137                         if (type == typeof (bool))
6138                                 return new DataGridViewCheckBoxColumn ();
6139                         else if (typeof(Bitmap).IsAssignableFrom (type))
6140                                 return new DataGridViewImageColumn ();
6141                                 
6142                         return new DataGridViewTextBoxColumn ();
6143                 }
6144                 
6145                 private void ClearBinding ()
6146                 {
6147                         if (IsCurrentCellInEditMode && !EndEdit ())
6148                                 CancelEdit ();
6149                         MoveCurrentCell (-1, -1, false, false, false, true);
6150
6151                         if (DataManager != null) {
6152                                 DataManager.ListChanged -= OnListChanged;
6153                                 DataManager.PositionChanged -= OnListPositionChanged;
6154                                 columns.ClearAutoGeneratedColumns ();
6155                                 rows.Clear ();
6156                                 RemoveEditingRow ();
6157                         }
6158                 }
6159
6160                 private void ResetRows ()
6161                 {
6162                         rows.Clear ();
6163                         RemoveEditingRow ();
6164                         if (DataManager != null) {
6165                                 foreach (object element in DataManager.List)
6166                                         AddBoundRow (element);
6167                         }
6168                         PrepareEditingRow (false, true);
6169                         OnListPositionChanged (this, EventArgs.Empty);
6170                 }
6171                 
6172                 private void DoBinding ()
6173                 {
6174                         /* The System.Windows.Forms.DataGridView class supports the standard Windows Forms data-binding model. This means the data source can be of any type that implements:
6175                          - the System.Collections.IList interface, including one-dimensional arrays.
6176                          - the System.ComponentModel.IListSource interface, such as the System.Data.DataTable and System.Data.DataSet classes.
6177                          - the System.ComponentModel.IBindingList interface, such as the System.ComponentModel.Collections.BindingList<> class.
6178                          - the System.ComponentModel.IBindingListView interface, such as the System.Windows.Forms.BindingSource class.
6179                         */
6180                         
6181                         if (dataSource != null && DataManager != null) {
6182                                 if (autoGenerateColumns) {
6183                                         is_autogenerating_columns = true;
6184
6185                                         foreach (PropertyDescriptor property in DataManager.GetItemProperties()) {
6186                                                 // This keeps out things like arrays
6187                                                 if ((typeof(ICollection).IsAssignableFrom (property.PropertyType)))
6188                                                         continue;
6189                                                 if (!property.IsBrowsable)
6190                                                         continue;
6191
6192                                                 if (IsColumnAlreadyBound (property.Name))
6193                                                         continue;
6194
6195                                                 DataGridViewColumn col = CreateColumnByType (property.PropertyType);
6196                                                 col.Name = property.DisplayName;
6197                                                 col.DataPropertyName = property.Name;
6198                                                 col.ReadOnly = !DataManager.AllowEdit || property.IsReadOnly;
6199                                                 col.ValueType = property.PropertyType;
6200                                                 col.AutoGenerated = true;
6201                                                 columns.Add (col);
6202                                         }
6203
6204                                         is_autogenerating_columns = false;
6205                                 }
6206
6207                                 // DataBind both autogenerated and not columns if there is a matching property
6208                                 foreach (DataGridViewColumn column in columns)
6209                                         column.DataColumnIndex = FindDataColumnIndex (column);
6210
6211                                 foreach (object element in DataManager.List)
6212                                         AddBoundRow (element);
6213
6214                                 DataManager.ListChanged += OnListChanged;
6215                                 DataManager.PositionChanged += OnListPositionChanged;
6216                                 OnDataBindingComplete (new DataGridViewBindingCompleteEventArgs (ListChangedType.Reset));
6217                                 OnListPositionChanged (this, EventArgs.Empty);
6218                         } else {
6219                                 if (Rows.Count > 0 && Columns.Count > 0)
6220                                         MoveCurrentCell (0, 0, true, false, false, false);
6221                         }
6222
6223                         PrepareEditingRow (false, true);
6224                 }
6225                 
6226                 private void MoveCurrentCell (int x, int y, bool select, bool isControl, bool isShift, bool scroll)
6227                 {
6228                         if (x == -1 || y == -1)
6229                                 x = y = -1;
6230                         else {
6231                                 if (x < 0 || x > Columns.Count - 1)
6232                                         throw new ArgumentOutOfRangeException ("x");
6233                                 if (y < 0 || y > Rows.Count - 1)
6234                                         throw new ArgumentOutOfRangeException ("y");
6235
6236                                 if (!Rows[y].Visible) {
6237                                         for (int i = y; i < Rows.Count; i++) {
6238                                                 if (Rows[i].Visible) {
6239                                                         y = i;
6240                                                         break;
6241                                                 }
6242                                         }
6243                                 }
6244
6245                                 if (!Columns[x].Visible) {
6246                                         for (int i = x; i < Columns.Count; i++) {
6247                                                 if (Columns[i].Visible) {
6248                                                         x = i;
6249                                                         break;
6250                                                 }
6251                                         }
6252                                 }
6253
6254                                 // in case either no visible columns or rows
6255                                 if (!Rows[y].Visible || !Columns[x].Visible)
6256                                         x = y = -1;
6257                         }
6258
6259                         if (!SetCurrentCellAddressCore (x, y, true, false, false)) {
6260                                 ClearSelection ();
6261                                 return;
6262                         }
6263                         if (x == -1 && y == -1) {
6264                                 ClearSelection ();
6265                                 return;
6266                         }
6267
6268                         bool full_row_selected = Rows.SharedRow(CurrentCellAddress.Y).Selected;
6269                         bool full_col_selected = Columns[CurrentCellAddress.X].Selected;
6270                         
6271                         // Move Selection
6272                         DataGridViewSelectionMode mode = selectionMode;
6273                         
6274                         // If we are row header select and we clicked a row header, use full row
6275                         if (mode == DataGridViewSelectionMode.RowHeaderSelect && (x == -1 || (full_row_selected && CurrentCellAddress.X == x)))
6276                                 mode = DataGridViewSelectionMode.FullRowSelect;
6277                         else if (mode == DataGridViewSelectionMode.RowHeaderSelect)
6278                                 mode = DataGridViewSelectionMode.CellSelect;
6279                                 
6280                         // If we are col header select and we clicked a col header, use full col
6281                         if (mode == DataGridViewSelectionMode.ColumnHeaderSelect && (y == -1 || (full_col_selected && CurrentCellAddress.Y == y)))
6282                                 mode = DataGridViewSelectionMode.FullColumnSelect;
6283                         else if (mode == DataGridViewSelectionMode.ColumnHeaderSelect)
6284                                 mode = DataGridViewSelectionMode.CellSelect;
6285                         
6286                         // If the current cell isn't visible, scroll to it
6287                         if (scroll) {
6288                                 int disp_x = ColumnIndexToDisplayIndex (x);
6289                                 bool scrollbarsRefreshed = false;
6290                                 int displayedColumnsCount = DisplayedColumnCount (false);
6291                                 int delta_x = 0;
6292
6293                                 // The trick here is that in order to avoid unnecessary calculations each time a row/column 
6294                                 // is added/removed we recalculate the whole grid size just before the scroll to selection.
6295                                 if (disp_x < first_col_index) {
6296                                         RefreshScrollBars ();
6297                                         scrollbarsRefreshed = true;
6298
6299                                         if (disp_x == 0)
6300                                                 delta_x = horizontalScrollBar.Value;
6301                                         else {
6302                                                 // in case the column got removed
6303                                                 if (first_col_index >= ColumnCount)
6304                                                         first_col_index = ColumnCount - 1;
6305                                                 for (int i = disp_x; i < first_col_index; i++)
6306                                                         delta_x += Columns[ColumnDisplayIndexToIndex (i)].Width;
6307                                         }
6308                                 
6309                                         horizontalScrollBar.SafeValueSet (horizontalScrollBar.Value - delta_x);
6310                                         OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
6311                                 } else if (disp_x > first_col_index + displayedColumnsCount - 1) {
6312                                         RefreshScrollBars ();
6313                                         scrollbarsRefreshed = true;
6314                                         
6315                                         if (disp_x == Columns.Count - 1)
6316                                                 delta_x = horizontalScrollBar.Maximum - horizontalScrollBar.Value;
6317                                         else
6318                                                 for (int i = first_col_index + displayedColumnsCount - 1; i < disp_x && i != -1; i++)
6319                                                         delta_x += Columns[ColumnDisplayIndexToIndex (i)].Width;
6320
6321                                         horizontalScrollBar.SafeValueSet (horizontalScrollBar.Value + delta_x);
6322                                         OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
6323                                 }
6324
6325                                 int disp_y = y;
6326                                 int displayedRowsCount = DisplayedRowCount (false);
6327                                 int delta_y = 0;
6328
6329                                 if (disp_y < first_row_index) {
6330                                         if (!scrollbarsRefreshed)
6331                                                 RefreshScrollBars ();
6332
6333                                         if (disp_y == 0)
6334                                                 delta_y = verticalScrollBar.Value;
6335                                         else {
6336                                                 // in case the row got removed
6337                                                 if (first_row_index >= RowCount)
6338                                                         first_row_index = RowCount - 1;
6339                                                 for (int i = disp_y; i < first_row_index; i++)
6340                                                         delta_y += GetRowInternal (i).Height;
6341                                         }
6342
6343                                         verticalScrollBar.SafeValueSet (verticalScrollBar.Value - delta_y);
6344                                         OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
6345                                 } else if (disp_y > first_row_index + displayedRowsCount - 1) {
6346                                         if (!scrollbarsRefreshed)
6347                                                 RefreshScrollBars ();
6348
6349                                         if (disp_y == Rows.Count - 1)
6350                                                 delta_y = verticalScrollBar.Maximum - verticalScrollBar.Value;
6351                                         else
6352                                                 for (int i = first_row_index + displayedRowsCount - 1; i < disp_y; i++)
6353                                                         delta_y += GetRowInternal (i).Height;
6354
6355                                         verticalScrollBar.SafeValueSet (verticalScrollBar.Value + delta_y);
6356                                         OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));                                
6357                                 }
6358                         }
6359                         
6360                         if (!select)
6361                                 return;
6362                         
6363                         // Clear old selection unless multi-selecting
6364                         if (!isShift)
6365                                 ClearSelection ();
6366                         
6367                         switch (mode) {
6368                                 case DataGridViewSelectionMode.CellSelect:
6369                                         SetSelectedCellCore (x, y, true);
6370                                         break;
6371                                 case DataGridViewSelectionMode.FullRowSelect:
6372                                         SetSelectedRowCore (y, true);
6373                                         break;
6374                                 case DataGridViewSelectionMode.FullColumnSelect:
6375                                         SetSelectedColumnCore (x, true);
6376                                         break;
6377                         }
6378                         
6379                         Invalidate ();
6380                 }
6381                 
6382                 private int ColumnIndexToDisplayIndex (int index)
6383                 {
6384                         if (index == -1)
6385                                 return index;
6386                         return Columns[index].DisplayIndex;
6387                 }
6388                 
6389                 private int ColumnDisplayIndexToIndex (int index)
6390                 {
6391                         return Columns.ColumnDisplayIndexSortedArrayList[index].Index;
6392                 }
6393                 
6394                 private void OnListChanged (object sender, ListChangedEventArgs args)
6395                 {
6396                         switch (args.ListChangedType) {
6397                                 case ListChangedType.ItemAdded:
6398                                         AddBoundRow (DataManager[args.NewIndex]);
6399                                         break;
6400                                 case ListChangedType.ItemDeleted:
6401                                         Rows.RemoveAtInternal (args.NewIndex);
6402                                         break;
6403                                 case ListChangedType.ItemChanged:
6404                                         break;
6405                                 default:
6406                                         ResetRows ();
6407                                         break;
6408                         }
6409                         
6410                         Invalidate ();
6411                 }
6412                 
6413                 private void OnListPositionChanged (object sender, EventArgs args)
6414                 {
6415                         if (Rows.Count > 0 && Columns.Count > 0 && DataManager.Position != -1)
6416                                 MoveCurrentCell (currentCell != null ? currentCell.ColumnIndex : 0, DataManager.Position, 
6417                                                  true, false, false, true);
6418                         else
6419                                 MoveCurrentCell (-1, -1, true, false, false, true);
6420                 }
6421
6422                 private void ReBind ()
6423                 {
6424                         if (!is_binding) {
6425                                 SuspendLayout ();
6426
6427                                 is_binding = true;
6428                                 ClearBinding ();
6429                                 DoBinding ();
6430                                 is_binding = false;
6431
6432                                 ResumeLayout (true);
6433                                 Invalidate ();
6434                         }
6435                 }
6436                 
6437                 private bool MouseOverColumnResize (int col, int mousex)
6438                 {
6439                         if (!allowUserToResizeColumns)
6440                                 return false;
6441                                 
6442                         Rectangle col_bounds = GetCellDisplayRectangle (col, 0, false);
6443
6444                         if (mousex >= col_bounds.Right - 4 && mousex <= col_bounds.Right)
6445                                 return true;
6446
6447                         return false;
6448                 }
6449
6450                 private bool MouseOverRowResize (int row, int mousey)
6451                 {
6452                         if (!allowUserToResizeRows)
6453                                 return false;
6454
6455                         Rectangle row_bounds = GetCellDisplayRectangle (0, row, false);
6456
6457                         if (mousey >= row_bounds.Bottom - 4 && mousey <= row_bounds.Bottom)
6458                                 return true;
6459
6460                         return false;
6461                 }
6462
6463                 private void DrawVerticalResizeLine (int x)
6464                 {
6465                         Rectangle splitter = new Rectangle (x, Bounds.Y + 3 + (ColumnHeadersVisible ? ColumnHeadersHeight : 0), 1, Bounds.Height - 3 - (ColumnHeadersVisible ? ColumnHeadersHeight : 0));
6466                         XplatUI.DrawReversibleRectangle (Handle, splitter, 2);
6467                 }
6468
6469                 private void DrawHorizontalResizeLine (int y)
6470                 {
6471                         Rectangle splitter = new Rectangle (Bounds.X + 3 + (RowHeadersVisible ? RowHeadersWidth : 0), y, Bounds.Width - 3 + (RowHeadersVisible ? RowHeadersWidth : 0), 1);
6472                         XplatUI.DrawReversibleRectangle (Handle, splitter, 2);
6473                 }
6474
6475                 #region Stuff for ToolTips
6476                 private void MouseEnteredErrorIcon (DataGridViewCell item)
6477                 {
6478                         tooltip_currently_showing = item;
6479                         ToolTipTimer.Start ();
6480                 }
6481
6482                 private void MouseLeftErrorIcon (DataGridViewCell item)
6483                 {
6484                         ToolTipTimer.Stop ();
6485                         ToolTipWindow.Hide (this);
6486                         tooltip_currently_showing = null;
6487                 }
6488
6489                 private Timer ToolTipTimer {
6490                         get {
6491                                 if (tooltip_timer == null) {
6492                                         tooltip_timer = new Timer ();
6493                                         tooltip_timer.Enabled = false;
6494                                         tooltip_timer.Interval = 500;
6495                                         tooltip_timer.Tick += new EventHandler (ToolTipTimer_Tick);
6496                                 }
6497
6498                                 return tooltip_timer;
6499                         }
6500                 }
6501
6502                 private ToolTip ToolTipWindow {
6503                         get {
6504                                 if (tooltip_window == null)
6505                                         tooltip_window = new ToolTip ();
6506
6507                                 return tooltip_window;
6508                         }
6509                 }
6510
6511                 private void ToolTipTimer_Tick (object o, EventArgs args)
6512                 {
6513                         string tooltip = tooltip_currently_showing.ErrorText;
6514
6515                         if (!string.IsNullOrEmpty (tooltip))
6516                                 ToolTipWindow.Present (this, tooltip);
6517
6518                         ToolTipTimer.Stop ();
6519                 }
6520                 #endregion
6521
6522                 private class ColumnSorter : IComparer
6523                 {
6524                         int column;
6525                         int direction = 1;
6526                         bool numeric_sort;
6527                         
6528                         public ColumnSorter (DataGridViewColumn column, ListSortDirection direction, bool numeric)
6529                         {
6530                                 this.column = column.Index;
6531                                 this.numeric_sort = numeric;
6532                                 
6533                                 if (direction == ListSortDirection.Descending)
6534                                         this.direction = -1;
6535                         }
6536
6537                         #region IComparer Members
6538                         public int Compare (object x, object y)
6539                         {
6540                                 DataGridViewRow row1 = (DataGridViewRow)x;
6541                                 DataGridViewRow row2 = (DataGridViewRow)y;
6542
6543                                 if (row1.Cells[column].ValueType == typeof (DateTime) && row2.Cells[column].ValueType == typeof (DateTime))
6544                                         return DateTime.Compare ((DateTime)row1.Cells[column].Value, (DateTime)row2.Cells[column].Value) * direction;
6545
6546                                 object val1 = row1.Cells[column].FormattedValue;
6547                                 object val2 = row2.Cells[column].FormattedValue;
6548                                 object val1NullValue = row1.Cells[column].InheritedStyle.NullValue;
6549                                 object val2NullValue = row2.Cells[column].InheritedStyle.NullValue;
6550
6551                                 if (val1 == val1NullValue && val2 == val2NullValue)
6552                                         return 0;
6553                                 if (val1 == val1NullValue)
6554                                         return direction;
6555                                 if (val2 == val2NullValue)
6556                                         return -1 * direction;
6557
6558                                 if (numeric_sort)
6559                                         return (int)(double.Parse (val1.ToString ()) - double.Parse (val2.ToString ())) * direction;
6560                                 else
6561                                         return string.Compare (val1.ToString (), val2.ToString ()) * direction;
6562                         }
6563                         #endregion
6564                 }
6565
6566                 public sealed class HitTestInfo {
6567
6568                         public static readonly HitTestInfo Nowhere = new HitTestInfo(-1, -1, -1, -1, DataGridViewHitTestType.None);
6569
6570                         private int columnIndex;
6571                         private int columnX;
6572                         private int rowIndex;
6573                         private int rowY;
6574                         private DataGridViewHitTestType type;
6575
6576                         internal HitTestInfo (int columnIndex, int columnX, int rowIndex, int rowY, DataGridViewHitTestType type) {
6577                                 this.columnIndex = columnIndex;
6578                                 this.columnX = columnX;
6579                                 this.rowIndex = rowIndex;
6580                                 this.rowY = rowY;
6581                                 this.type = type;
6582                         }
6583
6584                         public int ColumnIndex {
6585                                 get { return columnIndex; }
6586                         }
6587
6588                         public int ColumnX {
6589                                 get { return columnX; }
6590                         }
6591
6592                         public int RowIndex {
6593                                 get { return rowIndex; }
6594                         }
6595
6596                         public int RowY {
6597                                 get { return rowY; }
6598                         }
6599
6600                         public DataGridViewHitTestType Type {
6601                                 get { return type; }
6602                         }
6603
6604                         public override bool Equals (object value) {
6605                                 if (value is HitTestInfo) {
6606                                         HitTestInfo aux = (HitTestInfo) value;
6607                                         if (aux.columnIndex == columnIndex && aux.columnX == columnX && aux.rowIndex == rowIndex && aux.rowY == rowY && aux.type == type) {
6608                                                 return true;
6609                                         }
6610                                 }
6611                                 return false;
6612                         }
6613
6614                         public override int GetHashCode () {
6615                                 return base.GetHashCode();
6616                         }
6617
6618                         public override string ToString () {
6619                                 return string.Format ("Type:{0}, Column:{1}, Row:{2}", type, columnIndex, rowIndex);
6620                         }
6621
6622                 }
6623
6624                 [ComVisible (false)]
6625                 public class DataGridViewControlCollection : Control.ControlCollection
6626                 {
6627                         private DataGridView owner;
6628                         
6629                         public DataGridViewControlCollection (DataGridView owner) : base (owner)
6630                         {
6631                                 this.owner = owner;
6632                         }
6633                         
6634                         public override void Clear ()
6635                         {
6636                                 // 
6637                                 // This is severely buggy, just as MS' implementation is.
6638                                 //
6639                                 for (int i = 0; i < Count; i++) {
6640                                         Remove (this [i]);
6641                                 }
6642                         }
6643                         
6644                         public void CopyTo (Control [] array, int index)
6645                         {
6646                                 base.CopyTo (array, index);
6647                         }
6648                         
6649                         public void Insert (int index, Control value)
6650                         {
6651                                 throw new NotSupportedException ();
6652                         }
6653
6654                         public override void Remove (Control value)
6655                         {
6656                                 if (value == owner.horizontalScrollBar)
6657                                         return;
6658                                 
6659                                 if (value == owner.verticalScrollBar)
6660                                         return;
6661                                         
6662                                 if (value == owner.editingControl)
6663                                         return;
6664                         
6665                                 base.Remove (value);
6666                         }
6667                         
6668                         internal void RemoveInternal (Control value)
6669                         {
6670                                 base.Remove (value);
6671                         }
6672                         
6673                         
6674                 }
6675
6676                 [ComVisibleAttribute(true)]
6677                 protected class DataGridViewAccessibleObject : ControlAccessibleObject {
6678
6679                         public DataGridViewAccessibleObject (DataGridView owner) : base (owner){
6680                         }
6681
6682                         public override AccessibleRole Role {
6683                                 get { return base.Role; }
6684                         }
6685
6686                         public override string Name {
6687                                 get { return base.Name; }
6688                         }
6689                         
6690                         public override AccessibleObject GetChild (int index) {
6691                                 return base.GetChild(index);
6692                         }
6693
6694                         public override int GetChildCount () {
6695                                 return base.GetChildCount();
6696                         }
6697
6698                         public override AccessibleObject GetFocused () {
6699                                 return base.GetFocused();
6700                         }
6701
6702                         public override AccessibleObject GetSelected () {
6703                                 return base.GetSelected();
6704                         }
6705
6706                         public override AccessibleObject HitTest (int x, int y) {
6707                                 return base.HitTest(x, y);
6708                         }
6709
6710                         public override AccessibleObject Navigate( AccessibleNavigation navigationDirection) {
6711                                 return base.Navigate(navigationDirection);
6712                         }
6713
6714                 }
6715                 
6716                 [ComVisible (true)]
6717                 protected class DataGridViewTopRowAccessibleObject : AccessibleObject
6718                 {
6719                         #region Constructors
6720                         public DataGridViewTopRowAccessibleObject ()
6721                         {
6722                         }
6723                         
6724                         public DataGridViewTopRowAccessibleObject (DataGridView owner)
6725                         {
6726                                 this.owner = owner;
6727                         }
6728                         #endregion
6729                         
6730                         #region Public Methods
6731                         public override AccessibleObject GetChild (int index)
6732                         {
6733                                 return base.GetChild (index);
6734                         }
6735
6736                         public override int GetChildCount ()
6737                         {
6738                                 return base.GetChildCount ();
6739                         }
6740
6741                         public override AccessibleObject Navigate (AccessibleNavigation navigationDirection)
6742                         {
6743                                 return base.Navigate (navigationDirection);
6744                         }
6745                         #endregion
6746                         
6747                         #region Public Properties
6748                         public override Rectangle Bounds {
6749                                 get { return base.Bounds; }
6750                         }
6751                         
6752                         public override string Name {
6753                                 get { return base.Name; }
6754                         }
6755
6756                         public DataGridView Owner {
6757                                 get { return (DataGridView)owner; }
6758                                 set { 
6759                                         if (owner != null)
6760                                                 throw new InvalidOperationException ("owner has already been set");
6761                                 
6762                                         owner = value;
6763                                 }
6764                         }
6765                         
6766                         public override AccessibleObject Parent {
6767                                 get { return base.Parent; }
6768                         }
6769
6770                         public override AccessibleRole Role {
6771                                 get { return base.Role; }
6772                         }
6773
6774                         public override string Value {
6775                                 get { return base.Value; }
6776                         }
6777                         #endregion
6778                 }
6779         }
6780 }