System.Windows.Forms

System.Windows.Forms
   1 File: winforms\Managed\System\WinForms\DataGridView.cs
   2 Project: ndp\fx\src\System.Windows.Forms.csproj (System.Windows.Forms)    
   3 
   4 //------------------------------------------------------------------------------
   5 // <copyright file="DataGridView.cs" company="Microsoft">
   6 //     Copyright (c) Microsoft Corporation.  All rights reserved.
   7 // </copyright>            
   8 //------------------------------------------------------------------------------
   9  
  10 namespace System.Windows.Forms
  11 {
  12     using System.Text;
  13     using System.Runtime.InteropServices;
  14     using System.Runtime.Remoting;
  15     using System.ComponentModel;
  16     using System;
  17     using System.Diagnostics.CodeAnalysis;
  18     using System.Security;
  19     using System.Security.Permissions;
  20     using System.Collections;
  21     using System.Windows.Forms;
  22     using System.Windows.Forms.Design;    
  23     using System.ComponentModel.Design;
  24     using System.Drawing;
  25     using System.Windows.Forms.ComponentModel;
  26     using System.Windows.Forms.Layout;
  27     using System.Globalization;
  28     using System.Diagnostics;
  29     using System.Windows.Forms.VisualStyles;
  30     using Microsoft.Win32;
  31     using System.Collections.Specialized;
  32  
  33     /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView"]/*‘ />
  34     [
  35         ComVisible(true),
  36         ClassInterface(ClassInterfaceType.AutoDispatch),
  37         Designer("System.Windows.Forms.Design.DataGridViewDesigner, " + AssemblyRef.SystemDesign),
  38         //DefaultProperty("DataSource"),
  39         DefaultEvent("CellContentClick"),
  40         ComplexBindingProperties("DataSource", "DataMember"),
  41         Docking(DockingBehavior.Ask),
  42         Editor("System.Windows.Forms.Design.DataGridViewComponentEditor, " + AssemblyRef.SystemDesign, typeof(ComponentEditor)),
  43         SRDescription(SR.DescriptionDataGridView)
  44     ]
  45     public partial class DataGridView : Control, ISupportInitialize
  46     {
  47         private static readonly object EVENT_DATAGRIDVIEWALLOWUSERTOADDROWSCHANGED = new object();
  48         private static readonly object EVENT_DATAGRIDVIEWALLOWUSERTODELETEROWSCHANGED = new object();
  49         private static readonly object EVENT_DATAGRIDVIEWALLOWUSERTOORDERCOLUMNSCHANGED = new object();
  50         private static readonly object EVENT_DATAGRIDVIEWALLOWUSERTORESIZECOLUMNSCHANGED = new object();
  51         private static readonly object EVENT_DATAGRIDVIEWALLOWUSERTORESIZEROWSCHANGED = new object();
  52         private static readonly object EVENT_DATAGRIDVIEWALTERNATINGROWSDEFAULTCELLSTYLECHANGED = new object();
  53         private static readonly object EVENT_DATAGRIDVIEWAUTOGENERATECOLUMNSCHANGED = new object();
  54         private static readonly object EVENT_DATAGRIDVIEWAUTOSIZECOLUMNMODECHANGED = new object();
  55         private static readonly object EVENT_DATAGRIDVIEWAUTOSIZECOLUMNSMODECHANGED = new object();
  56         private static readonly object EVENT_DATAGRIDVIEWAUTOSIZEROWSMODECHANGED = new object();
  57         private static readonly object EVENT_DATAGRIDVIEWBACKGROUNDCOLORCHANGED = new object();
  58         private static readonly object EVENT_DATAGRIDVIEWBORDERSTYLECHANGED = new object();
  59         private static readonly object EVENT_DATAGRIDVIEWCANCELROWEDIT = new object();
  60         private static readonly object EVENT_DATAGRIDVIEWCELLBEGINEDIT = new object();
  61         private static readonly object EVENT_DATAGRIDVIEWCELLBORDERSTYLECHANGED = new object();
  62         private static readonly object EVENT_DATAGRIDVIEWCELLCLICK = new object();
  63         private static readonly object EVENT_DATAGRIDVIEWCELLCONTENTCLICK = new object();
  64         private static readonly object EVENT_DATAGRIDVIEWCELLCONTENTDOUBLECLICK = new object();
  65         private static readonly object EVENT_DATAGRIDVIEWCELLCONTEXTMENUSTRIPCHANGED = new object();
  66         private static readonly object EVENT_DATAGRIDVIEWCELLCONTEXTMENUSTRIPNEEDED = new object();
  67         private static readonly object EVENT_DATAGRIDVIEWCELLDOUBLECLICK = new object();
  68         private static readonly object EVENT_DATAGRIDVIEWCELLENDEDIT = new object();
  69         private static readonly object EVENT_DATAGRIDVIEWCELLENTER = new object();
  70         private static readonly object EVENT_DATAGRIDVIEWCELLERRORTEXTCHANGED = new object();
  71         private static readonly object EVENT_DATAGRIDVIEWCELLERRORTEXTNEEDED = new object();
  72         private static readonly object EVENT_DATAGRIDVIEWCELLFORMATTING = new object();
  73         private static readonly object EVENT_DATAGRIDVIEWCELLLEAVE = new object();
  74         private static readonly object EVENT_DATAGRIDVIEWCELLMOUSECLICK = new object();
  75         private static readonly object EVENT_DATAGRIDVIEWCELLMOUSEDOUBLECLICK = new object();
  76         private static readonly object EVENT_DATAGRIDVIEWCELLMOUSEDOWN = new object();
  77         private static readonly object EVENT_DATAGRIDVIEWCELLMOUSEENTER = new object();
  78         private static readonly object EVENT_DATAGRIDVIEWCELLMOUSELEAVE = new object();
  79         private static readonly object EVENT_DATAGRIDVIEWCELLMOUSEMOVE = new object();
  80         private static readonly object EVENT_DATAGRIDVIEWCELLMOUSEUP = new object();
  81         private static readonly object EVENT_DATAGRIDVIEWCELLPAINTING = new object();
  82         private static readonly object EVENT_DATAGRIDVIEWCELLPARSING = new object();
  83         private static readonly object EVENT_DATAGRIDVIEWCELLSTATECHANGED = new object();
  84         private static readonly object EVENT_DATAGRIDVIEWCELLSTYLECHANGED = new object();
  85         private static readonly object EVENT_DATAGRIDVIEWCELLSTYLECONTENTCHANGED = new object();
  86         private static readonly object EVENT_DATAGRIDVIEWCELLTOOLTIPTEXTCHANGED = new object();
  87         private static readonly object EVENT_DATAGRIDVIEWCELLTOOLTIPTEXTNEEDED = new object();
  88         private static readonly object EVENT_DATAGRIDVIEWCELLVALIDATING = new object();
  89         private static readonly object EVENT_DATAGRIDVIEWCELLVALIDATED = new object();
  90         private static readonly object EVENT_DATAGRIDVIEWCELLVALUECHANGED = new object();
  91         private static readonly object EVENT_DATAGRIDVIEWCELLVALUENEEDED = new object();
  92         private static readonly object EVENT_DATAGRIDVIEWCELLVALUEPUSHED = new object();
  93         private static readonly object EVENT_DATAGRIDVIEWCOLUMNADDED = new object();
  94         private static readonly object EVENT_DATAGRIDVIEWCOLUMNCONTEXTMENUSTRIPCHANGED = new object();
  95         private static readonly object EVENT_DATAGRIDVIEWCOLUMNDATAPROPERTYNAMECHANGED = new object();
  96         private static readonly object EVENT_DATAGRIDVIEWCOLUMNDEFAULTCELLSTYLECHANGED = new object();
  97         private static readonly object EVENT_DATAGRIDVIEWCOLUMNDISPLAYINDEXCHANGED = new object();
  98         private static readonly object EVENT_DATAGRIDVIEWCOLUMNDIVIDERWIDTHCHANGED = new object();
  99         private static readonly object EVENT_DATAGRIDVIEWCOLUMNHEADERCELLCHANGED = new object();
 100         private static readonly object EVENT_DATAGRIDVIEWCOLUMNDIVIDERDOUBLECLICK = new object();
 101         private static readonly object EVENT_DATAGRIDVIEWCOLUMNHEADERMOUSECLICK = new object();
 102         private static readonly object EVENT_DATAGRIDVIEWCOLUMNHEADERMOUSEDOUBLECLICK = new object();
 103         private static readonly object EVENT_DATAGRIDVIEWCOLUMNHEADERSBORDERSTYLECHANGED = new object();
 104         private static readonly object EVENT_DATAGRIDVIEWCOLUMNHEADERSDEFAULTCELLSTYLECHANGED = new object();
 105         private static readonly object EVENT_DATAGRIDVIEWCOLUMNHEADERSHEIGHTCHANGED = new object();
 106         private static readonly object EVENT_DATAGRIDVIEWCOLUMNHEADERSHEIGHTSIZEMODECHANGED = new object();
 107         private static readonly object EVENT_DATAGRIDVIEWCOLUMNMINIMUMWIDTHCHANGED = new object();
 108         private static readonly object EVENT_DATAGRIDVIEWCOLUMNNAMECHANGED = new object();
 109         private static readonly object EVENT_DATAGRIDVIEWCOLUMNREMOVED = new object();
 110         private static readonly object EVENT_DATAGRIDVIEWCOLUMNSORTMODECHANGED = new object();
 111         private static readonly object EVENT_DATAGRIDVIEWCOLUMNSTATECHANGED = new object();
 112         private static readonly object EVENT_DATAGRIDVIEWCOLUMNTOOLTIPTEXTCHANGED = new object();
 113         private static readonly object EVENT_DATAGRIDVIEWCOLUMNWIDTHCHANGED = new object();
 114         private static readonly object EVENT_DATAGRIDVIEWCURRENTCELLCHANGED = new object();
 115         private static readonly object EVENT_DATAGRIDVIEWCURRENTCELLDIRTYSTATECHANGED = new object();
 116         private static readonly object EVENT_DATAGRIDVIEWDATABINDINGCOMPLETE = new object();
 117         private static readonly object EVENT_DATAGRIDVIEWDATAERROR = new object();
 118         private static readonly object EVENT_DATAGRIDVIEWDATAMEMBERCHANGED = new object();
 119         private static readonly object EVENT_DATAGRIDVIEWDATASOURCECHANGED = new object();
 120         private static readonly object EVENT_DATAGRIDVIEWDEFAULTCELLSTYLECHANGED = new object();
 121         private static readonly object EVENT_DATAGRIDVIEWDEFAULTVALUESNEEDED = new object();
 122         private static readonly object EVENT_DATAGRIDVIEWEDITINGCONTROLSHOWING = new object();
 123         private static readonly object EVENT_DATAGRIDVIEWEDITMODECHANGED = new object();
 124         private static readonly object EVENT_DATAGRIDVIEWGRIDCOLORCHANGED = new object();
 125         private static readonly object EVENT_DATAGRIDVIEWMULTISELECTCHANGED = new object();
 126         private static readonly object EVENT_DATAGRIDVIEWNEWROWNEEDED = new object();
 127         private static readonly object EVENT_DATAGRIDVIEWREADONLYCHANGED = new object();
 128         private static readonly object EVENT_DATAGRIDVIEWROWCONTEXTMENUSTRIPCHANGED = new object();
 129         private static readonly object EVENT_DATAGRIDVIEWROWCONTEXTMENUSTRIPNEEDED = new object();
 130         private static readonly object EVENT_DATAGRIDVIEWROWDEFAULTCELLSTYLECHANGED = new object();
 131         private static readonly object EVENT_DATAGRIDVIEWROWDIRTYSTATENEEDED = new Object();
 132         private static readonly object EVENT_DATAGRIDVIEWROWDIVIDERHEIGHTCHANGED = new object();
 133         private static readonly object EVENT_DATAGRIDVIEWROWENTER = new object();
 134         private static readonly object EVENT_DATAGRIDVIEWROWERRORTEXTCHANGED = new object();
 135         private static readonly object EVENT_DATAGRIDVIEWROWERRORTEXTNEEDED = new object();
 136         private static readonly object EVENT_DATAGRIDVIEWROWHEADERCELLCHANGED = new object();
 137         private static readonly object EVENT_DATAGRIDVIEWROWDIVIDERDOUBLECLICK = new object();
 138         private static readonly object EVENT_DATAGRIDVIEWROWHEADERMOUSECLICK = new object();
 139         private static readonly object EVENT_DATAGRIDVIEWROWHEADERMOUSEDOUBLECLICK = new object();
 140         private static readonly object EVENT_DATAGRIDVIEWROWHEADERSBORDERSTYLECHANGED = new object();
 141         private static readonly object EVENT_DATAGRIDVIEWROWHEADERSDEFAULTCELLSTYLECHANGED = new object();
 142         private static readonly object EVENT_DATAGRIDVIEWROWHEADERSWIDTHCHANGED = new object();
 143         private static readonly object EVENT_DATAGRIDVIEWROWHEADERSWIDTHSIZEMODECHANGED = new object();
 144         private static readonly object EVENT_DATAGRIDVIEWROWHEIGHTCHANGED = new object();
 145         private static readonly object EVENT_DATAGRIDVIEWROWHEIGHTINFONEEDED = new object();
 146         private static readonly object EVENT_DATAGRIDVIEWROWHEIGHTINFOPUSHED = new object();
 147         private static readonly object EVENT_DATAGRIDVIEWROWLEAVE = new object();
 148         private static readonly object EVENT_DATAGRIDVIEWROWMINIMUMHEIGHTCHANGED = new object();
 149         private static readonly object EVENT_DATAGRIDVIEWROWPOSTPAINT = new object();
 150         private static readonly object EVENT_DATAGRIDVIEWROWPREPAINT = new object();
 151         private static readonly object EVENT_DATAGRIDVIEWROWSADDED = new object();
 152         private static readonly object EVENT_DATAGRIDVIEWROWSDEFAULTCELLSTYLECHANGED = new object();
 153         private static readonly object EVENT_DATAGRIDVIEWROWSREMOVED = new object();
 154         private static readonly object EVENT_DATAGRIDVIEWROWSTATECHANGED = new object();
 155         private static readonly object EVENT_DATAGRIDVIEWROWUNSHARED = new object();
 156         private static readonly object EVENT_DATAGRIDVIEWROWVALIDATED = new object();
 157         private static readonly object EVENT_DATAGRIDVIEWROWVALIDATING = new object();
 158         private static readonly object EVENT_DATAGRIDVIEWSCROLL = new object();
 159         private static readonly object EVENT_DATAGRIDVIEWSELECTIONCHANGED = new object();
 160         private static readonly object EVENT_DATAGRIDVIEWSORTCOMPARE = new object();
 161         private static readonly object EVENT_DATAGRIDVIEWSORTED = new object();
 162         private static readonly object EVENT_DATAGRIDVIEWUSERADDEDROW = new object();
 163         private static readonly object EVENT_DATAGRIDVIEWUSERDELETEDROW = new object();
 164         private static readonly object EVENT_DATAGRIDVIEWUSERDELETINGROW = new object();
 165  
 166         private const int DATAGRIDVIEWSTATE1_allowUserToAddRows           = 0x00000001;
 167         private const int DATAGRIDVIEWSTATE1_allowUserToDeleteRows        = 0x00000002;
 168         private const int DATAGRIDVIEWSTATE1_allowUserToOrderColumns      = 0x00000004;
 169         private const int DATAGRIDVIEWSTATE1_columnHeadersVisible         = 0x00000008;
 170         private const int DATAGRIDVIEWSTATE1_rowHeadersVisible            = 0x00000010;
 171         private const int DATAGRIDVIEWSTATE1_forwardCharMessage           = 0x00000020;
 172         private const int DATAGRIDVIEWSTATE1_leavingWithTabKey            = 0x00000040;
 173         private const int DATAGRIDVIEWSTATE1_multiSelect                  = 0x00000080;
 174         private const int DATAGRIDVIEWSTATE1_ignoringEditingChanges       = 0x00000200;
 175         private const int DATAGRIDVIEWSTATE1_ambientForeColor             = 0x00000400;
 176         private const int DATAGRIDVIEWSTATE1_scrolledSinceMouseDown       = 0x00000800;
 177         private const int DATAGRIDVIEWSTATE1_editingControlHidden         = 0x00001000;
 178         private const int DATAGRIDVIEWSTATE1_standardTab                  = 0x00002000;
 179         private const int DATAGRIDVIEWSTATE1_editingControlChanging       = 0x00004000;
 180         private const int DATAGRIDVIEWSTATE1_currentCellInEditMode        = 0x00008000;
 181         private const int DATAGRIDVIEWSTATE1_virtualMode                  = 0x00010000;
 182         private const int DATAGRIDVIEWSTATE1_editedCellChanged            = 0x00020000;
 183         private const int DATAGRIDVIEWSTATE1_editedRowChanged             = 0x00040000;
 184         private const int DATAGRIDVIEWSTATE1_newRowEdited                 = 0x00080000;
 185         private const int DATAGRIDVIEWSTATE1_readOnly                     = 0x00100000;
 186         private const int DATAGRIDVIEWSTATE1_newRowCreatedByEditing       = 0x00200000;
 187         private const int DATAGRIDVIEWSTATE1_temporarilyResetCurrentCell  = 0x00400000;
 188         private const int DATAGRIDVIEWSTATE1_autoGenerateColumns          = 0x00800000;
 189         private const int DATAGRIDVIEWSTATE1_customCursorSet              = 0x01000000;
 190         private const int DATAGRIDVIEWSTATE1_ambientFont                  = 0x02000000;
 191         private const int DATAGRIDVIEWSTATE1_ambientColumnHeadersFont     = 0x04000000;
 192         private const int DATAGRIDVIEWSTATE1_ambientRowHeadersFont        = 0x08000000;
 193         private const int DATAGRIDVIEWSTATE1_isRestrictedChecked          = 0x10000000;
 194         private const int DATAGRIDVIEWSTATE1_isRestricted                 = 0x20000000;
 195         private const int DATAGRIDVIEWSTATE1_isAutoSized                  = 0x40000000;
 196  
 197         // DATAGRIDVIEWSTATE2_
 198         private const int DATAGRIDVIEWSTATE2_showEditingIcon               = 0x00000001;
 199         private const int DATAGRIDVIEWSTATE2_allowUserToResizeColumns      = 0x00000002;
 200         private const int DATAGRIDVIEWSTATE2_allowUserToResizeRows         = 0x00000004;
 201         private const int DATAGRIDVIEWSTATE2_mouseOverRemovedEditingCtrl   = 0x00000008;
 202         private const int DATAGRIDVIEWSTATE2_mouseOverRemovedEditingPanel  = 0x00000010;
 203         private const int DATAGRIDVIEWSTATE2_mouseEnterExpected            = 0x00000020;
 204         private const int DATAGRIDVIEWSTATE2_enableHeadersVisualStyles     = 0x00000040;
 205         private const int DATAGRIDVIEWSTATE2_showCellErrors                = 0x00000080;
 206         private const int DATAGRIDVIEWSTATE2_showCellToolTips              = 0x00000100;
 207         private const int DATAGRIDVIEWSTATE2_showRowErrors                 = 0x00000200;
 208         private const int DATAGRIDVIEWSTATE2_showColumnRelocationInsertion = 0x00000400;
 209         private const int DATAGRIDVIEWSTATE2_rightToLeftMode               = 0x00000800;
 210         private const int DATAGRIDVIEWSTATE2_rightToLeftValid              = 0x00001000;
 211         private const int DATAGRIDVIEWSTATE2_currentCellWantsInputKey      = 0x00002000;
 212         private const int DATAGRIDVIEWSTATE2_stopRaisingVerticalScroll     = 0x00004000;
 213         private const int DATAGRIDVIEWSTATE2_stopRaisingHorizontalScroll   = 0x00008000;
 214         private const int DATAGRIDVIEWSTATE2_replacedCellSelected          = 0x00010000;
 215         private const int DATAGRIDVIEWSTATE2_replacedCellReadOnly          = 0x00020000;
 216         private const int DATAGRIDVIEWSTATE2_raiseSelectionChanged         = 0x00040000;
 217         private const int DATAGRIDVIEWSTATE2_initializing                  = 0x00080000;
 218         private const int DATAGRIDVIEWSTATE2_autoSizedWithoutHandle        = 0x00100000;
 219         private const int DATAGRIDVIEWSTATE2_ignoreCursorChange            = 0x00200000;
 220         private const int DATAGRIDVIEWSTATE2_rowsCollectionClearedInSetCell= 0x00400000;
 221         private const int DATAGRIDVIEWSTATE2_nextMouseUpIsDouble           = 0x00800000;
 222         private const int DATAGRIDVIEWSTATE2_inBindingContextChanged       = 0x01000000;
 223         private const int DATAGRIDVIEWSTATE2_allowHorizontalScrollbar      = 0x02000000;
 224         private const int DATAGRIDVIEWSTATE2_usedFillWeightsDirty          = 0x04000000;
 225         private const int DATAGRIDVIEWSTATE2_messageFromEditingCtrls       = 0x08000000;
 226         private const int DATAGRIDVIEWSTATE2_cellMouseDownInContentBounds  = 0x10000000;
 227         private const int DATAGRIDVIEWSTATE2_discardEditingControl         = 0x20000000;
 228  
 229         // DATAGRIDVIEWOPER_
 230         private const int DATAGRIDVIEWOPER_trackColResize                = 0x00000001;
 231         private const int DATAGRIDVIEWOPER_trackRowResize                = 0x00000002;
 232         private const int DATAGRIDVIEWOPER_trackColSelect                = 0x00000004;
 233         private const int DATAGRIDVIEWOPER_trackRowSelect                = 0x00000008;
 234         private const int DATAGRIDVIEWOPER_trackCellSelect               = 0x00000010;
 235         private const int DATAGRIDVIEWOPER_trackColRelocation            = 0x00000020;
 236         private const int DATAGRIDVIEWOPER_inSort                        = 0x00000040;
 237         private const int DATAGRIDVIEWOPER_trackColHeadersResize         = 0x00000080;
 238         private const int DATAGRIDVIEWOPER_trackRowHeadersResize         = 0x00000100;
 239         private const int DATAGRIDVIEWOPER_trackMouseMoves               = 0x00000200;
 240         private const int DATAGRIDVIEWOPER_inRefreshColumns              = 0x00000400;
 241         private const int DATAGRIDVIEWOPER_inDisplayIndexAdjustments     = 0x00000800;
 242         private const int DATAGRIDVIEWOPER_lastEditCtrlClickDoubled      = 0x00001000;
 243         private const int DATAGRIDVIEWOPER_inMouseDown                   = 0x00002000;
 244         private const int DATAGRIDVIEWOPER_inReadOnlyChange              = 0x00004000;
 245         private const int DATAGRIDVIEWOPER_inCellValidating              = 0x00008000;
 246         private const int DATAGRIDVIEWOPER_inBorderStyleChange           = 0x00010000;
 247         private const int DATAGRIDVIEWOPER_inCurrentCellChange           = 0x00020000;
 248         private const int DATAGRIDVIEWOPER_inAdjustFillingColumns        = 0x00040000;
 249         private const int DATAGRIDVIEWOPER_inAdjustFillingColumn         = 0x00080000;
 250         private const int DATAGRIDVIEWOPER_inDispose                     = 0x00100000;
 251         private const int DATAGRIDVIEWOPER_inBeginEdit                   = 0x00200000;
 252         private const int DATAGRIDVIEWOPER_inEndEdit                     = 0x00400000;
 253         private const int DATAGRIDVIEWOPER_resizingOperationAboutToStart = 0x00800000;
 254  
 255         private static Size DragSize = SystemInformation.DragSize;
 256  
 257         private const byte DATAGRIDVIEW_columnSizingHotZone = 6;
 258         private const byte DATAGRIDVIEW_rowSizingHotZone = 5;
 259         private const byte DATAGRIDVIEW_insertionBarWidth = 3;
 260         private const byte DATAGRIDVIEW_bulkPaintThreshold = 8;
 261  
 262         private const string DATAGRIDVIEW_htmlPrefix = "Version:1.0\r\nStartHTML:00000097\r\nEndHTML:{0}\r\nStartFragment:00000133\r\nEndFragment:{1}\r\n";
 263         private const string DATAGRIDVIEW_htmlStartFragment = "<HTML>\r\n<BODY>\r\n<!--StartFragment-->";
 264         private const string DATAGRIDVIEW_htmlEndFragment = "\r\n<!--EndFragment-->\r\n</BODY>\r\n</HTML>";
 265  
 266         private System.Collections.Specialized.BitVector32 dataGridViewState1;  // see DATAGRIDVIEWSTATE1_ consts above
 267         private System.Collections.Specialized.BitVector32 dataGridViewState2;  // see DATAGRIDVIEWSTATE2_ consts above
 268         private System.Collections.Specialized.BitVector32 dataGridViewOper;   // see DATAGRIDVIEWOPER_ consts above
 269  
 270         private const BorderStyle defaultBorderStyle = BorderStyle.FixedSingle;
 271         private const DataGridViewAdvancedCellBorderStyle defaultAdvancedCellBorderStyle = DataGridViewAdvancedCellBorderStyle.Single;
 272         private const DataGridViewAdvancedCellBorderStyle defaultAdvancedRowHeadersBorderStyle = DataGridViewAdvancedCellBorderStyle.OutsetPartial;
 273         private const DataGridViewAdvancedCellBorderStyle defaultAdvancedColumnHeadersBorderStyle = DataGridViewAdvancedCellBorderStyle.OutsetPartial;
 274  
 275         private const DataGridViewSelectionMode defaultSelectionMode = DataGridViewSelectionMode.RowHeaderSelect;
 276         private const DataGridViewEditMode defaultEditMode = DataGridViewEditMode.EditOnKeystrokeOrF2;
 277  
 278         private const DataGridViewAutoSizeRowCriteriaInternal invalidDataGridViewAutoSizeRowCriteriaInternalMask = ~(DataGridViewAutoSizeRowCriteriaInternal.Header | DataGridViewAutoSizeRowCriteriaInternal.AllColumns);
 279  
 280         private SolidBrush backgroundBrush = DefaultBackgroundBrush;
 281         private Pen gridPen;
 282         private Cursor oldCursor;
 283  
 284         private HScrollBar horizScrollBar = new HScrollBar();
 285         private VScrollBar vertScrollBar = new VScrollBar();
 286         private DataGridViewHeaderCell topLeftHeaderCell;
 287  
 288         private DataGridViewRow rowTemplate;
 289         private DataGridViewRowCollection dataGridViewRows;
 290         private DataGridViewColumnCollection dataGridViewColumns;
 291  
 292         private DataGridViewCellStyle placeholderCellStyle;
 293         private StringFormat placeholderStringFormat;
 294  
 295         private DataGridViewColumn sortedColumn;
 296         private SortOrder sortOrder;
 297  
 298         private object uneditedFormattedValue;
 299         private Control editingControl, latestEditingControl, cachedEditingControl;
 300         private Panel editingPanel;
 301         private Point ptCurrentCell, ptCurrentCellCache = Point.Empty, ptAnchorCell, ptMouseDownCell, ptMouseEnteredCell, ptToolTipCell, ptMouseDownGridCoord;
 302  
 303         private DataGridViewSelectionMode selectionMode;
 304         private DataGridViewEditMode editMode;
 305  
 306         // Note that a cell can only be in one bag but not both at the same time.
 307         private DataGridViewCellLinkedList individualSelectedCells;
 308         private DataGridViewCellLinkedList individualReadOnlyCells;
 309         private DataGridViewIntLinkedList selectedBandIndexes;
 310         private DataGridViewIntLinkedList selectedBandSnapshotIndexes;
 311  
 312         private DataGridViewCellStyle defaultCellStyle, columnHeadersDefaultCellStyle, rowHeadersDefaultCellStyle;
 313         private DataGridViewCellStyle rowsDefaultCellStyle, alternatingRowsDefaultCellStyle;
 314         private ScrollBars scrollBars;
 315         private LayoutData layout;
 316         private DisplayedBandsData displayedBandsInfo;
 317         private Rectangle normalClientRectangle;
 318         private ArrayList lstRows;
 319         private int availableWidthForFillColumns;
 320  
 321         private BorderStyle borderStyle;
 322         private DataGridViewAdvancedBorderStyle advancedCellBorderStyle;
 323         private DataGridViewAdvancedBorderStyle advancedRowHeadersBorderStyle;
 324         private DataGridViewAdvancedBorderStyle advancedColumnHeadersBorderStyle;
 325  
 326         private DataGridViewClipboardCopyMode clipboardCopyMode;
 327  
 328         private const int minimumRowHeadersWidth = 4;
 329         private const int minimumColumnHeadersHeight = 4;
 330         private const int defaultRowHeadersWidth = 41;
 331         private const int maxHeadersThickness = 32768;
 332         private const int upperSize = 0x007FFFFF;
 333         private int rowHeadersWidth = defaultRowHeadersWidth;
 334         private int cachedRowHeadersWidth;
 335         private const int defaultColumnHeadersHeight = 23;
 336         private int columnHeadersHeight = defaultColumnHeadersHeight;
 337         private int cachedColumnHeadersHeight;
 338         private DataGridViewAutoSizeRowsMode autoSizeRowsMode;
 339         private DataGridViewAutoSizeColumnsMode autoSizeColumnsMode;
 340         private DataGridViewColumnHeadersHeightSizeMode columnHeadersHeightSizeMode;
 341         private DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode;
 342  
 343         private DataGridViewCellStyleChangedEventArgs dgvcsce;
 344         private DataGridViewCellPaintingEventArgs dgvcpe;
 345         private DataGridViewCellValueEventArgs dgvcve;
 346         private DataGridViewRowHeightInfoNeededEventArgs dgvrhine;
 347         private DataGridViewRowPostPaintEventArgs dgvrpope;
 348         private DataGridViewRowPrePaintEventArgs dgvrprpe;
 349  
 350         // the sum of the widths in pixels of the scrolling columns preceding 
 351         // the first visible scrolling column
 352         private int horizontalOffset;
 353  
 354         // the sum of the heights in pixels of the scrolling rows preceding 
 355         // the first visible scrolling row
 356         private int verticalOffset;
 357  
 358         // the number of pixels of the firstDisplayedScrollingCol which are not visible
 359         private int negOffset;
 360  
 361         // the index of the potential ‘new‘ row. -1 if there is no ‘new‘ row.
 362         private int newRowIndex = -1;
 363  
 364         // residual fraction of WHEEL_DELTA (120) for wheel scrolling
 365         private int cumulativeVerticalWheelDelta;
 366         private int cumulativeHorizontalWheelDelta;
 367  
 368         private int trackColAnchor;
 369         private int trackColumn = -1;
 370         private int trackColumnEdge = -1;
 371         private int trackRowAnchor;
 372         private int trackRow = -1;
 373         private int trackRowEdge = -1;
 374         private int lastHeaderShadow = -1;
 375         private int currentColSplitBar = -1, lastColSplitBar = -1;
 376         private int currentRowSplitBar = -1, lastRowSplitBar = -1;
 377         private int mouseBarOffset;
 378         private int noDimensionChangeCount;
 379         private int noSelectionChangeCount;
 380         private int noAutoSizeCount;
 381         private int inBulkPaintCount;
 382         private int inBulkLayoutCount;
 383         private int inPerformLayoutCount;
 384  
 385         private System.Windows.Forms.Timer vertScrollTimer, horizScrollTimer;
 386  
 387         private Hashtable converters;
 388         private Hashtable pens;
 389         private Hashtable brushes;
 390  
 391         private NativeMethods.RECT[] cachedScrollableRegion;
 392  
 393         // DataBinding
 394         private DataGridViewDataConnection dataConnection;
 395  
 396         // ToolTip
 397         private DataGridViewToolTip toolTipControl;
 398         // the tool tip string we get from cells
 399         private string toolTipCaption = String.Empty;
 400         
 401         private const int maxTTDISPINFOBufferLength = 80;
 402  
 403         // Last Mouse Click Info
 404         private MouseClickInfo lastMouseClickInfo;
 405  
 406 #if DEBUG
 407         // set to false when the grid is not in [....] with the underlying data store
 408         // in virtual mode, and OnCellValueNeeded cannot be called.
 409 // disable csharp compiler warning #0414: field assigned unused value
 410 #pragma warning disable 0414
 411         internal bool dataStoreAccessAllowed = true;
 412 #pragma warning restore 0414
 413 #endif
 414         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.DataGridView"]/*‘ />
 415         /// <devdoc>
 416         /// <para>Initializes a new instance of the <see cref=‘System.Windows.Forms.DataGridView‘/> class.</para>
 417         /// </devdoc>
 418         public DataGridView()
 419         {
 420             SetStyle(ControlStyles.UserPaint | 
 421                      ControlStyles.Opaque | 
 422                      ControlStyles.UserMouse, true);
 423             
 424             SetStyle(ControlStyles.SupportsTransparentBackColor, false);
 425  
 426             // this class overrides GetPreferredSizeCore, let Control automatically cache the result
 427             SetState2(STATE2_USEPREFERREDSIZECACHE, true);  
 428  
 429             this.dataGridViewState1 = new System.Collections.Specialized.BitVector32(0x00000000);
 430             this.dataGridViewState2 = new System.Collections.Specialized.BitVector32(0x00000000);
 431             this.dataGridViewOper   = new System.Collections.Specialized.BitVector32(0x00000000);
 432  
 433             this.dataGridViewState1[  DATAGRIDVIEWSTATE1_columnHeadersVisible 
 434                                     | DATAGRIDVIEWSTATE1_rowHeadersVisible 
 435                                     | DATAGRIDVIEWSTATE1_autoGenerateColumns
 436                                     | DATAGRIDVIEWSTATE1_allowUserToAddRows
 437                                     | DATAGRIDVIEWSTATE1_allowUserToDeleteRows ] = true;
 438  
 439  
 440  
 441             this.dataGridViewState2[  DATAGRIDVIEWSTATE2_showEditingIcon
 442                                     | DATAGRIDVIEWSTATE2_enableHeadersVisualStyles
 443                                     | DATAGRIDVIEWSTATE2_mouseEnterExpected
 444                                     | DATAGRIDVIEWSTATE2_allowUserToResizeColumns
 445                                     | DATAGRIDVIEWSTATE2_allowUserToResizeRows
 446                                     | DATAGRIDVIEWSTATE2_showCellToolTips
 447                                     | DATAGRIDVIEWSTATE2_showCellErrors
 448                                     | DATAGRIDVIEWSTATE2_showRowErrors
 449                                     | DATAGRIDVIEWSTATE2_allowHorizontalScrollbar
 450                                     | DATAGRIDVIEWSTATE2_usedFillWeightsDirty ] = true;
 451  
 452  
 453             this.displayedBandsInfo = new DisplayedBandsData();
 454             this.lstRows = new ArrayList();
 455  
 456             this.converters = new Hashtable(8);
 457             this.pens = new Hashtable(8);
 458             this.brushes = new Hashtable(10);
 459             this.gridPen = new Pen(DefaultGridColor);
 460  
 461             this.selectedBandIndexes = new DataGridViewIntLinkedList();
 462             this.individualSelectedCells = new DataGridViewCellLinkedList();
 463             this.individualReadOnlyCells = new DataGridViewCellLinkedList();
 464  
 465             this.advancedCellBorderStyle = new DataGridViewAdvancedBorderStyle(this, 
 466                 DataGridViewAdvancedCellBorderStyle.OutsetDouble, 
 467                 DataGridViewAdvancedCellBorderStyle.OutsetPartial, 
 468                 DataGridViewAdvancedCellBorderStyle.InsetDouble);
 469             this.advancedRowHeadersBorderStyle = new DataGridViewAdvancedBorderStyle(this);
 470             this.advancedColumnHeadersBorderStyle = new DataGridViewAdvancedBorderStyle(this);
 471             this.advancedCellBorderStyle.All = defaultAdvancedCellBorderStyle;
 472             this.advancedRowHeadersBorderStyle.All = defaultAdvancedRowHeadersBorderStyle;
 473             this.advancedColumnHeadersBorderStyle.All = defaultAdvancedColumnHeadersBorderStyle;
 474             this.borderStyle = defaultBorderStyle;
 475             this.dataGridViewState1[DATAGRIDVIEWSTATE1_multiSelect] = true;
 476             this.selectionMode = defaultSelectionMode;
 477             this.editMode = defaultEditMode;
 478             this.autoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
 479             this.autoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
 480             this.columnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
 481             this.rowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing;
 482  
 483             this.clipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithAutoHeaderText;
 484  
 485             this.layout = new LayoutData();
 486             this.layout.TopLeftHeader        = Rectangle.Empty;
 487             this.layout.ColumnHeaders        = Rectangle.Empty;
 488             this.layout.RowHeaders           = Rectangle.Empty;
 489             this.layout.ColumnHeadersVisible = true;
 490             this.layout.RowHeadersVisible    = true;
 491             this.layout.ClientRectangle      = this.ClientRectangle;
 492  
 493             this.scrollBars = ScrollBars.Both;
 494  
 495             this.horizScrollBar.RightToLeft = RightToLeft.Inherit;
 496             this.horizScrollBar.AccessibleName = SR.GetString(SR.DataGridView_AccHorizontalScrollBarAccName);
 497             this.horizScrollBar.Top = this.ClientRectangle.Height - horizScrollBar.Height;
 498             this.horizScrollBar.Left = 0;
 499             this.horizScrollBar.Visible = false;
 500             this.horizScrollBar.Scroll += new ScrollEventHandler(DataGridViewHScrolled);
 501             this.Controls.Add(this.horizScrollBar);
 502  
 503             this.vertScrollBar.Top = 0;
 504             this.vertScrollBar.AccessibleName = SR.GetString(SR.DataGridView_AccVerticalScrollBarAccName);
 505             this.vertScrollBar.Left = this.ClientRectangle.Width - vertScrollBar.Width;
 506             this.vertScrollBar.Visible = false;
 507             this.vertScrollBar.Scroll += new ScrollEventHandler(DataGridViewVScrolled);
 508             this.Controls.Add(this.vertScrollBar);
 509  
 510             this.ptCurrentCell = new Point(-1, -1);
 511             this.ptAnchorCell = new Point(-1, -1);
 512             this.ptMouseDownCell = new Point(-2, -2);
 513             this.ptMouseEnteredCell = new Point(-2, -2);
 514             this.ptToolTipCell = new Point(-1, -1);
 515             this.ptMouseDownGridCoord = new Point(-1, -1);
 516  
 517             this.sortOrder = SortOrder.None;
 518  
 519             this.lastMouseClickInfo.timeStamp = 0;
 520  
 521             WireScrollBarsEvents();
 522             PerformLayout();
 523  
 524             this.toolTipControl = new DataGridViewToolTip(this);
 525             
 526             Invalidate();
 527         }
 528  
 529         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AdjustedTopLeftHeaderBorderStyle"]/*‘ />
 530         [
 531             Browsable(false),
 532             EditorBrowsable(EditorBrowsableState.Advanced),
 533             DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
 534         ]
 535         public virtual DataGridViewAdvancedBorderStyle AdjustedTopLeftHeaderBorderStyle
 536         {
 537             get
 538             {
 539                 DataGridViewAdvancedBorderStyle dgvabs;
 540                 if (this.ApplyVisualStylesToHeaderCells)
 541                 {
 542                     switch (this.AdvancedColumnHeadersBorderStyle.All)
 543                     {
 544                         case DataGridViewAdvancedCellBorderStyle.OutsetDouble:
 545                         case DataGridViewAdvancedCellBorderStyle.OutsetPartial:
 546                             dgvabs = new DataGridViewAdvancedBorderStyle();
 547                             if (this.RightToLeftInternal)
 548                             {
 549                                 dgvabs.LeftInternal = DataGridViewAdvancedCellBorderStyle.Outset;
 550                             }
 551                             else
 552                             {
 553                                 dgvabs.LeftInternal = DataGridViewAdvancedCellBorderStyle.OutsetDouble;
 554                             }
 555                             dgvabs.RightInternal = DataGridViewAdvancedCellBorderStyle.Outset;
 556                             dgvabs.TopInternal = DataGridViewAdvancedCellBorderStyle.OutsetDouble;
 557                             dgvabs.BottomInternal = DataGridViewAdvancedCellBorderStyle.Outset;
 558                             break;
 559  
 560                         case DataGridViewAdvancedCellBorderStyle.InsetDouble:
 561                             dgvabs = new DataGridViewAdvancedBorderStyle();
 562                             if (this.RightToLeftInternal)
 563                             {
 564                                 dgvabs.LeftInternal = DataGridViewAdvancedCellBorderStyle.Inset;
 565                             }
 566                             else
 567                             {
 568                                 dgvabs.LeftInternal = DataGridViewAdvancedCellBorderStyle.InsetDouble;
 569                             }
 570                             dgvabs.RightInternal = DataGridViewAdvancedCellBorderStyle.Inset;
 571                             dgvabs.TopInternal = DataGridViewAdvancedCellBorderStyle.InsetDouble;
 572                             dgvabs.BottomInternal = DataGridViewAdvancedCellBorderStyle.Inset;
 573                             break;
 574  
 575                         case DataGridViewAdvancedCellBorderStyle.NotSet:
 576                             // Since the row headers are visible, we should make sure
 577                             // that there is a left/right border for the TopLeftHeaderCell no matter what.
 578                             if ((!this.RightToLeftInternal && this.AdvancedColumnHeadersBorderStyle.Left == DataGridViewAdvancedCellBorderStyle.None) ||
 579                                 (this.RightToLeftInternal && this.AdvancedColumnHeadersBorderStyle.Right == DataGridViewAdvancedCellBorderStyle.None))
 580                             {
 581                                 dgvabs = new DataGridViewAdvancedBorderStyle();
 582                                 if (this.RightToLeftInternal)
 583                                 {
 584                                     dgvabs.LeftInternal = this.AdvancedColumnHeadersBorderStyle.Left;
 585                                     dgvabs.RightInternal = this.AdvancedRowHeadersBorderStyle.Right == DataGridViewAdvancedCellBorderStyle.OutsetDouble ?
 586                                         DataGridViewAdvancedCellBorderStyle.Outset : this.AdvancedRowHeadersBorderStyle.Right;
 587                                 }
 588                                 else
 589                                 {
 590                                     dgvabs.LeftInternal = this.AdvancedRowHeadersBorderStyle.Left;
 591                                     dgvabs.RightInternal = this.AdvancedColumnHeadersBorderStyle.Right;
 592                                 }
 593                                 dgvabs.TopInternal = this.AdvancedColumnHeadersBorderStyle.Top;
 594                                 dgvabs.BottomInternal = this.AdvancedColumnHeadersBorderStyle.Bottom;
 595                             }
 596                             else
 597                             {
 598                                 dgvabs = this.AdvancedColumnHeadersBorderStyle;
 599                             }
 600                             break;
 601  
 602                         default:
 603                             dgvabs = this.AdvancedColumnHeadersBorderStyle;
 604                             break;
 605                     }
 606                 }
 607                 else
 608                 {
 609                     switch (this.AdvancedColumnHeadersBorderStyle.All)
 610                     {
 611                         case DataGridViewAdvancedCellBorderStyle.OutsetDouble:
 612                         case DataGridViewAdvancedCellBorderStyle.OutsetPartial:
 613                             dgvabs = new DataGridViewAdvancedBorderStyle();
 614                             dgvabs.LeftInternal = this.RightToLeftInternal ? DataGridViewAdvancedCellBorderStyle.Outset : DataGridViewAdvancedCellBorderStyle.OutsetDouble;
 615                             dgvabs.RightInternal = this.RightToLeftInternal ? DataGridViewAdvancedCellBorderStyle.OutsetDouble : DataGridViewAdvancedCellBorderStyle.Outset;
 616                             dgvabs.TopInternal = DataGridViewAdvancedCellBorderStyle.OutsetDouble;
 617                             dgvabs.BottomInternal = DataGridViewAdvancedCellBorderStyle.Outset;
 618                             break;
 619  
 620                         case DataGridViewAdvancedCellBorderStyle.InsetDouble:
 621                             dgvabs = new DataGridViewAdvancedBorderStyle();
 622                             dgvabs.LeftInternal = this.RightToLeftInternal ? DataGridViewAdvancedCellBorderStyle.Inset : DataGridViewAdvancedCellBorderStyle.InsetDouble;
 623                             dgvabs.RightInternal = this.RightToLeftInternal ? DataGridViewAdvancedCellBorderStyle.InsetDouble : DataGridViewAdvancedCellBorderStyle.Inset;
 624                             dgvabs.TopInternal = DataGridViewAdvancedCellBorderStyle.InsetDouble;
 625                             dgvabs.BottomInternal = DataGridViewAdvancedCellBorderStyle.Inset;
 626                             break;
 627  
 628                         case DataGridViewAdvancedCellBorderStyle.NotSet:
 629                             // Since the row headers are visible, we should make sure
 630                             // that there is a left/right border for the TopLeftHeaderCell no matter what.
 631                             if ((!this.RightToLeftInternal && this.AdvancedColumnHeadersBorderStyle.Left == DataGridViewAdvancedCellBorderStyle.None) ||
 632                                 (this.RightToLeftInternal && this.AdvancedColumnHeadersBorderStyle.Right == DataGridViewAdvancedCellBorderStyle.None))
 633                             {
 634                                 dgvabs = new DataGridViewAdvancedBorderStyle();
 635                                 if (this.RightToLeftInternal)
 636                                 {
 637                                     dgvabs.LeftInternal = this.AdvancedColumnHeadersBorderStyle.Left;
 638                                     dgvabs.RightInternal = this.AdvancedRowHeadersBorderStyle.Right;
 639                                 }
 640                                 else
 641                                 {
 642                                     dgvabs.LeftInternal = this.AdvancedRowHeadersBorderStyle.Left;
 643                                     dgvabs.RightInternal = this.AdvancedColumnHeadersBorderStyle.Right;
 644                                 }
 645                                 dgvabs.TopInternal = this.AdvancedColumnHeadersBorderStyle.Top;
 646                                 dgvabs.BottomInternal = this.AdvancedColumnHeadersBorderStyle.Bottom;
 647                             }
 648                             else
 649                             {
 650                                 dgvabs = this.AdvancedColumnHeadersBorderStyle;
 651                             }
 652                             break;
 653  
 654                         default:
 655                             dgvabs = this.AdvancedColumnHeadersBorderStyle;
 656                             break;
 657                     }
 658                 }
 659                 return dgvabs;
 660             }
 661         }
 662  
 663         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AdvancedCellBorderStyle"]/*‘ />
 664         [
 665             Browsable(false),
 666             EditorBrowsable(EditorBrowsableState.Advanced)
 667         ]
 668         public DataGridViewAdvancedBorderStyle AdvancedCellBorderStyle
 669         {
 670             get 
 671             {
 672                 return this.advancedCellBorderStyle;
 673             }
 674         }
 675  
 676         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AdvancedColumnHeadersBorderStyle"]/*‘ />
 677         [
 678             Browsable(false),
 679             EditorBrowsable(EditorBrowsableState.Advanced)
 680         ]
 681         public DataGridViewAdvancedBorderStyle AdvancedColumnHeadersBorderStyle
 682         {
 683             get
 684             {
 685                 return this.advancedColumnHeadersBorderStyle;
 686             }
 687         }
 688  
 689         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AdvancedRowHeadersBorderStyle"]/*‘ />
 690         [
 691             Browsable(false),
 692             EditorBrowsable(EditorBrowsableState.Advanced)
 693         ]
 694         public DataGridViewAdvancedBorderStyle AdvancedRowHeadersBorderStyle
 695         {
 696             get
 697             {
 698                 return this.advancedRowHeadersBorderStyle;
 699             }
 700         }
 701  
 702         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AllowUserToAddRows"]/*‘ />
 703         [
 704             DefaultValue(true),
 705             SRCategory(SR.CatBehavior),
 706             SRDescription(SR.DataGridView_AllowUserToAddRowsDescr)
 707         ]
 708         public bool AllowUserToAddRows
 709         {
 710             get
 711             {
 712                 return this.dataGridViewState1[DATAGRIDVIEWSTATE1_allowUserToAddRows];
 713             }
 714             set
 715             {
 716                 if (this.AllowUserToAddRows != value)
 717                 {
 718                     this.dataGridViewState1[DATAGRIDVIEWSTATE1_allowUserToAddRows] = value;
 719                     if (this.DataSource != null)
 720                     {
 721                         this.dataConnection.ResetCachedAllowUserToAddRowsInternal();
 722                     }
 723                     OnAllowUserToAddRowsChanged(EventArgs.Empty);
 724                 }
 725             }
 726         }
 727  
 728         internal bool AllowUserToAddRowsInternal
 729         {
 730             get
 731             {
 732                 if (this.DataSource == null)
 733                 {
 734                     return this.AllowUserToAddRows;
 735                 }
 736                 else
 737                 {
 738                     return this.AllowUserToAddRows && this.dataConnection.AllowAdd;
 739                 }
 740             }
 741         }
 742  
 743         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AllowUserToAddRowsChanged"]/*‘ />
 744         [
 745             SRCategory(SR.CatPropertyChanged), 
 746             SRDescription(SR.DataGridViewOnAllowUserToAddRowsChangedDescr)
 747         ]
 748         public event EventHandler AllowUserToAddRowsChanged
 749         {
 750             add
 751             {
 752                 this.Events.AddHandler(EVENT_DATAGRIDVIEWALLOWUSERTOADDROWSCHANGED, value);
 753             }
 754             remove
 755             {
 756                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWALLOWUSERTOADDROWSCHANGED, value);
 757             }
 758         }
 759  
 760         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AllowUserToDeleteRows"]/*‘ />
 761         [
 762             DefaultValue(true),
 763             SRCategory(SR.CatBehavior),
 764             SRDescription(SR.DataGridView_AllowUserToDeleteRowsDescr)
 765         ]
 766         public bool AllowUserToDeleteRows
 767         {
 768             get
 769             {
 770                 return this.dataGridViewState1[DATAGRIDVIEWSTATE1_allowUserToDeleteRows];
 771             }
 772             set
 773             {
 774                 if (this.AllowUserToDeleteRows != value)
 775                 {
 776                     this.dataGridViewState1[DATAGRIDVIEWSTATE1_allowUserToDeleteRows] = value;
 777                     OnAllowUserToDeleteRowsChanged(EventArgs.Empty);
 778                 }
 779             }
 780         }
 781  
 782         internal bool AllowUserToDeleteRowsInternal
 783         {
 784             get
 785             {
 786                 if (this.DataSource == null)
 787                 {
 788                     return this.AllowUserToDeleteRows;
 789                 }
 790                 else
 791                 {
 792                     return this.AllowUserToDeleteRows && this.dataConnection.AllowRemove;
 793                 }
 794             }
 795         }
 796  
 797         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AllowUserToDeleteRowsChanged"]/*‘ />
 798         [
 799             SRCategory(SR.CatPropertyChanged), 
 800             SRDescription(SR.DataGridViewOnAllowUserToDeleteRowsChangedDescr)
 801         ]
 802         public event EventHandler AllowUserToDeleteRowsChanged
 803         {
 804             add
 805             {
 806                 this.Events.AddHandler(EVENT_DATAGRIDVIEWALLOWUSERTODELETEROWSCHANGED, value);
 807             }
 808             remove
 809             {
 810                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWALLOWUSERTODELETEROWSCHANGED, value);
 811             }
 812         }
 813  
 814         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AllowUserToOrderColumns"]/*‘ />
 815         [
 816             DefaultValue(false),
 817             SRCategory(SR.CatBehavior),
 818             SRDescription(SR.DataGridView_AllowUserToOrderColumnsDescr)
 819         ]
 820         public bool AllowUserToOrderColumns
 821         {
 822             get
 823             {
 824                 return this.dataGridViewState1[DATAGRIDVIEWSTATE1_allowUserToOrderColumns];
 825             }
 826             set
 827             {
 828                 if (this.AllowUserToOrderColumns != value)
 829                 {
 830                     this.dataGridViewState1[DATAGRIDVIEWSTATE1_allowUserToOrderColumns] = value;
 831                     OnAllowUserToOrderColumnsChanged(EventArgs.Empty);
 832                 }
 833             }
 834         }
 835  
 836         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AllowUserToOrderColumnsChanged"]/*‘ />
 837         [
 838             SRCategory(SR.CatPropertyChanged), 
 839             SRDescription(SR.DataGridViewOnAllowUserToOrderColumnsChangedDescr)
 840         ]
 841         public event EventHandler AllowUserToOrderColumnsChanged
 842         {
 843             add
 844             {
 845                 this.Events.AddHandler(EVENT_DATAGRIDVIEWALLOWUSERTOORDERCOLUMNSCHANGED, value);
 846             }
 847             remove
 848             {
 849                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWALLOWUSERTOORDERCOLUMNSCHANGED, value);
 850             }
 851         }
 852  
 853         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AllowUserToResizeColumns"]/*‘ />
 854         /// <devdoc>
 855         ///    <para>
 856         ///       Gets or sets a global value indicating if the dataGridView‘s columns are resizable with the mouse.
 857         ///       The resizable aspect of a column can be overridden by DataGridViewColumn.Resizable.
 858         ///    </para>
 859         /// </devdoc>
 860         [
 861             DefaultValue(true),
 862             SRCategory(SR.CatBehavior),
 863             SRDescription(SR.DataGridView_AllowUserToResizeColumnsDescr)
 864         ]
 865         public bool AllowUserToResizeColumns
 866         {
 867             get
 868             {
 869                 return this.dataGridViewState2[DATAGRIDVIEWSTATE2_allowUserToResizeColumns];
 870             }
 871             set
 872             {
 873                 if (this.AllowUserToResizeColumns != value)
 874                 {
 875                     this.dataGridViewState2[DATAGRIDVIEWSTATE2_allowUserToResizeColumns] = value;
 876                     OnAllowUserToResizeColumnsChanged(EventArgs.Empty);
 877                 }
 878             }
 879         }
 880  
 881         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AllowUserToResizeColumnsChanged"]/*‘ />
 882         [
 883             SRCategory(SR.CatPropertyChanged), 
 884             SRDescription(SR.DataGridViewOnAllowUserToResizeColumnsChangedDescr)
 885         ]
 886         public event EventHandler AllowUserToResizeColumnsChanged
 887         {
 888             add
 889             {
 890                 this.Events.AddHandler(EVENT_DATAGRIDVIEWALLOWUSERTORESIZECOLUMNSCHANGED, value);
 891             }
 892             remove
 893             {
 894                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWALLOWUSERTORESIZECOLUMNSCHANGED, value);
 895             }
 896         }
 897  
 898         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AllowUserToResizeRows"]/*‘ />
 899         /// <devdoc>
 900         ///    <para>
 901         ///       Gets or sets a global value indicating if the dataGridView‘s rows are resizable with the mouse.
 902         ///       The resizable aspect of a row can be overridden by DataGridViewRow.Resizable.
 903         ///    </para>
 904         /// </devdoc>
 905         [
 906             DefaultValue(true),
 907             SRCategory(SR.CatBehavior),
 908             SRDescription(SR.DataGridView_AllowUserToResizeRowsDescr)
 909         ]
 910         public bool AllowUserToResizeRows
 911         {
 912             get
 913             {
 914                 return this.dataGridViewState2[DATAGRIDVIEWSTATE2_allowUserToResizeRows];
 915             }
 916             set
 917             {
 918                 if (this.AllowUserToResizeRows != value)
 919                 {
 920                     this.dataGridViewState2[DATAGRIDVIEWSTATE2_allowUserToResizeRows] = value;
 921                     OnAllowUserToResizeRowsChanged(EventArgs.Empty);
 922                 }
 923             }
 924         }
 925  
 926         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AllowUserToResizeRowsChanged"]/*‘ />
 927         [
 928             SRCategory(SR.CatPropertyChanged), 
 929             SRDescription(SR.DataGridViewOnAllowUserToResizeRowsChangedDescr)
 930         ]
 931         public event EventHandler AllowUserToResizeRowsChanged
 932         {
 933             add
 934             {
 935                 this.Events.AddHandler(EVENT_DATAGRIDVIEWALLOWUSERTORESIZEROWSCHANGED, value);
 936             }
 937             remove
 938             {
 939                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWALLOWUSERTORESIZEROWSCHANGED, value);
 940             }
 941         }
 942  
 943         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AlternatingRowsDefaultCellStyle"]/*‘ />        
 944         [
 945             SRCategory(SR.CatAppearance),
 946             SRDescription(SR.DataGridView_AlternatingRowsDefaultCellStyleDescr)
 947         ]
 948         public DataGridViewCellStyle AlternatingRowsDefaultCellStyle
 949         {
 950             get
 951             {
 952                 if (this.alternatingRowsDefaultCellStyle == null)
 953                 {
 954                     this.alternatingRowsDefaultCellStyle = new DataGridViewCellStyle();
 955                     this.alternatingRowsDefaultCellStyle.AddScope(this, DataGridViewCellStyleScopes.AlternatingRows);
 956                 }
 957                 return this.alternatingRowsDefaultCellStyle;
 958             }
 959             set
 960             {
 961                 DataGridViewCellStyle cs = this.AlternatingRowsDefaultCellStyle;
 962                 cs.RemoveScope(DataGridViewCellStyleScopes.AlternatingRows);
 963                 this.alternatingRowsDefaultCellStyle = value;
 964                 if (value != null)
 965                 {
 966                     this.alternatingRowsDefaultCellStyle.AddScope(this, DataGridViewCellStyleScopes.AlternatingRows);
 967                 }
 968                 DataGridViewCellStyleDifferences dgvcsc = cs.GetDifferencesFrom(this.AlternatingRowsDefaultCellStyle);
 969                 if (dgvcsc != DataGridViewCellStyleDifferences.None)
 970                 {
 971                     this.CellStyleChangedEventArgs.ChangeAffectsPreferredSize = (dgvcsc == DataGridViewCellStyleDifferences.AffectPreferredSize);
 972                     OnAlternatingRowsDefaultCellStyleChanged(this.CellStyleChangedEventArgs);
 973                 }
 974             }
 975         }
 976  
 977         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AlternatingRowsDefaultCellStyleChanged"]/*‘ />
 978         [
 979             SRCategory(SR.CatPropertyChanged), 
 980             SRDescription(SR.DataGridViewAlternatingRowsDefaultCellStyleChangedDescr)
 981         ]
 982         public event EventHandler AlternatingRowsDefaultCellStyleChanged
 983         {
 984             add
 985             {
 986                 this.Events.AddHandler(EVENT_DATAGRIDVIEWALTERNATINGROWSDEFAULTCELLSTYLECHANGED, value);
 987             }
 988             remove
 989             {
 990                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWALTERNATINGROWSDEFAULTCELLSTYLECHANGED, value);
 991             }
 992         }
 993  
 994         internal bool ApplyVisualStylesToInnerCells
 995         {
 996             get
 997             {
 998                 return Application.RenderWithVisualStyles;
 999             }
1000         }
1001  
1002         internal bool ApplyVisualStylesToHeaderCells
1003         {
1004             get
1005             {
1006                 return Application.RenderWithVisualStyles && this.EnableHeadersVisualStyles;
1007             }
1008         }
1009  
1010         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AutoGenerateColumns"]/*‘ />
1011         /// <devdoc>
1012         ///    <para>
1013         ///    </para>
1014         /// </devdoc>
1015         [
1016             Browsable(false),
1017             EditorBrowsable(EditorBrowsableState.Advanced),
1018             DefaultValue(true)
1019         ]
1020         public bool AutoGenerateColumns
1021         {
1022             get
1023             {
1024                 return this.dataGridViewState1[DATAGRIDVIEWSTATE1_autoGenerateColumns];
1025             }
1026             set{
1027                 if (this.dataGridViewState1[DATAGRIDVIEWSTATE1_autoGenerateColumns] != value)
1028                 {
1029                     this.dataGridViewState1[DATAGRIDVIEWSTATE1_autoGenerateColumns] = value;
1030                     OnAutoGenerateColumnsChanged(EventArgs.Empty);
1031                 }
1032             }
1033         }
1034  
1035         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AutoGenerateColumnsChanged"]/*‘ />
1036         [
1037             Browsable(false),
1038             EditorBrowsable(EditorBrowsableState.Advanced)
1039         ]
1040         public event EventHandler AutoGenerateColumnsChanged
1041         {
1042             add
1043             {
1044                 this.Events.AddHandler(EVENT_DATAGRIDVIEWAUTOGENERATECOLUMNSCHANGED, value);
1045             }
1046             remove
1047             {
1048                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWAUTOGENERATECOLUMNSCHANGED, value);
1049             }
1050         }
1051  
1052         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AutoSize"]/*‘ />
1053         /// <devdoc>
1054         ///    <para> Overriding base implementation for perf gains. </para>
1055         /// </devdoc>
1056         public override bool AutoSize
1057         {
1058             get
1059             {
1060                 return this.dataGridViewState1[DATAGRIDVIEWSTATE1_isAutoSized];
1061             }
1062             set
1063             {
1064                 base.AutoSize = value;
1065                 this.dataGridViewState1[DATAGRIDVIEWSTATE1_isAutoSized] = value;
1066             }
1067         }
1068  
1069         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AutoSizeColumnsMode"]/*‘ />
1070         /// <devdoc>
1071         ///    <para> Gets or sets the columns‘ autosizing mode. Standard inheritance model is used:
1072         ///           Columns with AutoSizeMode property set to NotSet will use this auto size mode.
1073         ///    </para>
1074         /// </devdoc>
1075         [
1076             DefaultValue(DataGridViewAutoSizeColumnsMode.None),
1077             SRCategory(SR.CatLayout),
1078             SRDescription(SR.DataGridView_AutoSizeColumnsModeDescr)
1079         ]
1080         public DataGridViewAutoSizeColumnsMode AutoSizeColumnsMode
1081         {
1082             get
1083             {
1084                 return this.autoSizeColumnsMode;
1085             }
1086         
1087             set
1088             {
1089                 switch (value) 
1090                 { 
1091                     case DataGridViewAutoSizeColumnsMode.None:
1092                     case DataGridViewAutoSizeColumnsMode.ColumnHeader:
1093                     case DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader:
1094                     case DataGridViewAutoSizeColumnsMode.AllCells:
1095                     case DataGridViewAutoSizeColumnsMode.DisplayedCellsExceptHeader:
1096                     case DataGridViewAutoSizeColumnsMode.DisplayedCells:
1097                     case DataGridViewAutoSizeColumnsMode.Fill:
1098                         break;
1099                     default: 
1100                         throw new InvalidEnumArgumentException("value", (int)value, typeof(DataGridViewAutoSizeColumnsMode)); 
1101                  }
1102  
1103  
1104                 if (this.autoSizeColumnsMode != value)
1105                 {
1106                     foreach (DataGridViewColumn dataGridViewColumn in this.Columns)
1107                     {
1108                         if (dataGridViewColumn.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet && dataGridViewColumn.Visible)
1109                         {
1110                             // Make sure there is no visible column which would have an inherited autosize mode based on the header only.
1111                             if (value == DataGridViewAutoSizeColumnsMode.ColumnHeader && !this.ColumnHeadersVisible)
1112                             {
1113                                 throw new InvalidOperationException(SR.GetString(SR.DataGridView_CannotAutoSizeColumnsInvisibleColumnHeaders));
1114                             }
1115                             // Make sure there is no visible frozen column which would have a Fill inherited autosize mode.
1116                             if (value == DataGridViewAutoSizeColumnsMode.Fill && dataGridViewColumn.Frozen)
1117                             {
1118                                 throw new InvalidOperationException(SR.GetString(SR.DataGridView_CannotAutoFillFrozenColumns));
1119                             }
1120                         }
1121                     }
1122                     DataGridViewAutoSizeColumnMode[] previousModes = new DataGridViewAutoSizeColumnMode[this.Columns.Count];
1123                     foreach (DataGridViewColumn dataGridViewColumn in this.Columns)
1124                     {
1125                         /*DataGridViewAutoSizeColumnMode previousInheritedMode = dataGridViewColumn.InheritedAutoSizeMode;
1126                         bool previousInheritedModeAutoSized = previousInheritedMode != DataGridViewAutoSizeColumnMode.Fill &&
1127                                                               previousInheritedMode != DataGridViewAutoSizeColumnMode.None &&
1128                                                               previousInheritedMode != DataGridViewAutoSizeColumnMode.NotSet;*/
1129                         previousModes[dataGridViewColumn.Index] = dataGridViewColumn.InheritedAutoSizeMode;
1130                     }
1131                     DataGridViewAutoSizeColumnsModeEventArgs dgvcasme = new DataGridViewAutoSizeColumnsModeEventArgs(previousModes);
1132                     this.autoSizeColumnsMode = value;
1133                     OnAutoSizeColumnsModeChanged(dgvcasme);
1134                 }
1135             }
1136         }
1137  
1138         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AutoSizeColumnsModeChanged"]/*‘ />
1139         [
1140             SRCategory(SR.CatPropertyChanged), 
1141             SRDescription(SR.DataGridViewAutoSizeColumnsModeChangedDescr)
1142         ]
1143         public event DataGridViewAutoSizeColumnsModeEventHandler AutoSizeColumnsModeChanged
1144         {
1145             add
1146             {
1147                 this.Events.AddHandler(EVENT_DATAGRIDVIEWAUTOSIZECOLUMNSMODECHANGED, value);
1148             }
1149             remove
1150             {
1151                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWAUTOSIZECOLUMNSMODECHANGED, value);
1152             }
1153         }
1154  
1155         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AutoSizeRowsMode"]/*‘ />
1156         /// <devdoc>
1157         ///    <para> Gets or sets the rows‘ autosizing mode. </para>
1158         /// </devdoc>
1159         [
1160             DefaultValue(DataGridViewAutoSizeRowsMode.None),
1161             SRCategory(SR.CatLayout),
1162             SRDescription(SR.DataGridView_AutoSizeRowsModeDescr)
1163         ]
1164         public DataGridViewAutoSizeRowsMode AutoSizeRowsMode
1165         {
1166             get
1167             {
1168                 return this.autoSizeRowsMode;
1169             }
1170             set
1171             {
1172                 switch (value) 
1173                 { 
1174                    case DataGridViewAutoSizeRowsMode.None:
1175                    case DataGridViewAutoSizeRowsMode.AllHeaders:
1176                    case DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders:
1177                    case DataGridViewAutoSizeRowsMode.AllCells:
1178                    case DataGridViewAutoSizeRowsMode.DisplayedHeaders:
1179                    case DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders:
1180                    case DataGridViewAutoSizeRowsMode.DisplayedCells:
1181                        break;
1182                    default: 
1183                        throw new InvalidEnumArgumentException("value", (int)value, typeof(DataGridViewAutoSizeRowsMode)); 
1184                 }
1185                 if ((value == DataGridViewAutoSizeRowsMode.AllHeaders || value == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && 
1186                     !this.RowHeadersVisible)
1187                 {
1188                     throw new InvalidOperationException(SR.GetString(SR.DataGridView_CannotAutoSizeRowsInvisibleRowHeader));
1189                 }
1190                 if (this.autoSizeRowsMode != value)
1191                 {
1192                     DataGridViewAutoSizeModeEventArgs dgvasme = new DataGridViewAutoSizeModeEventArgs(this.autoSizeRowsMode != DataGridViewAutoSizeRowsMode.None);
1193                     this.autoSizeRowsMode = value;
1194                     OnAutoSizeRowsModeChanged(dgvasme);
1195                 }
1196             }
1197         }
1198  
1199         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AutoSizeRowsModeChanged"]/*‘ />
1200         [
1201             SRCategory(SR.CatPropertyChanged), 
1202             SRDescription(SR.DataGridViewAutoSizeRowsModeChangedDescr)
1203         ]
1204         public event DataGridViewAutoSizeModeEventHandler AutoSizeRowsModeChanged
1205         {
1206             add 
1207             {
1208                 this.Events.AddHandler(EVENT_DATAGRIDVIEWAUTOSIZEROWSMODECHANGED, value);
1209             }
1210             remove 
1211             {
1212                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWAUTOSIZEROWSMODECHANGED, value);
1213             }
1214         }
1215         
1216         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.BackColor"]/*‘ />
1217         /// <internalonly/>
1218         [
1219             Browsable(false), 
1220             EditorBrowsable(EditorBrowsableState.Never),
1221             DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
1222         ]
1223         public override Color BackColor
1224         {
1225             get 
1226             {
1227                 return base.BackColor;
1228             }
1229             set 
1230             {
1231                 base.BackColor = value;
1232             }
1233         }
1234  
1235         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.BackColorChanged"]/*‘ />
1236         /// <internalonly/>
1237         [
1238             Browsable(false),
1239             EditorBrowsable(EditorBrowsableState.Never)
1240         ]
1241         new public event EventHandler BackColorChanged
1242         {
1243             add
1244             {
1245                 base.BackColorChanged += value;
1246             }
1247             remove
1248             {
1249                 base.BackColorChanged -= value;
1250             }
1251         }
1252  
1253         internal SolidBrush BackgroundBrush 
1254         {
1255             get 
1256             {
1257                 return this.backgroundBrush;
1258             }
1259         }
1260  
1261         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.BackgroundColor"]/*‘ />
1262         /// <devdoc>
1263         ///    <para>Gets or sets the background color of the dataGridView.</para>
1264         /// </devdoc>
1265         [
1266             SRCategory(SR.CatAppearance),
1267             SRDescription(SR.DataGridViewBackgroundColorDescr)
1268         ]
1269         public Color BackgroundColor
1270         {
1271             get
1272             {
1273                 return this.backgroundBrush.Color;
1274             }
1275             set
1276             {
1277                 if (value.IsEmpty)
1278                 {
1279                     throw new ArgumentException(SR.GetString(SR.DataGridView_EmptyColor, "BackgroundColor"));
1280                 }
1281                 if (value.A < 255)
1282                 {
1283                     throw new ArgumentException(SR.GetString(SR.DataGridView_TransparentColor, "BackgroundColor"));
1284                 }
1285                 if (!value.Equals(this.backgroundBrush.Color)) 
1286                 {
1287                     this.backgroundBrush = new SolidBrush(value);
1288                     OnBackgroundColorChanged(EventArgs.Empty);
1289                 }
1290             }
1291         }
1292  
1293         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.BackgroundColorChanged"]/*‘ />
1294         [
1295             SRCategory(SR.CatPropertyChanged), 
1296             SRDescription(SR.DataGridViewBackgroundColorChangedDescr)
1297         ]
1298         public event EventHandler BackgroundColorChanged 
1299         {
1300             add 
1301             {
1302                 this.Events.AddHandler(EVENT_DATAGRIDVIEWBACKGROUNDCOLORCHANGED, value);
1303             }
1304             remove 
1305             {
1306                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWBACKGROUNDCOLORCHANGED, value);
1307             }
1308         }
1309  
1310         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.BackgroundImage"]/*‘ />
1311         [
1312             Browsable(false),
1313             EditorBrowsable(EditorBrowsableState.Never)
1314         ]
1315         public override Image BackgroundImage
1316         {
1317             get
1318             {
1319                 return base.BackgroundImage;
1320             }
1321             set
1322             {
1323                 base.BackgroundImage = value;
1324             }
1325         }
1326  
1327         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.BackgroundImageLayout"]/*‘ />
1328         [
1329             Browsable(false),
1330             EditorBrowsable(EditorBrowsableState.Never)
1331         ]
1332         public override ImageLayout BackgroundImageLayout
1333         {
1334             get
1335             {
1336                 return base.BackgroundImageLayout;
1337             }
1338             set
1339             {
1340                 base.BackgroundImageLayout = value;
1341             }
1342         }
1343  
1344         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.BackgroundImageChanged"]/*‘ />
1345         [
1346             Browsable(false),
1347             EditorBrowsable(EditorBrowsableState.Never)
1348         ]
1349         new public event EventHandler BackgroundImageChanged
1350         {
1351             add
1352             {
1353                 base.BackgroundImageChanged += value;
1354             }
1355             remove
1356             {
1357                 base.BackgroundImageChanged -= value;
1358             }
1359         }
1360  
1361         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.BackgroundImageLayoutChanged"]/*‘ />
1362         [
1363             Browsable(false),
1364             EditorBrowsable(EditorBrowsableState.Never)
1365         ]
1366         new public event EventHandler BackgroundImageLayoutChanged
1367         {
1368             add
1369             {
1370                 base.BackgroundImageLayoutChanged += value;
1371             }
1372             remove
1373             {
1374                 base.BackgroundImageLayoutChanged -= value;
1375             }
1376         }
1377  
1378         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ShouldSerializeBackgroundColor"]/*‘ />
1379         private bool ShouldSerializeBackgroundColor()
1380         {
1381             return !this.BackgroundColor.Equals(DefaultBackgroundBrush.Color);
1382         }
1383  
1384         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.BorderStyle"]/*‘ />
1385         [
1386             DefaultValue(BorderStyle.FixedSingle),
1387             SRCategory(SR.CatAppearance),
1388             SRDescription(SR.DataGridView_BorderStyleDescr)
1389         ]
1390         public BorderStyle BorderStyle
1391         {
1392             get 
1393             {
1394                 return this.borderStyle;
1395             }
1396             set 
1397             {
1398                 // Sequential enum.  Valid values are 0x0 to 0x2
1399                 if (!ClientUtils.IsEnumValid(value, (int)value, (int)BorderStyle.None, (int)BorderStyle.Fixed3D)){
1400                     throw new InvalidEnumArgumentException("value", (int)value, typeof(BorderStyle)); 
1401                 }
1402                 if (this.borderStyle != value) 
1403                 {
1404                     using (LayoutTransaction.CreateTransactionIf(this.AutoSize, this.ParentInternal, this, PropertyNames.BorderStyle))
1405                     {
1406                         this.borderStyle = value;
1407                         if (!this.AutoSize)
1408                         {
1409                             PerformLayoutPrivate(false /*useRowShortcut*/, false /*computeVisibleRows*/, true /*invalidInAdjustFillingColumns*/, true /*repositionEditingControl*/);
1410                         }
1411                         Invalidate();
1412                         OnBorderStyleChanged(EventArgs.Empty);
1413                     }
1414                 }
1415             }
1416         }
1417  
1418         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.BorderStyleChanged"]/*‘ />
1419         [
1420             SRCategory(SR.CatPropertyChanged), 
1421             SRDescription(SR.DataGridViewBorderStyleChangedDescr)
1422         ]
1423         public event EventHandler BorderStyleChanged
1424         {
1425             add
1426             {
1427                 this.Events.AddHandler(EVENT_DATAGRIDVIEWBORDERSTYLECHANGED, value);
1428             }
1429             remove
1430             {
1431                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWBORDERSTYLECHANGED, value);
1432             }
1433         }
1434  
1435         private int BorderWidth 
1436         {
1437             get 
1438             {
1439                 if (this.BorderStyle == BorderStyle.Fixed3D) 
1440                 {
1441                     return Application.RenderWithVisualStyles ? 1 : SystemInformation.Border3DSize.Width;
1442                 }
1443                 else if (this.BorderStyle == BorderStyle.FixedSingle) 
1444                 {
1445                     return 1;
1446                 }
1447                 else 
1448                 {
1449                     return 0;
1450                 }
1451             }
1452         }
1453  
1454         // Ime can be shown when there is a read-write current cell.
1455         protected override bool CanEnableIme
1456         {
1457             get
1458             {
1459                 bool canEnable = false;
1460  
1461                 Debug.WriteLineIf( CompModSwitches.ImeMode.Level >= TraceLevel.Info, "Inside get_CanEnableIme(), this = " + this );
1462                 Debug.Indent();
1463  
1464                 if (this.ptCurrentCell.X != -1 /*&& !this.IsCurrentCellInEditMode*/ && ColumnEditable(this.ptCurrentCell.X))
1465                 {
1466                     DataGridViewCell dataGridViewCell = this.CurrentCellInternal;
1467                     Debug.Assert(dataGridViewCell != null);
1468  
1469                     if (!IsSharedCellReadOnly(dataGridViewCell, this.ptCurrentCell.Y))
1470                     {
1471                         canEnable = base.CanEnableIme;
1472                     }
1473                 }
1474  
1475                 Debug.WriteLineIf( CompModSwitches.ImeMode.Level >= TraceLevel.Info, "Value = " + canEnable );
1476                 Debug.Unindent();
1477  
1478                 return canEnable;
1479             }
1480         }
1481  
1482         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AdvancedCellBorderStyle"]/*‘ />
1483         [
1484             SRCategory(SR.CatAppearance),
1485             SRDescription(SR.DataGridView_CellBorderStyleDescr),
1486             Browsable(true),
1487             DefaultValue(DataGridViewCellBorderStyle.Single)
1488         ]
1489         public DataGridViewCellBorderStyle CellBorderStyle
1490         {
1491             get 
1492             {
1493                 switch (this.advancedCellBorderStyle.All)
1494                 {
1495                     case DataGridViewAdvancedCellBorderStyle.NotSet:
1496                         if (this.advancedCellBorderStyle.Top == DataGridViewAdvancedCellBorderStyle.None &&
1497                             this.advancedCellBorderStyle.Bottom == DataGridViewAdvancedCellBorderStyle.None)
1498                         {
1499                             if (this.RightToLeftInternal)
1500                             {
1501                                 if (this.advancedCellBorderStyle.Right == DataGridViewAdvancedCellBorderStyle.None &&
1502                                     this.advancedCellBorderStyle.Left == DataGridViewAdvancedCellBorderStyle.Single)
1503                                 {
1504                                     return DataGridViewCellBorderStyle.SingleVertical;
1505                                 }
1506                             }
1507                             else
1508                             {
1509                                 if (this.advancedCellBorderStyle.Left == DataGridViewAdvancedCellBorderStyle.None &&
1510                                     this.advancedCellBorderStyle.Right == DataGridViewAdvancedCellBorderStyle.Single)
1511                                 {
1512                                     return DataGridViewCellBorderStyle.SingleVertical;
1513                                 }
1514                             }
1515                             if (this.advancedCellBorderStyle.Right == DataGridViewAdvancedCellBorderStyle.Outset && 
1516                                 this.advancedCellBorderStyle.Left == DataGridViewAdvancedCellBorderStyle.Outset)
1517                             {
1518                                 return DataGridViewCellBorderStyle.RaisedVertical;
1519                             }
1520                             if (this.advancedCellBorderStyle.Right == DataGridViewAdvancedCellBorderStyle.Inset && 
1521                                 this.advancedCellBorderStyle.Left == DataGridViewAdvancedCellBorderStyle.Inset)
1522                             {
1523                                 return DataGridViewCellBorderStyle.SunkenVertical;
1524                             }
1525                         }
1526                         if (this.advancedCellBorderStyle.Left == DataGridViewAdvancedCellBorderStyle.None &&
1527                             this.advancedCellBorderStyle.Right == DataGridViewAdvancedCellBorderStyle.None)
1528                         {
1529                             if (this.advancedCellBorderStyle.Top == DataGridViewAdvancedCellBorderStyle.None &&
1530                                 this.advancedCellBorderStyle.Bottom == DataGridViewAdvancedCellBorderStyle.Single)
1531                             {
1532                                 return DataGridViewCellBorderStyle.SingleHorizontal;
1533                             }
1534                             if (this.advancedCellBorderStyle.Top == DataGridViewAdvancedCellBorderStyle.Outset && 
1535                                 this.advancedCellBorderStyle.Bottom == DataGridViewAdvancedCellBorderStyle.Outset)
1536                             {
1537                                 return DataGridViewCellBorderStyle.RaisedHorizontal;
1538                             }
1539                             if (this.advancedCellBorderStyle.Top == DataGridViewAdvancedCellBorderStyle.Inset && 
1540                                 this.advancedCellBorderStyle.Bottom == DataGridViewAdvancedCellBorderStyle.Inset)
1541                             {
1542                                 return DataGridViewCellBorderStyle.SunkenHorizontal;
1543                             }
1544                         }
1545                         return DataGridViewCellBorderStyle.Custom;
1546  
1547                     case DataGridViewAdvancedCellBorderStyle.None:
1548                         return DataGridViewCellBorderStyle.None;
1549  
1550                     case DataGridViewAdvancedCellBorderStyle.Single:
1551                         return DataGridViewCellBorderStyle.Single;
1552  
1553                     case DataGridViewAdvancedCellBorderStyle.Inset:
1554                         return DataGridViewCellBorderStyle.Sunken;
1555  
1556                     case DataGridViewAdvancedCellBorderStyle.Outset:
1557                         return DataGridViewCellBorderStyle.Raised;
1558  
1559                     default:
1560                         Debug.Fail("Unexpected this.advancedCellBorderStyle.All value in CellBorderStyle.get");
1561                         return DataGridViewCellBorderStyle.Custom;
1562                 }
1563             }
1564             set
1565             {
1566                 // Sequential enum.  Valid values are 0x0 to 0xa
1567                 if (!ClientUtils.IsEnumValid(value, (int)value, (int)DataGridViewCellBorderStyle.Custom, (int)DataGridViewCellBorderStyle.SunkenHorizontal))
1568                 {
1569                      throw new InvalidEnumArgumentException("value", (int)value, typeof(DataGridViewCellBorderStyle)); 
1570                 }
1571  
1572                 if (value != this.CellBorderStyle)
1573                 {
1574                     if (value == DataGridViewCellBorderStyle.Custom)
1575                     {
1576                         throw new ArgumentException(SR.GetString(SR.DataGridView_CustomCellBorderStyleInvalid, "CellBorderStyle"));
1577                     }
1578                     this.dataGridViewOper[DATAGRIDVIEWOPER_inBorderStyleChange] = true;
1579                     try
1580                     {
1581                         switch (value)
1582                         {
1583                             case DataGridViewCellBorderStyle.Single:
1584                                 this.advancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
1585                                 break;
1586  
1587                             case DataGridViewCellBorderStyle.Raised:
1588                                 this.advancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Outset;
1589                                 break;
1590  
1591                             case DataGridViewCellBorderStyle.Sunken:
1592                                 this.advancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Inset;
1593                                 break;
1594  
1595                             case DataGridViewCellBorderStyle.None:
1596                                 this.advancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.None;
1597                                 break;
1598  
1599                             case DataGridViewCellBorderStyle.SingleVertical:
1600                                 this.advancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.None;
1601                                 if (this.RightToLeftInternal)
1602                                 {
1603                                     this.advancedCellBorderStyle.LeftInternal = DataGridViewAdvancedCellBorderStyle.Single;
1604                                 }
1605                                 else
1606                                 {
1607                                     this.advancedCellBorderStyle.RightInternal = DataGridViewAdvancedCellBorderStyle.Single;
1608                                 }
1609                                 break;
1610  
1611                             case DataGridViewCellBorderStyle.RaisedVertical:
1612                                 this.advancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.None;
1613                                 this.advancedCellBorderStyle.RightInternal = DataGridViewAdvancedCellBorderStyle.Outset;
1614                                 this.advancedCellBorderStyle.LeftInternal = DataGridViewAdvancedCellBorderStyle.Outset;
1615                                 break;
1616  
1617                             case DataGridViewCellBorderStyle.SunkenVertical:
1618                                 this.advancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.None;
1619                                 this.advancedCellBorderStyle.RightInternal = DataGridViewAdvancedCellBorderStyle.Inset;
1620                                 this.advancedCellBorderStyle.LeftInternal = DataGridViewAdvancedCellBorderStyle.Inset;
1621                                 break;
1622  
1623                             case DataGridViewCellBorderStyle.SingleHorizontal:
1624                                 this.advancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.None;
1625                                 this.advancedCellBorderStyle.BottomInternal = DataGridViewAdvancedCellBorderStyle.Single;
1626                                 break;
1627  
1628                             case DataGridViewCellBorderStyle.RaisedHorizontal:
1629                                 this.advancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.None;
1630                                 this.advancedCellBorderStyle.TopInternal = DataGridViewAdvancedCellBorderStyle.Outset;
1631                                 this.advancedCellBorderStyle.BottomInternal = DataGridViewAdvancedCellBorderStyle.Outset;
1632                                 break;
1633  
1634                             case DataGridViewCellBorderStyle.SunkenHorizontal:
1635                                 this.advancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.None;
1636                                 this.advancedCellBorderStyle.TopInternal = DataGridViewAdvancedCellBorderStyle.Inset;
1637                                 this.advancedCellBorderStyle.BottomInternal = DataGridViewAdvancedCellBorderStyle.Inset;
1638                                 break;
1639                         }
1640                     }
1641                     finally
1642                     {
1643                         this.dataGridViewOper[DATAGRIDVIEWOPER_inBorderStyleChange] = false;
1644                     }
1645                     OnCellBorderStyleChanged(EventArgs.Empty);
1646                 }
1647             }
1648         }
1649  
1650         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellBorderStyleChanged"]/*‘ />
1651         [
1652             SRCategory(SR.CatPropertyChanged), 
1653             SRDescription(SR.DataGridView_CellBorderStyleChangedDescr)
1654         ]
1655         public event EventHandler CellBorderStyleChanged
1656         {
1657             add
1658             {
1659                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLBORDERSTYLECHANGED, value);
1660             }
1661             remove
1662             {
1663                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLBORDERSTYLECHANGED, value);
1664             }
1665         }
1666  
1667         internal bool CellMouseDownInContentBounds
1668         {
1669             get
1670             {
1671                 return this.dataGridViewState2[DATAGRIDVIEWSTATE2_cellMouseDownInContentBounds];
1672             }
1673             set
1674             {
1675                 this.dataGridViewState2[DATAGRIDVIEWSTATE2_cellMouseDownInContentBounds] = value;
1676             }
1677         }
1678  
1679         internal DataGridViewCellPaintingEventArgs CellPaintingEventArgs
1680         {
1681             get
1682             {
1683                 if (this.dgvcpe == null)
1684                 {
1685                     this.dgvcpe = new DataGridViewCellPaintingEventArgs(this);
1686                 }
1687                 return this.dgvcpe;
1688             }
1689         }
1690  
1691         private DataGridViewCellStyleChangedEventArgs CellStyleChangedEventArgs
1692         {
1693             get
1694             {
1695                 if (this.dgvcsce == null)
1696                 {
1697                     this.dgvcsce = new DataGridViewCellStyleChangedEventArgs();
1698                 }
1699                 return this.dgvcsce;
1700             }
1701         }        
1702  
1703         internal DataGridViewCellValueEventArgs CellValueEventArgs
1704         {
1705             get
1706             {
1707                 if (this.dgvcve == null)
1708                 {
1709                     this.dgvcve = new DataGridViewCellValueEventArgs();
1710                 }
1711                 return this.dgvcve;
1712             }
1713         }
1714  
1715         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ClipboardCopyMode"]/*‘ />
1716         [
1717             Browsable(true),
1718             DefaultValue(DataGridViewClipboardCopyMode.EnableWithAutoHeaderText),
1719             SRCategory(SR.CatBehavior),
1720             SRDescription(SR.DataGridView_ClipboardCopyModeDescr)
1721         ]
1722         public DataGridViewClipboardCopyMode ClipboardCopyMode
1723         {
1724             get
1725             {
1726                 return this.clipboardCopyMode;
1727             }
1728             set
1729             {
1730                 // Sequential enum.  Valid values are 0x0 to 0x3
1731                 if (!ClientUtils.IsEnumValid(value, (int)value, (int)DataGridViewClipboardCopyMode.Disable, (int)DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText))
1732                 {
1733                    throw new InvalidEnumArgumentException("value", (int)value, typeof(DataGridViewClipboardCopyMode)); 
1734                 }
1735                 this.clipboardCopyMode = value;
1736             }
1737         }
1738  
1739         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnCount"]/*‘ />
1740         [
1741             Browsable(false),
1742             DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
1743             DefaultValue(0),
1744             EditorBrowsable(EditorBrowsableState.Advanced)
1745         ]
1746         public int ColumnCount
1747         {
1748             get
1749             {
1750                 return this.Columns.Count;
1751             }
1752             set
1753             {
1754                 if (value < 0)
1755                 {
1756                     throw new ArgumentOutOfRangeException("ColumnCount", SR.GetString(SR.InvalidLowBoundArgumentEx, "ColumnCount", value.ToString(CultureInfo.CurrentCulture), (0).ToString(CultureInfo.CurrentCulture)));
1757                 }
1758                 if (this.DataSource != null)
1759                 {
1760                     throw new InvalidOperationException(SR.GetString(SR.DataGridView_CannotSetColumnCountOnDataBoundDataGridView));
1761                 }
1762                 if (value != this.Columns.Count)
1763                 {
1764                     if (value == 0)
1765                     {
1766                         // Total removal of the columns. This also clears the rows.
1767                         this.Columns.Clear();
1768                     }
1769                     else if (value < this.Columns.Count)
1770                     {
1771                         // Some columns need to be removed, from the tail of the columns collection
1772                         while (value < this.Columns.Count)
1773                         {
1774                             int currentColumnCount = this.Columns.Count;
1775                             this.Columns.RemoveAt(currentColumnCount - 1);
1776                             if (this.Columns.Count >= currentColumnCount)
1777                             {
1778                                 // Column removal failed. We stop the loop.
1779                                 break;
1780                             }
1781                         }
1782                     }
1783                     else
1784                     {
1785                         // Some DataGridViewTextBoxColumn columns need to be appened.
1786                         while (value > this.Columns.Count)
1787                         {
1788                             int currentColumnCount = this.Columns.Count;
1789                             this.Columns.Add(null /*columnName*/, null /*headerText*/);
1790                             if (this.Columns.Count <= currentColumnCount)
1791                             {
1792                                 // Column addition failed. We stop the loop.
1793                                 break;
1794                             }
1795                         }
1796                     }
1797                 }
1798             }
1799         }
1800  
1801         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnHeadersBorderStyle"]/*‘ />
1802         [
1803             SRCategory(SR.CatAppearance),
1804             SRDescription(SR.DataGridView_ColumnHeadersBorderStyleDescr),
1805             Browsable(true),
1806             DefaultValue(DataGridViewHeaderBorderStyle.Raised)
1807         ]
1808         public DataGridViewHeaderBorderStyle ColumnHeadersBorderStyle
1809         {
1810             get 
1811             {
1812                 switch (this.advancedColumnHeadersBorderStyle.All)
1813                 {
1814                     case DataGridViewAdvancedCellBorderStyle.NotSet:
1815                         return DataGridViewHeaderBorderStyle.Custom;
1816  
1817                     case DataGridViewAdvancedCellBorderStyle.None:
1818                         return DataGridViewHeaderBorderStyle.None;
1819  
1820                     case DataGridViewAdvancedCellBorderStyle.Single:
1821                         return DataGridViewHeaderBorderStyle.Single;
1822  
1823                     case DataGridViewAdvancedCellBorderStyle.InsetDouble:
1824                         return DataGridViewHeaderBorderStyle.Sunken;
1825  
1826                     case DataGridViewAdvancedCellBorderStyle.OutsetPartial:
1827                         return DataGridViewHeaderBorderStyle.Raised;
1828  
1829                     default:
1830                         return DataGridViewHeaderBorderStyle.Custom;
1831                 }
1832             }
1833             set
1834             {
1835                 // Sequential enum.  Valid values are 0x0 to 0x4
1836                 if (!ClientUtils.IsEnumValid(value, (int)value, (int)DataGridViewHeaderBorderStyle.Custom, (int)DataGridViewHeaderBorderStyle.None))
1837                 {
1838                     throw new InvalidEnumArgumentException("value", (int)value, typeof(DataGridViewHeaderBorderStyle)); 
1839                 }
1840                 if (value != this.ColumnHeadersBorderStyle)
1841                 {
1842                     if (value == DataGridViewHeaderBorderStyle.Custom)
1843                     {
1844                         throw new ArgumentException(SR.GetString(SR.DataGridView_CustomCellBorderStyleInvalid, "ColumnHeadersBorderStyle"));
1845                     }
1846                     this.dataGridViewOper[DATAGRIDVIEWOPER_inBorderStyleChange] = true;
1847                     try
1848                     {
1849                         switch (value)
1850                         {
1851                             case DataGridViewHeaderBorderStyle.Single:
1852                                 this.advancedColumnHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
1853                                 break;
1854  
1855                             case DataGridViewHeaderBorderStyle.Raised:
1856                                 this.advancedColumnHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.OutsetPartial;
1857                                 break;
1858  
1859                             case DataGridViewHeaderBorderStyle.Sunken:
1860                                 this.advancedColumnHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.InsetDouble;
1861                                 break;
1862  
1863                             case DataGridViewHeaderBorderStyle.None:
1864                                 this.advancedColumnHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.None;
1865                                 break;
1866                         }
1867                     }
1868                     finally
1869                     {
1870                         this.dataGridViewOper[DATAGRIDVIEWOPER_inBorderStyleChange] = false;
1871                     }
1872                     OnColumnHeadersBorderStyleChanged(EventArgs.Empty);
1873                 }
1874             }
1875         }
1876  
1877         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnHeadersBorderStyleChanged"]/*‘ />
1878         [
1879             SRCategory(SR.CatPropertyChanged), 
1880             SRDescription(SR.DataGridView_ColumnHeadersBorderStyleChangedDescr)
1881         ]
1882         public event EventHandler ColumnHeadersBorderStyleChanged
1883         {
1884             add
1885             {
1886                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNHEADERSBORDERSTYLECHANGED, value);
1887             }
1888             remove
1889             {
1890                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNHEADERSBORDERSTYLECHANGED, value);
1891             }
1892         }
1893  
1894         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnHeadersDefaultCellStyle"]/*‘ />
1895         [
1896             SRCategory(SR.CatAppearance),
1897             SRDescription(SR.DataGridView_ColumnHeadersDefaultCellStyleDescr),
1898             AmbientValue(null)
1899         ]
1900         public DataGridViewCellStyle ColumnHeadersDefaultCellStyle
1901         {
1902             get 
1903             {
1904                 if (this.columnHeadersDefaultCellStyle == null)
1905                 {
1906                     this.columnHeadersDefaultCellStyle = this.DefaultColumnHeadersDefaultCellStyle;
1907                 }
1908                 return this.columnHeadersDefaultCellStyle;
1909             }
1910             set 
1911             {
1912                 DataGridViewCellStyle cs = this.ColumnHeadersDefaultCellStyle;
1913                 cs.RemoveScope(DataGridViewCellStyleScopes.ColumnHeaders);
1914                 this.columnHeadersDefaultCellStyle = value;
1915                 if (value != null)
1916                 {
1917                     this.columnHeadersDefaultCellStyle.AddScope(this, DataGridViewCellStyleScopes.ColumnHeaders);
1918                 }
1919                 DataGridViewCellStyleDifferences dgvcsc = cs.GetDifferencesFrom(this.ColumnHeadersDefaultCellStyle);
1920                 if (dgvcsc != DataGridViewCellStyleDifferences.None)
1921                 {
1922                     this.CellStyleChangedEventArgs.ChangeAffectsPreferredSize = (dgvcsc == DataGridViewCellStyleDifferences.AffectPreferredSize);
1923                     OnColumnHeadersDefaultCellStyleChanged(this.CellStyleChangedEventArgs);
1924                 }
1925             }
1926         }
1927  
1928         private DataGridViewCellStyle DefaultColumnHeadersDefaultCellStyle {
1929             get
1930             {
1931                 DataGridViewCellStyle defaultStyle = new DataGridViewCellStyle();
1932                 defaultStyle.BackColor = DefaultHeadersBackBrush.Color;
1933                 defaultStyle.ForeColor = DefaultForeBrush.Color;
1934                 defaultStyle.SelectionBackColor = DefaultSelectionBackBrush.Color;
1935                 defaultStyle.SelectionForeColor = DefaultSelectionForeBrush.Color;
1936                 defaultStyle.Font = base.Font;
1937                 defaultStyle.AlignmentInternal = DataGridViewContentAlignment.MiddleLeft;
1938                 defaultStyle.WrapModeInternal = DataGridViewTriState.True;
1939                 defaultStyle.AddScope(this, DataGridViewCellStyleScopes.ColumnHeaders);
1940  
1941                 this.dataGridViewState1[DATAGRIDVIEWSTATE1_ambientColumnHeadersFont] = true;
1942  
1943                 return defaultStyle;
1944             }
1945         }
1946  
1947         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnHeadersDefaultCellStyleChanged"]/*‘ />
1948         [
1949             SRCategory(SR.CatPropertyChanged), 
1950             SRDescription(SR.DataGridViewColumnHeadersDefaultCellStyleChangedDescr)
1951         ]
1952         public event EventHandler ColumnHeadersDefaultCellStyleChanged
1953         {
1954             add 
1955             {
1956                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNHEADERSDEFAULTCELLSTYLECHANGED, value);
1957             }
1958             remove 
1959             {
1960                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNHEADERSDEFAULTCELLSTYLECHANGED, value);
1961             }
1962         }
1963  
1964         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnHeadersHeight"]/*‘ />
1965         [
1966             SRCategory(SR.CatAppearance),
1967             Localizable(true), 
1968             SRDescription(SR.DataGridView_ColumnHeadersHeightDescr)
1969         ]
1970         public int ColumnHeadersHeight
1971         {
1972             get 
1973             {
1974                 return this.columnHeadersHeight;
1975             }
1976             set 
1977             {
1978                 if (value < minimumColumnHeadersHeight)
1979                 {
1980                     throw new ArgumentOutOfRangeException("ColumnHeadersHeight", SR.GetString(SR.InvalidLowBoundArgumentEx, "ColumnHeadersHeight", (value).ToString(CultureInfo.CurrentCulture), (minimumColumnHeadersHeight).ToString(CultureInfo.CurrentCulture)));
1981                 }
1982                 if (value > maxHeadersThickness)
1983                 {
1984                     throw new ArgumentOutOfRangeException("ColumnHeadersHeight", SR.GetString(SR.InvalidHighBoundArgumentEx, "ColumnHeadersHeight", (value).ToString(CultureInfo.CurrentCulture), (maxHeadersThickness).ToString(CultureInfo.CurrentCulture)));
1985                 }
1986                 if (this.ColumnHeadersHeightSizeMode == DataGridViewColumnHeadersHeightSizeMode.AutoSize)
1987                 {
1988                     this.cachedColumnHeadersHeight = value;
1989                 }
1990                 else if (this.columnHeadersHeight != value)
1991                 {
1992                     SetColumnHeadersHeightInternal(value, true /*invalidInAdjustFillingColumns*/);
1993                 }
1994             }
1995         }
1996  
1997         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnHeadersHeightChanged"]/*‘ />
1998         [
1999             SRCategory(SR.CatPropertyChanged), 
2000             SRDescription(SR.DataGridViewColumnHeadersHeightChangedDescr)
2001         ]
2002         public event EventHandler ColumnHeadersHeightChanged
2003         {
2004             add 
2005             {
2006                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNHEADERSHEIGHTCHANGED, value);
2007             }
2008             remove 
2009             {
2010                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNHEADERSHEIGHTCHANGED, value);
2011             }
2012         }
2013  
2014         private bool ShouldSerializeColumnHeadersHeight()
2015         {
2016             return this.ColumnHeadersHeightSizeMode != DataGridViewColumnHeadersHeightSizeMode.AutoSize && defaultColumnHeadersHeight != this.ColumnHeadersHeight;
2017         }
2018  
2019         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnHeadersHeightSizeMode"]/*‘ />
2020         /// <devdoc>
2021         ///    <para>
2022         ///       Gets or sets a value that determines the behavior for adjusting the column headers height.
2023         ///    </para>
2024         /// </devdoc>
2025         [
2026             DefaultValue(DataGridViewColumnHeadersHeightSizeMode.EnableResizing),
2027             RefreshProperties(RefreshProperties.All),
2028             SRCategory(SR.CatBehavior),
2029             SRDescription(SR.DataGridView_ColumnHeadersHeightSizeModeDescr)
2030         ]
2031         public DataGridViewColumnHeadersHeightSizeMode ColumnHeadersHeightSizeMode
2032         {
2033             get
2034             {
2035                 return this.columnHeadersHeightSizeMode;
2036             }
2037             set
2038             {
2039                // Sequential enum.  Valid values are 0x0 to 0x2
2040                 if (!ClientUtils.IsEnumValid(value, (int)value, (int)DataGridViewColumnHeadersHeightSizeMode.EnableResizing, (int)DataGridViewColumnHeadersHeightSizeMode.AutoSize))
2041                 {
2042                      throw new InvalidEnumArgumentException("value", (int)value, typeof(DataGridViewColumnHeadersHeightSizeMode)); 
2043                 }
2044                 if (this.columnHeadersHeightSizeMode != value)
2045                 {
2046                     /*if (value == DataGridViewColumnHeadersHeightSizeMode.AutoSize && !this.ColumnHeadersVisible)
2047                     {
2048                         We intentionally don‘t throw an error because of designer code spit order.
2049                     }*/
2050                     DataGridViewAutoSizeModeEventArgs dgvasme = new DataGridViewAutoSizeModeEventArgs(this.columnHeadersHeightSizeMode == DataGridViewColumnHeadersHeightSizeMode.AutoSize);
2051                     this.columnHeadersHeightSizeMode = value;
2052                     OnColumnHeadersHeightSizeModeChanged(dgvasme);
2053                 }
2054             }
2055         }
2056  
2057         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnHeadersHeightSizeModeChanged"]/*‘ />
2058         [
2059             SRCategory(SR.CatPropertyChanged), 
2060             SRDescription(SR.DataGridView_ColumnHeadersHeightSizeModeChangedDescr)
2061         ]
2062         public event DataGridViewAutoSizeModeEventHandler ColumnHeadersHeightSizeModeChanged
2063         {
2064             add
2065             {
2066                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNHEADERSHEIGHTSIZEMODECHANGED, value);
2067             }
2068             remove
2069             {
2070                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNHEADERSHEIGHTSIZEMODECHANGED, value);
2071             }
2072         }
2073  
2074         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnHeadersVisible"]/*‘ />
2075         /// <devdoc>
2076         ///    <para>
2077         ///       Gets
2078         ///       or sets a value indicating if the dataGridView‘s column headers are visible.
2079         ///    </para>
2080         /// </devdoc>
2081         [
2082             SRCategory(SR.CatAppearance),
2083             DefaultValue(true),
2084             SRDescription(SR.DataGridViewColumnHeadersVisibleDescr)
2085         ]
2086         public bool ColumnHeadersVisible 
2087         {
2088             get 
2089             {
2090                 return this.dataGridViewState1[DATAGRIDVIEWSTATE1_columnHeadersVisible];
2091             }
2092             set 
2093             {
2094                 if (this.ColumnHeadersVisible != value)
2095                 {
2096                     if (!value)
2097                     {
2098                         // Make sure that there is no visible column that only counts on the column headers to autosize
2099                         DataGridViewColumn dataGridViewColumn = this.Columns.GetFirstColumn(DataGridViewElementStates.Visible);
2100                         while (dataGridViewColumn != null)
2101                         {
2102                             if (dataGridViewColumn.InheritedAutoSizeMode == DataGridViewAutoSizeColumnMode.ColumnHeader)
2103                             {
2104                                 throw new InvalidOperationException(SR.GetString(SR.DataGridView_ColumnHeadersCannotBeInvisible));
2105                             }
2106                             dataGridViewColumn = this.Columns.GetNextColumn(dataGridViewColumn,
2107                                 DataGridViewElementStates.Visible,
2108                                 DataGridViewElementStates.None);
2109                         }
2110                     }
2111                     using (LayoutTransaction.CreateTransactionIf(this.AutoSize, this.ParentInternal, this, PropertyNames.ColumnHeadersVisible))
2112                     {
2113                         this.dataGridViewState1[DATAGRIDVIEWSTATE1_columnHeadersVisible] = value;
2114                         this.layout.ColumnHeadersVisible = value;
2115                         this.displayedBandsInfo.EnsureDirtyState();
2116                         if (!this.AutoSize)
2117                         {
2118                             PerformLayoutPrivate(false /*useRowShortcut*/, false /*computeVisibleRows*/, true /*invalidInAdjustFillingColumns*/, true /*repositionEditingControl*/);
2119                         }
2120                         InvalidateInside();
2121                         OnColumnHeadersGlobalAutoSize();
2122                     }
2123                 }
2124             }
2125         }
2126  
2127         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.Columns"]/*‘ />
2128         [
2129             Editor("System.Windows.Forms.Design.DataGridViewColumnCollectionEditor, " + AssemblyRef.SystemDesign, typeof(System.Drawing.Design.UITypeEditor)),
2130             DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
2131             MergableProperty(false)
2132         ]
2133         public DataGridViewColumnCollection Columns
2134         {
2135             get
2136             {
2137                 if (this.dataGridViewColumns == null)
2138                 {
2139                     this.dataGridViewColumns = CreateColumnsInstance();
2140                 }
2141                 return this.dataGridViewColumns;
2142             }
2143         }
2144  
2145         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CurrentCell"]/*‘ />
2146         [
2147             Browsable(false),
2148             DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
2149         ]
2150         public DataGridViewCell CurrentCell
2151         {
2152             get
2153             {
2154                 if (this.ptCurrentCell.X == -1 && this.ptCurrentCell.Y == -1)
2155                 {
2156                     return null;
2157                 }
2158                 Debug.Assert(this.ptCurrentCell.X >= 0 && ptCurrentCell.Y >= 0);
2159                 Debug.Assert(this.ptCurrentCell.X < this.Columns.Count);
2160                 Debug.Assert(this.ptCurrentCell.Y < this.Rows.Count);
2161                 DataGridViewRow dataGridViewRow = (DataGridViewRow) this.Rows[this.ptCurrentCell.Y]; // unsharing row
2162                 return dataGridViewRow.Cells[this.ptCurrentCell.X];
2163             }
2164             set
2165             {
2166                 if ((value != null && (value.RowIndex != this.ptCurrentCell.Y || value.ColumnIndex != this.ptCurrentCell.X)) ||
2167                     (value == null && this.ptCurrentCell.X != -1))
2168                 {
2169                     if (value == null)
2170                     {
2171                         ClearSelection();
2172                         if (!SetCurrentCellAddressCore(-1, -1, true /*setAnchorCellAddress*/, true /*validateCurrentCell*/, false /*throughMouseClick*/))
2173                         {
2174                             // Edited value couldn‘t be committed or aborted
2175                             throw new InvalidOperationException(SR.GetString(SR.DataGridView_CellChangeCannotBeCommittedOrAborted));
2176                         }
2177                     }
2178                     else
2179                     {
2180                         if (value.DataGridView != this)
2181                         {
2182                             throw new ArgumentException(SR.GetString(SR.DataGridView_CellDoesNotBelongToDataGridView));
2183                         }
2184                         if (!this.Columns[value.ColumnIndex].Visible ||
2185                             (this.Rows.GetRowState(value.RowIndex) & DataGridViewElementStates.Visible) == 0)
2186                         {
2187                             throw new InvalidOperationException(SR.GetString(SR.DataGridView_CurrentCellCannotBeInvisible));
2188                         }
2189                         if (!ScrollIntoView(value.ColumnIndex, value.RowIndex, true))
2190                         {
2191                             throw new InvalidOperationException(SR.GetString(SR.DataGridView_CellChangeCannotBeCommittedOrAborted));
2192                         }
2193                         if (IsInnerCellOutOfBounds(value.ColumnIndex, value.RowIndex))
2194                         {
2195                             return;
2196                         }
2197                         ClearSelection(value.ColumnIndex, value.RowIndex, true /*selectExceptionElement*/);
2198                         if (!SetCurrentCellAddressCore(value.ColumnIndex, value.RowIndex, true, false, false))
2199                         {
2200                             throw new InvalidOperationException(SR.GetString(SR.DataGridView_CellChangeCannotBeCommittedOrAborted));
2201                         }
2202                     }
2203                 }
2204             }
2205         }
2206  
2207         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CurrentCellAddress"]/*‘ />
2208         [
2209             Browsable(false)
2210         ]
2211         public Point CurrentCellAddress
2212         {
2213             get
2214             {
2215                 return this.ptCurrentCell;
2216             }
2217         }
2218  
2219         private DataGridViewCell CurrentCellInternal
2220         {
2221             get
2222             {
2223                 Debug.Assert(this.ptCurrentCell.X >= 0 && this.ptCurrentCell.X < this.Columns.Count);
2224                 Debug.Assert(this.ptCurrentCell.Y >= 0 && this.ptCurrentCell.Y < this.Rows.Count);
2225                 DataGridViewRow dataGridViewRow = this.Rows.SharedRow(this.ptCurrentCell.Y);
2226                 Debug.Assert(dataGridViewRow != null);
2227                 DataGridViewCell dataGridViewCell = dataGridViewRow.Cells[this.ptCurrentCell.X];
2228                 Debug.Assert(this.IsSharedCellVisible(dataGridViewCell, this.ptCurrentCell.Y));
2229                 return dataGridViewCell;
2230             }
2231         }
2232  
2233         private bool CurrentCellIsFirstVisibleCell
2234         {
2235             get
2236             {
2237                 if (this.ptCurrentCell.X == -1)
2238                 {
2239                     return false;
2240                 }
2241                 Debug.Assert(this.ptCurrentCell.Y != -1);
2242  
2243                 bool previousVisibleColumnExists = (null != this.Columns.GetPreviousColumn(this.Columns[this.ptCurrentCell.X], DataGridViewElementStates.Visible, DataGridViewElementStates.None));
2244                 bool previousVisibleRowExists = (-1 != this.Rows.GetPreviousRow(this.ptCurrentCell.Y, DataGridViewElementStates.Visible));
2245  
2246                 return !previousVisibleColumnExists && !previousVisibleRowExists;
2247             }
2248         }
2249  
2250         private bool CurrentCellIsLastVisibleCell
2251         {
2252             get
2253             {
2254                 if (this.ptCurrentCell.X == -1)
2255                 {
2256                     return false;
2257                 }
2258  
2259                 Debug.Assert(this.ptCurrentCell.Y != -1);
2260  
2261                 bool nextVisibleColumnExists = (null != this.Columns.GetNextColumn(this.Columns[this.ptCurrentCell.X], DataGridViewElementStates.Visible, DataGridViewElementStates.None));
2262                 bool nextVisibleRowExists = (-1 != this.Rows.GetNextRow(this.ptCurrentCell.Y, DataGridViewElementStates.Visible));
2263  
2264                 return !nextVisibleColumnExists && !nextVisibleRowExists;
2265             }
2266         }
2267  
2268         private bool CurrentCellIsEditedAndOnlySelectedCell
2269         {
2270             get
2271             {
2272                 if (this.ptCurrentCell.X == -1)
2273                 {
2274                     return false;
2275                 }
2276  
2277                 Debug.Assert(this.ptCurrentCell.Y != -1);
2278  
2279                 return this.editingControl != null &&
2280                        GetCellCount(DataGridViewElementStates.Selected) == 1 &&
2281                        this.CurrentCellInternal.Selected;
2282             }
2283         }
2284  
2285         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CurrentRow"]/*‘ />
2286         [
2287             Browsable(false)
2288         ]
2289         public DataGridViewRow CurrentRow 
2290         {
2291             get
2292             {
2293                 if (this.ptCurrentCell.X == -1)
2294                 {
2295                     return null;
2296                 }
2297  
2298                 Debug.Assert(this.ptCurrentCell.Y >= 0);
2299                 Debug.Assert(this.ptCurrentCell.Y < this.Rows.Count);
2300  
2301                 return this.Rows[this.ptCurrentCell.Y];
2302             }
2303         }
2304  
2305         internal Cursor CursorInternal
2306         {
2307             set
2308             {
2309                 this.dataGridViewState2[DATAGRIDVIEWSTATE2_ignoreCursorChange] = true;
2310                 try
2311                 {
2312                     this.Cursor = value;
2313                 }
2314                 finally
2315                 {
2316                     this.dataGridViewState2[DATAGRIDVIEWSTATE2_ignoreCursorChange] = false;
2317                 }
2318             }
2319         }
2320  
2321         internal DataGridViewDataConnection DataConnection
2322         {
2323             get
2324             {
2325                 return this.dataConnection;
2326             }
2327         }
2328  
2329         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.DataMember"]/*‘ />
2330         [
2331          DefaultValue(""),
2332          SRCategory(SR.CatData),
2333          Editor("System.Windows.Forms.Design.DataMemberListEditor, " + AssemblyRef.SystemDesign, typeof(System.Drawing.Design.UITypeEditor)),
2334          SRDescription(SR.DataGridViewDataMemberDescr)
2335         ]
2336         public string DataMember
2337         {
2338             get
2339             {
2340                 if (this.dataConnection == null)
2341                 {
2342                     return String.Empty;
2343                 }
2344                 else
2345                 {
2346                     return this.dataConnection.DataMember;
2347                 }
2348             }
2349             set
2350             {
2351                 if (value != this.DataMember)
2352                 {
2353                     this.CurrentCell = null;
2354                     if (this.dataConnection == null)
2355                     {
2356                         this.dataConnection = new DataGridViewDataConnection(this);
2357                     }
2358                     this.dataConnection.SetDataConnection(this.DataSource, value);
2359                     OnDataMemberChanged(EventArgs.Empty);
2360                 }
2361             }
2362         }
2363  
2364         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.DataMemberChanged"]/*‘ />
2365         [
2366             SRCategory(SR.CatPropertyChanged), 
2367             SRDescription(SR.DataGridViewDataMemberChangedDescr)
2368         ]
2369         public event EventHandler DataMemberChanged
2370         {
2371             add
2372             {
2373                 this.Events.AddHandler(EVENT_DATAGRIDVIEWDATAMEMBERCHANGED, value);
2374             }
2375             remove
2376             {
2377                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWDATAMEMBERCHANGED, value);
2378             }
2379         }
2380  
2381         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.DataSource"]/*‘ />
2382         [
2383          DefaultValue(null),
2384          SRCategory(SR.CatData),
2385          RefreshProperties(RefreshProperties.Repaint),
2386          AttributeProvider(typeof(IListSource)),
2387          SRDescription(SR.DataGridViewDataSourceDescr)
2388         ]
2389         public object DataSource
2390         {
2391             get
2392             {
2393                 if (this.dataConnection == null)
2394                 {
2395                     return null;
2396                 }
2397                 else
2398                 {
2399                     return this.dataConnection.DataSource;
2400                 }
2401             }
2402             set
2403             {
2404                 if (value != this.DataSource)
2405                 {
2406                     this.CurrentCell = null;
2407                     if (this.dataConnection == null)
2408                     {
2409                         this.dataConnection = new DataGridViewDataConnection(this);
2410                         this.dataConnection.SetDataConnection(value, this.DataMember);
2411                     }
2412                     else
2413                     {
2414                         if (this.dataConnection.ShouldChangeDataMember(value))
2415                         {
2416                             // we fire DataMemberChanged event
2417                             this.DataMember = "";
2418                         }
2419                         this.dataConnection.SetDataConnection(value, this.DataMember);
2420                         if (value == null)
2421                         {
2422                             this.dataConnection = null;
2423                         }
2424                     }
2425                     OnDataSourceChanged(EventArgs.Empty);
2426                 }
2427             }
2428         }
2429  
2430         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.DataSourceChanged"]/*‘ />
2431         [
2432             SRCategory(SR.CatPropertyChanged), 
2433             SRDescription(SR.DataGridViewDataSourceChangedDescr)
2434         ]
2435         public event EventHandler DataSourceChanged
2436         {
2437             add
2438             {
2439                 this.Events.AddHandler(EVENT_DATAGRIDVIEWDATASOURCECHANGED, value);
2440             }
2441             remove
2442             {
2443                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWDATASOURCECHANGED, value);
2444             }
2445         }
2446  
2447         private static SolidBrush DefaultBackBrush 
2448         {
2449             get 
2450             {
2451                 return (SolidBrush) SystemBrushes.Window;
2452             }
2453         }
2454  
2455         private static SolidBrush DefaultBackgroundBrush 
2456         {
2457             get 
2458             {
2459                 return (SolidBrush) SystemBrushes.AppWorkspace;
2460             }
2461         }
2462  
2463         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.DefaultCellStyle"]/*‘ />
2464         [
2465             SRCategory(SR.CatAppearance),
2466             SRDescription(SR.DataGridView_DefaultCellStyleDescr),
2467             AmbientValue(null)
2468         ]
2469         public DataGridViewCellStyle DefaultCellStyle 
2470         {
2471             get 
2472             {
2473                 if (this.defaultCellStyle == null)
2474                 {
2475                     this.defaultCellStyle = this.DefaultDefaultCellStyle;                    
2476                     return this.defaultCellStyle;
2477                 }
2478                 else if (this.defaultCellStyle.BackColor == Color.Empty || 
2479                     this.defaultCellStyle.ForeColor == Color.Empty || 
2480                     this.defaultCellStyle.SelectionBackColor == Color.Empty || 
2481                     this.defaultCellStyle.SelectionForeColor == Color.Empty || 
2482                     this.defaultCellStyle.Font == null || 
2483                     this.defaultCellStyle.Alignment == DataGridViewContentAlignment.NotSet || 
2484                     this.defaultCellStyle.WrapMode == DataGridViewTriState.NotSet)
2485                 {
2486                     DataGridViewCellStyle defaultCellStyleTmp = new DataGridViewCellStyle(this.defaultCellStyle);
2487                     defaultCellStyleTmp.Scope = DataGridViewCellStyleScopes.None;
2488                     if (this.defaultCellStyle.BackColor == Color.Empty)
2489                     {
2490                         defaultCellStyleTmp.BackColor = DefaultBackBrush.Color;
2491                     }
2492                     if (this.defaultCellStyle.ForeColor == Color.Empty)
2493                     {
2494                         defaultCellStyleTmp.ForeColor = base.ForeColor;
2495                         this.dataGridViewState1[DATAGRIDVIEWSTATE1_ambientForeColor] = true;
2496                     }
2497                     if (this.defaultCellStyle.SelectionBackColor == Color.Empty)
2498                     {
2499                         defaultCellStyleTmp.SelectionBackColor = DefaultSelectionBackBrush.Color;
2500                     }
2501                     if (this.defaultCellStyle.SelectionForeColor == Color.Empty)
2502                     {
2503                         defaultCellStyleTmp.SelectionForeColor = DefaultSelectionForeBrush.Color;
2504                     }
2505                     if (this.defaultCellStyle.Font == null)
2506                     {
2507                         defaultCellStyleTmp.Font = base.Font;
2508                         this.dataGridViewState1[DATAGRIDVIEWSTATE1_ambientFont] = true;
2509                     }
2510                     if (this.defaultCellStyle.Alignment == DataGridViewContentAlignment.NotSet)
2511                     {
2512                         defaultCellStyleTmp.AlignmentInternal = DataGridViewContentAlignment.MiddleLeft;
2513                     }
2514                     if (this.defaultCellStyle.WrapMode == DataGridViewTriState.NotSet)
2515                     {
2516                         defaultCellStyleTmp.WrapModeInternal = DataGridViewTriState.False;
2517                     }
2518                     defaultCellStyleTmp.AddScope(this, DataGridViewCellStyleScopes.DataGridView);
2519                     return defaultCellStyleTmp;
2520                 }
2521                 else
2522                 {
2523                     return this.defaultCellStyle;
2524                 }
2525             }
2526             set 
2527             {
2528                 DataGridViewCellStyle cs = this.DefaultCellStyle;
2529                 cs.RemoveScope(DataGridViewCellStyleScopes.DataGridView);
2530                 this.defaultCellStyle = value;
2531                 if (value != null)
2532                 {
2533                     this.defaultCellStyle.AddScope(this, DataGridViewCellStyleScopes.DataGridView);
2534                 }
2535                 DataGridViewCellStyleDifferences dgvcsc = cs.GetDifferencesFrom(this.DefaultCellStyle);
2536                 if (dgvcsc != DataGridViewCellStyleDifferences.None)
2537                 {
2538                     this.CellStyleChangedEventArgs.ChangeAffectsPreferredSize = (dgvcsc == DataGridViewCellStyleDifferences.AffectPreferredSize);
2539                     OnDefaultCellStyleChanged(this.CellStyleChangedEventArgs);
2540                 }
2541             }
2542         }
2543  
2544         private DataGridViewCellStyle DefaultDefaultCellStyle 
2545         {
2546             get 
2547             {
2548                 DataGridViewCellStyle defaultCellStyle = new DataGridViewCellStyle();
2549                 defaultCellStyle.BackColor = DefaultBackBrush.Color;
2550                 defaultCellStyle.ForeColor = base.ForeColor;
2551                 defaultCellStyle.SelectionBackColor = DefaultSelectionBackBrush.Color;
2552                 defaultCellStyle.SelectionForeColor = DefaultSelectionForeBrush.Color;
2553                 defaultCellStyle.Font = base.Font;
2554                 defaultCellStyle.AlignmentInternal = DataGridViewContentAlignment.MiddleLeft;
2555                 defaultCellStyle.WrapModeInternal = DataGridViewTriState.False;
2556                 defaultCellStyle.AddScope(this, DataGridViewCellStyleScopes.DataGridView);
2557  
2558                 this.dataGridViewState1[DATAGRIDVIEWSTATE1_ambientFont] = true;
2559                 this.dataGridViewState1[DATAGRIDVIEWSTATE1_ambientForeColor] = true;
2560                 
2561                 return defaultCellStyle;
2562             }
2563         }
2564  
2565         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.DefaultCellStyleChanged"]/*‘ />
2566         [
2567             SRCategory(SR.CatPropertyChanged), 
2568             SRDescription(SR.DataGridViewDefaultCellStyleChangedDescr)
2569         ]
2570         public event EventHandler DefaultCellStyleChanged
2571         {
2572             add 
2573             {
2574                 this.Events.AddHandler(EVENT_DATAGRIDVIEWDEFAULTCELLSTYLECHANGED, value);
2575             }
2576             remove 
2577             {
2578                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWDEFAULTCELLSTYLECHANGED, value);
2579             }
2580         }
2581  
2582         private static SolidBrush DefaultForeBrush 
2583         {
2584             get 
2585             {
2586                 return (SolidBrush) SystemBrushes.WindowText;
2587             }
2588         }
2589  
2590         private static Color DefaultGridColor
2591         {
2592             get 
2593             {
2594                 return SystemColors.ControlDark;
2595             }
2596         }
2597  
2598         private static SolidBrush DefaultHeadersBackBrush
2599         {
2600             get 
2601             {
2602                 return (SolidBrush) SystemBrushes.Control;
2603             }
2604         }
2605  
2606         private DataGridViewCellStyle DefaultRowHeadersDefaultCellStyle
2607         {
2608             get 
2609             {
2610                 DataGridViewCellStyle defaultStyle = new DataGridViewCellStyle();
2611                 defaultStyle.BackColor = DefaultHeadersBackBrush.Color;
2612                 defaultStyle.ForeColor = DefaultForeBrush.Color;
2613                 defaultStyle.SelectionBackColor = DefaultSelectionBackBrush.Color;
2614                 defaultStyle.SelectionForeColor = DefaultSelectionForeBrush.Color;
2615                 defaultStyle.Font = base.Font;
2616                 defaultStyle.AlignmentInternal = DataGridViewContentAlignment.MiddleLeft;
2617                 defaultStyle.WrapModeInternal = DataGridViewTriState.True;
2618                 defaultStyle.AddScope(this, DataGridViewCellStyleScopes.RowHeaders);
2619  
2620                 this.dataGridViewState1[DATAGRIDVIEWSTATE1_ambientRowHeadersFont] = true;
2621  
2622                 return defaultStyle;
2623             }
2624         }
2625  
2626         private static SolidBrush DefaultSelectionBackBrush 
2627         {
2628             get 
2629             {
2630                 return (SolidBrush) SystemBrushes.Highlight;
2631             }
2632         }
2633         
2634         private static SolidBrush DefaultSelectionForeBrush 
2635         {
2636             get 
2637             {
2638                 return (SolidBrush) SystemBrushes.HighlightText;
2639             }
2640         }
2641  
2642         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.DefaultSize"]/*‘ />
2643         protected override Size DefaultSize
2644         {
2645             get
2646             {
2647                 return new Size(240, 150);
2648             }
2649         }
2650  
2651         internal DisplayedBandsData DisplayedBandsInfo
2652         {
2653             get
2654             {
2655                 return this.displayedBandsInfo;
2656             }
2657         }
2658  
2659         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.DisplayRectangle"]/*‘ />
2660         /// <devdoc>
2661         ///     Returns the client rect of the display area of the control.
2662         ///     The DataGridView control return its client rectangle minus the potential scrollbars.
2663         /// </devdoc>
2664         public override Rectangle DisplayRectangle {
2665             get {
2666                 Rectangle rectDisplay = this.ClientRectangle;
2667                 if (this.horizScrollBar != null && this.horizScrollBar.Visible)
2668                 {
2669                     rectDisplay.Height -= this.horizScrollBar.Height;
2670                 }
2671                 if (this.vertScrollBar != null && this.vertScrollBar.Visible)
2672                 {
2673                     rectDisplay.Width -= this.vertScrollBar.Width;
2674                     if (this.RightToLeftInternal)
2675                     {
2676                         rectDisplay.X = this.vertScrollBar.Width;
2677                     }
2678                 }
2679                 return rectDisplay;
2680             }
2681         }
2682  
2683         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.EditMode"]/*‘ />
2684         [
2685             SRCategory(SR.CatBehavior),
2686             DefaultValue(DataGridViewEditMode.EditOnKeystrokeOrF2),
2687             SRDescription(SR.DataGridView_EditModeDescr)
2688         ]
2689         public DataGridViewEditMode EditMode
2690         {
2691             get
2692             {
2693                 return this.editMode;
2694             }
2695             set
2696             {
2697                 // Sequential enum.  Valid values are 0x0 to 0x4
2698                 if (!ClientUtils.IsEnumValid(value, (int)value, (int)DataGridViewEditMode.EditOnEnter, (int)DataGridViewEditMode.EditProgrammatically))
2699                 {
2700                      throw new InvalidEnumArgumentException("value", (int)value, typeof(DataGridViewEditMode)); 
2701                 }               
2702                 if (this.editMode != value)
2703                 {
2704                     this.editMode = value;
2705                     OnEditModeChanged(EventArgs.Empty);
2706                 }
2707             }
2708         }
2709  
2710         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.EditModeChanged"]/*‘ />
2711         [
2712             SRCategory(SR.CatPropertyChanged), 
2713             SRDescription(SR.DataGridView_EditModeChangedDescr)
2714         ]
2715         public event EventHandler EditModeChanged
2716         {
2717             add
2718             {
2719                 this.Events.AddHandler(EVENT_DATAGRIDVIEWEDITMODECHANGED, value);
2720             }
2721             remove
2722             {
2723                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWEDITMODECHANGED, value);
2724             }
2725         }
2726  
2727         internal Point MouseEnteredCellAddress
2728         {
2729             get
2730             {
2731                 return this.ptMouseEnteredCell;
2732             }
2733         }
2734  
2735         private bool MouseOverEditingControl
2736         {
2737             get
2738             {
2739                 if (this.editingControl != null)
2740                 {
2741                     Point ptMouse = PointToClient(Control.MousePosition);
2742                     return this.editingControl.Bounds.Contains(ptMouse);
2743                 }
2744                 return false;
2745             }
2746         }
2747  
2748         private bool MouseOverEditingPanel
2749         {
2750             get
2751             {
2752                 if (this.editingPanel != null)
2753                 {
2754                     Point ptMouse = PointToClient(Control.MousePosition);
2755                     return this.editingPanel.Bounds.Contains(ptMouse);
2756                 }
2757                 return false;
2758             }
2759         }
2760  
2761         private bool MouseOverScrollBar
2762         {
2763             get
2764             {
2765                 Point ptMouse = PointToClient(Control.MousePosition);
2766                 if (this.vertScrollBar != null && this.vertScrollBar.Visible)
2767                 {
2768                     if (this.vertScrollBar.Bounds.Contains(ptMouse))
2769                     {
2770                         return true;
2771                     }
2772                 }
2773                 if (this.horizScrollBar != null && this.horizScrollBar.Visible)
2774                 {
2775                     return this.horizScrollBar.Bounds.Contains(ptMouse);
2776                 }
2777                 return false;
2778             }
2779         }
2780  
2781         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.EditingControl"]/*‘ />
2782         [
2783             Browsable(false),
2784             EditorBrowsable(EditorBrowsableState.Advanced)
2785         ]
2786         public Control EditingControl
2787         {
2788             get
2789             {
2790                 return this.editingControl;
2791             }
2792         }
2793  
2794         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.EditingPanel"]/*‘ />
2795         [
2796             Browsable(false),
2797             EditorBrowsable(EditorBrowsableState.Advanced)
2798         ]
2799         public Panel EditingPanel
2800         {
2801             get
2802             {
2803                 if (this.editingPanel == null)
2804                 {
2805                     this.editingPanel = new Panel();
2806                     this.editingPanel.AccessibleName = SR.GetString(SR.DataGridView_AccEditingPanelAccName);
2807                 }
2808                 return this.editingPanel;
2809             }
2810         }
2811  
2812         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.EnableHeadersVisualStyles"]/*‘ />
2813         /// <devdoc>
2814         ///    <para>
2815         ///     Determines whether the DataGridView‘s header cells render using XP theming visual styles or not
2816         ///     when visual styles are enabled in the application.
2817         ///    </para>
2818         /// </devdoc>
2819         [
2820             SRCategory(SR.CatAppearance),
2821             DefaultValue(true),
2822             SRDescription(SR.DataGridView_EnableHeadersVisualStylesDescr)
2823         ]
2824         public bool EnableHeadersVisualStyles
2825         {
2826             get
2827             {
2828                 return this.dataGridViewState2[DATAGRIDVIEWSTATE2_enableHeadersVisualStyles];
2829             }
2830             set
2831             {
2832                 if (this.dataGridViewState2[DATAGRIDVIEWSTATE2_enableHeadersVisualStyles] != value)
2833                 {
2834                     this.dataGridViewState2[DATAGRIDVIEWSTATE2_enableHeadersVisualStyles] = value;
2835                     //OnEnableHeadersVisualStylesChanged(EventArgs.Empty);
2836                     // Some autosizing may have to be applied since the margins are potentially changed.
2837                     OnGlobalAutoSize(); // Put this into OnEnableHeadersVisualStylesChanged if created.
2838                 }
2839             }
2840         }
2841  
2842         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.FirstDisplayedCell"]/*‘ />
2843         [
2844             Browsable(false),
2845             DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
2846         ]
2847         public DataGridViewCell FirstDisplayedCell
2848         {
2849             get
2850             {
2851                 Point firstDisplayedCellAddress = this.FirstDisplayedCellAddress;
2852                 if (firstDisplayedCellAddress.X >= 0)
2853                 {
2854                     return this.Rows[firstDisplayedCellAddress.Y].Cells[firstDisplayedCellAddress.X]; // unshares the row of first displayed cell
2855                 }
2856                 return null;
2857             }
2858             set
2859             {
2860                 if (value != null)
2861                 {
2862                     DataGridViewCell firstDisplayedCell = value;
2863                     if (firstDisplayedCell.DataGridView != this)
2864                     {
2865                         throw new ArgumentException(SR.GetString(SR.DataGridView_CellDoesNotBelongToDataGridView));
2866                     }
2867                     if (firstDisplayedCell.RowIndex == -1 || firstDisplayedCell.ColumnIndex == -1)
2868                     {
2869                         throw new InvalidOperationException(SR.GetString(SR.DataGridView_FirstDisplayedCellCannotBeAHeaderOrSharedCell));
2870                     }
2871  
2872                     Debug.Assert(firstDisplayedCell.RowIndex >= 0 &&
2873                         firstDisplayedCell.RowIndex < this.Rows.Count &&
2874                         firstDisplayedCell.ColumnIndex >= 0 &&
2875                         firstDisplayedCell.ColumnIndex < this.Columns.Count);
2876  
2877                     if (!firstDisplayedCell.Visible)
2878                     {
2879                         throw new InvalidOperationException(SR.GetString(SR.DataGridView_FirstDisplayedCellCannotBeInvisible));
2880                     }
2881  
2882                     if (!firstDisplayedCell.Frozen)
2883                     {
2884                         if (!this.Rows[firstDisplayedCell.RowIndex].Frozen)
2885                         {
2886                             this.FirstDisplayedScrollingRowIndex = firstDisplayedCell.RowIndex;
2887                         }
2888  
2889                         if (!this.Columns[firstDisplayedCell.ColumnIndex].Frozen)
2890                         {
2891                             this.FirstDisplayedScrollingColumnIndex = firstDisplayedCell.ColumnIndex;
2892                         }
2893                     }
2894                 }
2895             }
2896         }
2897  
2898         private Point FirstDisplayedCellAddress
2899         {
2900             get
2901             {
2902                 Point ptFirstDisplayedCellAddress = new Point(-1, -1);
2903                 ptFirstDisplayedCellAddress.Y = this.Rows.GetFirstRow(DataGridViewElementStates.Visible | DataGridViewElementStates.Frozen);
2904                 if (ptFirstDisplayedCellAddress.Y == -1)
2905                 {
2906                     Debug.Assert(this.displayedBandsInfo.NumTotallyDisplayedFrozenRows == 0);
2907                     if (this.displayedBandsInfo.FirstDisplayedScrollingRow >= 0)
2908                     {
2909                         ptFirstDisplayedCellAddress.Y = this.displayedBandsInfo.FirstDisplayedScrollingRow;
2910                     }
2911 #if DEBUG
2912                     else
2913                     {
2914                         Debug.Assert(this.displayedBandsInfo.FirstDisplayedScrollingRow == -1);
2915                         Debug.Assert(this.displayedBandsInfo.NumDisplayedScrollingRows == 0);
2916                         Debug.Assert(this.displayedBandsInfo.NumTotallyDisplayedScrollingRows == 0);
2917                     }
2918 #endif
2919                 }
2920                 if (ptFirstDisplayedCellAddress.Y >= 0)
2921                 {
2922                     ptFirstDisplayedCellAddress.X = this.FirstDisplayedColumnIndex;
2923                 }
2924                 return ptFirstDisplayedCellAddress;
2925             }
2926         }
2927  
2928         internal int FirstDisplayedColumnIndex
2929         {
2930             get
2931             {
2932                 if (!this.IsHandleCreated)
2933                 {
2934                     return -1;
2935                 }
2936                 
2937                 int firstDisplayedColumnIndex = -1;
2938                 DataGridViewColumn dataGridViewColumn = this.Columns.GetFirstColumn(DataGridViewElementStates.Visible);
2939                 if (dataGridViewColumn != null)
2940                 {
2941                     if (dataGridViewColumn.Frozen)
2942                     {
2943                         firstDisplayedColumnIndex = dataGridViewColumn.Index;
2944                     }
2945                     else if (this.displayedBandsInfo.FirstDisplayedScrollingCol >= 0)
2946                     {
2947                         firstDisplayedColumnIndex = this.displayedBandsInfo.FirstDisplayedScrollingCol;
2948                     }
2949                 }
2950 #if DEBUG
2951                 DataGridViewColumn dataGridViewColumnDbg1 = this.Columns.GetFirstColumn(DataGridViewElementStates.Displayed);
2952                 int firstDisplayedColumnIndexDbg1 = (dataGridViewColumnDbg1 == null) ? -1 : dataGridViewColumnDbg1.Index;
2953  
2954                 int firstDisplayedColumnIndexDbg2 = -1;
2955                 DataGridViewColumn dataGridViewColumnDbg = this.Columns.GetFirstColumn(DataGridViewElementStates.Visible | DataGridViewElementStates.Frozen);
2956                 if (dataGridViewColumnDbg != null)
2957                 {
2958                     firstDisplayedColumnIndexDbg2 = dataGridViewColumnDbg.Index;
2959                 }
2960                 else if (this.displayedBandsInfo.FirstDisplayedScrollingCol >= 0)
2961                 {
2962                     firstDisplayedColumnIndexDbg2 = this.displayedBandsInfo.FirstDisplayedScrollingCol;
2963                 }
2964                 else
2965                 {
2966                     Debug.Assert(this.displayedBandsInfo.LastTotallyDisplayedScrollingCol == -1);
2967                 }
2968                 Debug.Assert(firstDisplayedColumnIndex == firstDisplayedColumnIndexDbg1 || !this.Visible || this.displayedBandsInfo.Dirty);
2969                 Debug.Assert(firstDisplayedColumnIndex == firstDisplayedColumnIndexDbg2 || this.displayedBandsInfo.Dirty);
2970 #endif
2971                 return firstDisplayedColumnIndex;
2972             }
2973         }
2974  
2975         internal int FirstDisplayedRowIndex
2976         {
2977             get
2978             {
2979                 if (!this.IsHandleCreated)
2980                 {
2981                     return -1;
2982                 }
2983  
2984                 int firstDisplayedRowIndex = this.Rows.GetFirstRow(DataGridViewElementStates.Visible);
2985                 if (firstDisplayedRowIndex != -1)
2986                 {
2987                     if ((this.Rows.GetRowState(firstDisplayedRowIndex) & DataGridViewElementStates.Frozen) == 0 &&
2988                         this.displayedBandsInfo.FirstDisplayedScrollingRow >= 0)
2989                     {
2990                         firstDisplayedRowIndex = this.displayedBandsInfo.FirstDisplayedScrollingRow;
2991                     }
2992                 }
2993 #if FALSE //DEBUG
2994                 int firstDisplayedRowIndexDbg1 = this.Rows.GetFirstRow(DataGridViewElementStates.Displayed);
2995  
2996                 int firstDisplayedRowIndexDbg2 = this.Rows.GetFirstRow(DataGridViewElementStates.Visible | DataGridViewElementStates.Frozen);
2997                 if (firstDisplayedRowIndexDbg2 == -1)
2998                 {
2999                     if (this.displayedBandsInfo.FirstDisplayedScrollingRow >= 0)
3000                     {
3001                         firstDisplayedRowIndexDbg2 = this.displayedBandsInfo.FirstDisplayedScrollingRow;
3002                     }
3003                 }
3004  
3005                 Debug.Assert(firstDisplayedRowIndex == firstDisplayedRowIndexDbg1 || !this.Visible || this.displayedBandsInfo.Dirty, "firstDisplayedRowIndex =" + firstDisplayedRowIndex.ToString() + ", firstDisplayedRowIndexDbg1=" + firstDisplayedRowIndexDbg1.ToString());
3006                 Debug.Assert(firstDisplayedRowIndex == firstDisplayedRowIndexDbg2 || this.displayedBandsInfo.Dirty, "firstDisplayedRowIndex =" + firstDisplayedRowIndex.ToString() + ", firstDisplayedRowIndexDbg2=" + firstDisplayedRowIndexDbg2.ToString());
3007 #endif
3008                 return firstDisplayedRowIndex;
3009             }
3010         }
3011  
3012         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.FirstDisplayedScrollingColumnHiddenWidth"]/*‘ />
3013         [
3014             Browsable(false),
3015             EditorBrowsable(EditorBrowsableState.Advanced),
3016             DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
3017         ]
3018         public int FirstDisplayedScrollingColumnHiddenWidth
3019         {
3020             get
3021             {
3022                 return this.negOffset;
3023             }
3024         }
3025  
3026         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.FirstDisplayedScrollingColumnIndex"]/*‘ />
3027         [
3028             Browsable(false),
3029             DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
3030         ]
3031         public int FirstDisplayedScrollingColumnIndex
3032         {
3033             get
3034             {
3035                 return this.displayedBandsInfo.FirstDisplayedScrollingCol;
3036             }
3037             set
3038             {
3039                 if (value < 0 || value >= this.Columns.Count)
3040                 {
3041                     throw new ArgumentOutOfRangeException("value");
3042                 }
3043                 if (!this.Columns[value].Visible)
3044                 {
3045                     throw new InvalidOperationException(SR.GetString(SR.DataGridView_FirstDisplayedScrollingColumnCannotBeInvisible));
3046                 }
3047                 if (this.Columns[value].Frozen)
3048                 {
3049                     throw new InvalidOperationException(SR.GetString(SR.DataGridView_FirstDisplayedScrollingColumnCannotBeFrozen));
3050                 }
3051  
3052                 if (!this.IsHandleCreated)
3053                 {
3054                     CreateHandle();
3055                 }
3056  
3057                 int displayWidth = this.layout.Data.Width;
3058                 if (displayWidth <= 0)
3059                 {
3060                     throw new InvalidOperationException(SR.GetString(SR.DataGridView_NoRoomForDisplayedColumns));
3061                 }
3062  
3063                 int totalVisibleFrozenWidth = this.Columns.GetColumnsWidth(DataGridViewElementStates.Visible | DataGridViewElementStates.Frozen);
3064                 if (totalVisibleFrozenWidth >= displayWidth)
3065                 {
3066                     Debug.Assert(totalVisibleFrozenWidth > 0);
3067                     throw new InvalidOperationException(SR.GetString(SR.DataGridView_FrozenColumnsPreventFirstDisplayedScrollingColumn));
3068                 }
3069  
3070                 if (value == this.displayedBandsInfo.FirstDisplayedScrollingCol)
3071                 {
3072                     return;
3073                 }
3074  
3075                 if (this.ptCurrentCell.X >= 0 && 
3076                     !CommitEdit(DataGridViewDataErrorContexts.Parsing | DataGridViewDataErrorContexts.Commit | DataGridViewDataErrorContexts.Scroll, 
3077                                 false /*forCurrentCellChange*/, false /*forCurrentRowChange*/))
3078                 {
3079                     // Could not commit edited cell value - return silently
3080                     // [....]: should we throw an error here?
3081                     return;
3082                 }
3083                 if (IsColumnOutOfBounds(value))
3084                 {
3085                     return;
3086                 }
3087                 bool success = ScrollColumnIntoView(value, -1, /*committed*/ true, false /*forCurrentCellChange*/);
3088                 Debug.Assert(success);
3089  
3090                 Debug.Assert(this.displayedBandsInfo.FirstDisplayedScrollingCol >= 0);
3091                 Debug.Assert(this.displayedBandsInfo.FirstDisplayedScrollingCol == value ||
3092                              this.Columns.DisplayInOrder(this.displayedBandsInfo.FirstDisplayedScrollingCol, value));
3093                 int maxHorizontalOffset = this.Columns.GetColumnsWidth(DataGridViewElementStates.Visible) - displayWidth;
3094                 while (this.displayedBandsInfo.FirstDisplayedScrollingCol != value &&
3095                         this.HorizontalOffset < maxHorizontalOffset)
3096                 {
3097                     ScrollColumns(1);
3098                 }
3099             }
3100         }
3101  
3102         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.FirstDisplayedScrollingRowIndex"]/*‘ />
3103         [
3104             Browsable(false),
3105             DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
3106         ]
3107         public int FirstDisplayedScrollingRowIndex
3108         {
3109             get
3110             {
3111                 return this.displayedBandsInfo.FirstDisplayedScrollingRow;
3112             }
3113             set
3114             {
3115                 if (value < 0 || value >= this.Rows.Count)
3116                 {
3117                     throw new ArgumentOutOfRangeException("value");
3118                 }
3119                 if ((this.Rows.GetRowState(value) & DataGridViewElementStates.Visible) == 0)
3120                 {
3121                     throw new InvalidOperationException(SR.GetString(SR.DataGridView_FirstDisplayedScrollingRowCannotBeInvisible));
3122                 }
3123                 if ((this.Rows.GetRowState(value) & DataGridViewElementStates.Frozen) != 0)
3124                 {
3125                     throw new InvalidOperationException(SR.GetString(SR.DataGridView_FirstDisplayedScrollingRowCannotBeFrozen));
3126                 }
3127  
3128                 if (!this.IsHandleCreated)
3129                 {
3130                     CreateHandle();
3131                 }
3132  
3133                 int displayHeight = this.layout.Data.Height;
3134                 if (displayHeight <= 0)
3135                 {
3136                     throw new InvalidOperationException(SR.GetString(SR.DataGridView_NoRoomForDisplayedRows));
3137                 }
3138  
3139                 int totalVisibleFrozenHeight = this.Rows.GetRowsHeight(DataGridViewElementStates.Visible | DataGridViewElementStates.Frozen);
3140                 if (totalVisibleFrozenHeight >= displayHeight)
3141                 {
3142                     Debug.Assert(totalVisibleFrozenHeight > 0);
3143                     throw new InvalidOperationException(SR.GetString(SR.DataGridView_FrozenRowsPreventFirstDisplayedScrollingRow));
3144                 }
3145  
3146                 if (value == this.displayedBandsInfo.FirstDisplayedScrollingRow)
3147                 {
3148                     return;
3149                 }
3150  
3151                 if (this.ptCurrentCell.X >= 0 &&
3152                     !CommitEdit(DataGridViewDataErrorContexts.Parsing | DataGridViewDataErrorContexts.Commit | DataGridViewDataErrorContexts.Scroll, 
3153                                 false /*forCurrentCellChange*/, false /*forCurrentRowChange*/))
3154                 {
3155                     // Could not commit edited cell value - return silently
3156                     // [....]: should we throw an error here?
3157                     return;
3158                 }
3159                 if (IsRowOutOfBounds(value))
3160                 {
3161                     return;
3162                 }
3163  
3164                 Debug.Assert(this.displayedBandsInfo.FirstDisplayedScrollingRow >= 0);
3165  
3166                 if (value > this.displayedBandsInfo.FirstDisplayedScrollingRow)
3167                 {
3168                     int rowsToScroll = this.Rows.GetRowCount(DataGridViewElementStates.Visible, this.displayedBandsInfo.FirstDisplayedScrollingRow, value);
3169                     Debug.Assert(rowsToScroll != 0);
3170                     ScrollRowsByCount(rowsToScroll, rowsToScroll > 1 ? ScrollEventType.LargeIncrement : ScrollEventType.SmallIncrement);
3171                 }
3172                 else
3173                 {
3174                     bool success = ScrollRowIntoView(-1, value, /*committed*/ true, false /*forCurrentCellChange*/);
3175                     Debug.Assert(success);
3176                 }
3177             }
3178         }
3179  
3180         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ForeColor"]/*‘ />
3181         /// <internalonly/>
3182         [
3183             Browsable(false),
3184             EditorBrowsable(EditorBrowsableState.Advanced),
3185             DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
3186         ]
3187         public override Color ForeColor
3188         {
3189             get 
3190             {
3191                 return base.ForeColor;
3192             }
3193             set 
3194             {
3195                 base.ForeColor = value;
3196             }
3197         }
3198  
3199         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ForeColorChanged"]/*‘ />
3200         /// <internalonly/>
3201         [
3202             Browsable(false),
3203             EditorBrowsable(EditorBrowsableState.Advanced)
3204         ]
3205         new public event EventHandler ForeColorChanged
3206         {
3207             add
3208             {
3209                 base.ForeColorChanged += value;
3210             }
3211             remove
3212             {
3213                 base.ForeColorChanged -= value;
3214             }
3215         }
3216  
3217         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.Font"]/*‘ />
3218         /// <internalonly/>
3219         [
3220             Browsable(false), 
3221             EditorBrowsable(EditorBrowsableState.Advanced)
3222         ]
3223         public override Font Font
3224         {
3225             get 
3226             {
3227                 return base.Font;
3228             }
3229             set 
3230             {
3231                 base.Font = value;
3232             }
3233         }
3234  
3235         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.FontChanged"]/*‘ />
3236         /// <internalonly/>
3237         [
3238             Browsable(false),
3239             EditorBrowsable(EditorBrowsableState.Advanced)
3240         ]
3241         new public event EventHandler FontChanged
3242         {
3243             add
3244             {
3245                 base.FontChanged += value;
3246             }
3247             remove
3248             {
3249                 base.FontChanged -= value;
3250             }
3251         }
3252  
3253         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.GridColor"]/*‘ />
3254         /// <devdoc>
3255         ///    <para>Gets or sets the grid color of the dataGridView (when Single mode is used).</para>
3256         /// </devdoc>
3257         [
3258             SRCategory(SR.CatAppearance),
3259             SRDescription(SR.DataGridViewGridColorDescr)
3260         ]
3261         public Color GridColor
3262         {
3263             get
3264             {
3265                 return this.gridPen.Color;
3266             }
3267             set
3268             {
3269                 if (value.IsEmpty)
3270                 {
3271                     throw new ArgumentException(SR.GetString(SR.DataGridView_EmptyColor, "GridColor"));
3272                 }
3273                 if (value.A < 255)
3274                 {
3275                     throw new ArgumentException(SR.GetString(SR.DataGridView_TransparentColor, "GridColor"));
3276                 }
3277                 if (!value.Equals(this.gridPen.Color)) 
3278                 {
3279                     if (this.gridPen != null)
3280                     {
3281                         this.gridPen.Dispose();
3282                     }
3283  
3284                     this.gridPen = new Pen(value);
3285                     OnGridColorChanged(EventArgs.Empty);
3286                 }
3287             }
3288         }
3289  
3290         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.GridColorChanged"]/*‘ />
3291         [
3292             SRCategory(SR.CatPropertyChanged), 
3293             SRDescription(SR.DataGridViewOnGridColorChangedDescr)
3294         ]
3295         public event EventHandler GridColorChanged 
3296         {
3297             add 
3298             {
3299                 this.Events.AddHandler(EVENT_DATAGRIDVIEWGRIDCOLORCHANGED, value);
3300             }
3301             remove 
3302             {
3303                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWGRIDCOLORCHANGED, value);
3304             }
3305         }
3306  
3307         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ShouldSerializeGridColor"]/*‘ />
3308         private bool ShouldSerializeGridColor()
3309         {
3310             return !this.GridPen.Color.Equals(DefaultGridColor);
3311         }
3312  
3313         internal Pen GridPen
3314         {
3315             get
3316             {
3317                 return this.gridPen;
3318             }
3319         }
3320  
3321         internal int HorizontalOffset 
3322         {
3323             get 
3324             {
3325                 return this.horizontalOffset;
3326             }
3327             set 
3328             {
3329                 if (value < 0)
3330                 {
3331                     value = 0;
3332                 }
3333                 int widthNotVisible = this.Columns.GetColumnsWidth(DataGridViewElementStates.Visible) - this.layout.Data.Width;
3334                 if (value > widthNotVisible && widthNotVisible > 0)
3335                 {
3336                     value = widthNotVisible;
3337                 }
3338                 if (value == this.horizontalOffset)
3339                 {
3340                     return;
3341                 }
3342  
3343                 ScrollEventType scrollEventType;
3344                 int oldFirstVisibleScrollingCol = this.displayedBandsInfo.FirstDisplayedScrollingCol;
3345                 int change = this.horizontalOffset - value;
3346                 if (this.horizScrollBar.Enabled)
3347                 {
3348                     this.horizScrollBar.Value = value;
3349                 }
3350                 this.horizontalOffset = value;
3351  
3352                 int totalVisibleFrozenWidth = this.Columns.GetColumnsWidth(DataGridViewElementStates.Visible | DataGridViewElementStates.Frozen);
3353  
3354                 Rectangle rectTmp = this.layout.Data;
3355                 if (this.layout.ColumnHeadersVisible)
3356                 {
3357                     // column headers must scroll as well
3358                     rectTmp = Rectangle.Union(rectTmp, this.layout.ColumnHeaders);
3359                 }
3360                 else if (this.SingleVerticalBorderAdded)
3361                 {
3362                     if (!this.RightToLeftInternal)
3363                     {
3364                         rectTmp.X--;
3365                     }
3366                     rectTmp.Width++;
3367                 }
3368  
3369                 if (this.SingleVerticalBorderAdded &&
3370                     totalVisibleFrozenWidth > 0)
3371                 {
3372                     if (!this.RightToLeftInternal)
3373                     {
3374                         rectTmp.X++;
3375                     }
3376                     rectTmp.Width--;
3377                 }
3378  
3379                 if (!this.RightToLeftInternal)
3380                 {
3381                     rectTmp.X += totalVisibleFrozenWidth;
3382                 }
3383                 rectTmp.Width -= totalVisibleFrozenWidth;
3384  
3385                 this.displayedBandsInfo.FirstDisplayedScrollingCol = ComputeFirstVisibleScrollingColumn();
3386                 // update the lastTotallyDisplayedScrollingCol
3387                 ComputeVisibleColumns();
3388  
3389                 if (this.editingControl != null && 
3390                     !this.Columns[this.ptCurrentCell.X].Frozen &&
3391                     this.displayedBandsInfo.FirstDisplayedScrollingCol > -1)
3392                 {
3393                     PositionEditingControl(true /*setLocation*/, false /*setSize*/, false /*setFocus*/);
3394                 }
3395  
3396                 // The mouse probably is not over the same cell after the scroll.
3397                 UpdateMouseEnteredCell(null /*HitTestInfo*/, null /*MouseEventArgs*/);
3398  
3399                 if (oldFirstVisibleScrollingCol == this.displayedBandsInfo.FirstDisplayedScrollingCol)
3400                 {
3401                     scrollEventType = change > 0 ? ScrollEventType.SmallIncrement : ScrollEventType.SmallDecrement;
3402                 }
3403                 else if (this.Columns.DisplayInOrder(oldFirstVisibleScrollingCol, this.displayedBandsInfo.FirstDisplayedScrollingCol))
3404                 {
3405                     scrollEventType = this.Columns.GetColumnCount(DataGridViewElementStates.Visible, oldFirstVisibleScrollingCol, this.displayedBandsInfo.FirstDisplayedScrollingCol) > 1 ? ScrollEventType.LargeIncrement : ScrollEventType.SmallIncrement;
3406                 }
3407                 else
3408                 {
3409                     Debug.Assert(this.Columns.DisplayInOrder(this.displayedBandsInfo.FirstDisplayedScrollingCol, oldFirstVisibleScrollingCol));
3410                     scrollEventType = this.Columns.GetColumnCount(DataGridViewElementStates.Visible, this.displayedBandsInfo.FirstDisplayedScrollingCol, oldFirstVisibleScrollingCol) > 1 ? ScrollEventType.LargeDecrement : ScrollEventType.SmallDecrement;
3411                 }
3412  
3413                 NativeMethods.RECT[] rects = CreateScrollableRegion(rectTmp);
3414                 if (this.RightToLeftInternal)
3415                 {
3416                     change = -change;
3417                 }
3418                 ScrollRectangles(rects, change);
3419                 if (!this.dataGridViewState2[DATAGRIDVIEWSTATE2_stopRaisingHorizontalScroll])
3420                 {
3421                     OnScroll(scrollEventType, this.horizontalOffset + change, this.horizontalOffset, ScrollOrientation.HorizontalScroll);
3422                 }
3423                 FlushDisplayedChanged();
3424             }
3425         }
3426  
3427         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.HorizontalScrollBar"]/*‘ />
3428         protected ScrollBar HorizontalScrollBar
3429         {
3430             get
3431             {
3432                 return this.horizScrollBar;
3433             }
3434         }
3435  
3436         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.HorizontalScrollingOffset"]/*‘ />
3437         [
3438             Browsable(false),
3439             DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
3440         ]
3441         public int HorizontalScrollingOffset
3442         {
3443             get
3444             {
3445                 return this.horizontalOffset;
3446             }
3447             set
3448             {
3449                 // int widthNotVisible = this.Columns.GetColumnsWidth(DataGridViewElementStates.Visible) - this.layout.Data.Width;
3450                 if (value < 0)
3451                 {
3452                     throw new ArgumentOutOfRangeException("HorizontalScrollingOffset", SR.GetString(SR.InvalidLowBoundArgumentEx, "HorizontalScrollingOffset", (value).ToString(CultureInfo.CurrentCulture), (0).ToString(CultureInfo.CurrentCulture)));
3453                 }
3454                 // Intentionally ignoring the out of range situation. 
3455                 // else if (value > widthNotVisible && widthNotVisible > 0)
3456                 //{
3457                 //    throw new ArgumentOutOfRangeException(SR.GetString(SR.DataGridView_PropertyTooLarge, "HorizontalScrollingOffset", (widthNotVisible).ToString()));
3458                 //}
3459                 else if (value > 0 && (this.Columns.GetColumnsWidth(DataGridViewElementStates.Visible) - this.layout.Data.Width) <= 0)
3460                 {
3461                     // Intentionally ignoring the case where dev tries to set value while there is no horizontal scrolling possible.
3462                     // throw new ArgumentOutOfRangeException("HorizontalScrollingOffset", SR.GetString(SR.DataGridView_PropertyMustBeZero));
3463                     Debug.Assert(this.horizontalOffset == 0);
3464                     return;
3465                 }
3466                 if (value == this.horizontalOffset)
3467                 {
3468                     return;
3469                 }
3470                 this.HorizontalOffset = value;
3471             }
3472         }
3473  
3474         private System.Windows.Forms.Timer HorizScrollTimer
3475         {
3476             get
3477             {
3478                 if (this.horizScrollTimer == null)
3479                 {
3480                     this.horizScrollTimer = new System.Windows.Forms.Timer();
3481                     this.horizScrollTimer.Tick += new System.EventHandler(HorizScrollTimer_Tick);
3482                 }
3483                 return this.horizScrollTimer;
3484             }
3485         }
3486  
3487         private bool InAdjustFillingColumns
3488         {
3489             get
3490             {
3491                 return this.dataGridViewOper[DATAGRIDVIEWOPER_inAdjustFillingColumn] || this.dataGridViewOper[DATAGRIDVIEWOPER_inAdjustFillingColumns];
3492             }
3493         }
3494  
3495         internal bool InBeginEdit
3496         {
3497             get
3498             {
3499                 return this.dataGridViewOper[DATAGRIDVIEWOPER_inBeginEdit];
3500             }
3501         }
3502  
3503         internal bool InDisplayIndexAdjustments
3504         {
3505             get
3506             {
3507                 return this.dataGridViewOper[DATAGRIDVIEWOPER_inDisplayIndexAdjustments];
3508             }
3509             set
3510             {
3511                 this.dataGridViewOper[DATAGRIDVIEWOPER_inDisplayIndexAdjustments] = value;
3512             }
3513         }
3514  
3515         internal bool InEndEdit
3516         {
3517             get
3518             {
3519                 return this.dataGridViewOper[DATAGRIDVIEWOPER_inEndEdit];
3520             }
3521         }
3522  
3523         private DataGridViewCellStyle InheritedEditingCellStyle
3524         {
3525             get
3526             {
3527                 if (this.ptCurrentCell.X == -1)
3528                 {
3529                     return null;
3530                 }
3531  
3532                 return this.CurrentCellInternal.GetInheritedStyleInternal(this.ptCurrentCell.Y);
3533             }
3534         }
3535  
3536         internal bool InInitialization
3537         {
3538             get
3539             {
3540                 return this.dataGridViewState2[DATAGRIDVIEWSTATE2_initializing];
3541             }
3542         }
3543  
3544         internal bool InSortOperation
3545         {
3546             get
3547             {
3548                 return this.dataGridViewOper[DATAGRIDVIEWOPER_inSort];
3549             }
3550         }
3551  
3552         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.IsCurrentCellDirty"]/*‘ />
3553         [Browsable(false)]
3554         public bool IsCurrentCellDirty
3555         {
3556             get
3557             {
3558                 return this.dataGridViewState1[DATAGRIDVIEWSTATE1_editedCellChanged];
3559             }
3560         }
3561  
3562         private bool IsCurrentCellDirtyInternal
3563         {
3564             set
3565             {
3566                 if (value != this.dataGridViewState1[DATAGRIDVIEWSTATE1_editedCellChanged])
3567                 {
3568                     this.dataGridViewState1[DATAGRIDVIEWSTATE1_editedCellChanged] = value;
3569                     OnCurrentCellDirtyStateChanged(EventArgs.Empty);
3570                 }
3571             }
3572         }
3573  
3574         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.IsCurrentCellInEditMode"]/*‘ />
3575         [Browsable(false)]
3576         public bool IsCurrentCellInEditMode
3577         {
3578             get
3579             {
3580                 return this.editingControl != null || this.dataGridViewState1[DATAGRIDVIEWSTATE1_currentCellInEditMode];
3581             }
3582         }
3583  
3584         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.IsCurrentRowDirty"]/*‘ />
3585         // Only used in bound scenarios, when binding to a IEditableObject
3586         [Browsable(false)]
3587         public bool IsCurrentRowDirty
3588         {
3589             get
3590             {
3591                 if (!this.VirtualMode)
3592                 {
3593                     return this.dataGridViewState1[DATAGRIDVIEWSTATE1_editedRowChanged] || this.IsCurrentCellDirty;
3594                 }
3595                 else
3596                 {
3597                     QuestionEventArgs qe = new QuestionEventArgs(this.dataGridViewState1[DATAGRIDVIEWSTATE1_editedRowChanged] || this.IsCurrentCellDirty);
3598                     OnRowDirtyStateNeeded(qe);
3599                     return qe.Response;
3600                 }
3601             }
3602         }
3603  
3604         internal bool IsCurrentRowDirtyInternal
3605         {
3606             set
3607             {
3608                 if (value != this.dataGridViewState1[DATAGRIDVIEWSTATE1_editedRowChanged])
3609                 {
3610                     this.dataGridViewState1[DATAGRIDVIEWSTATE1_editedRowChanged] = value;
3611                     if (this.RowHeadersVisible && this.ShowEditingIcon && this.ptCurrentCell.Y >= 0)
3612                     {
3613                         // Force the pencil to appear in the row header
3614                         InvalidateCellPrivate(-1, this.ptCurrentCell.Y);
3615                     }
3616                 }
3617             }
3618         }
3619  
3620         private bool IsEscapeKeyEffective
3621         {
3622             get
3623             {
3624                 return this.dataGridViewOper[DATAGRIDVIEWOPER_trackColResize] ||
3625                        this.dataGridViewOper[DATAGRIDVIEWOPER_trackRowResize] ||
3626                        this.dataGridViewOper[DATAGRIDVIEWOPER_trackColHeadersResize] ||
3627                        this.dataGridViewOper[DATAGRIDVIEWOPER_trackRowHeadersResize] ||
3628                        this.dataGridViewOper[DATAGRIDVIEWOPER_trackColRelocation] ||
3629                        this.IsCurrentCellDirty ||
3630                        ((this.VirtualMode || this.DataSource != null) && this.IsCurrentRowDirty) ||
3631                        (this.EditMode != DataGridViewEditMode.EditOnEnter && this.editingControl != null ||
3632                        this.dataGridViewState1[DATAGRIDVIEWSTATE1_newRowEdited]);
3633             }
3634         }
3635  
3636         private bool IsMinimized
3637         {
3638             get
3639             {
3640                 Form parentForm = this.TopLevelControlInternal as Form;
3641                 return parentForm != null && parentForm.WindowState == FormWindowState.Minimized;
3642             }
3643         }
3644  
3645         internal bool IsRestricted
3646         {
3647             get
3648             {
3649                 if (!this.dataGridViewState1[DATAGRIDVIEWSTATE1_isRestrictedChecked])
3650                 {
3651                     this.dataGridViewState1[DATAGRIDVIEWSTATE1_isRestricted] = false;
3652                     try
3653                     {
3654                         IntSecurity.AllWindows.Demand();
3655                     }
3656                     catch (SecurityException)
3657                     {
3658                         this.dataGridViewState1[DATAGRIDVIEWSTATE1_isRestricted] = true;
3659                     }
3660                     catch
3661                     {
3662                         this.dataGridViewState1[DATAGRIDVIEWSTATE1_isRestricted] = true; // To be on the safe side
3663                         this.dataGridViewState1[DATAGRIDVIEWSTATE1_isRestrictedChecked] = true;
3664                         throw;
3665                     }
3666                     this.dataGridViewState1[DATAGRIDVIEWSTATE1_isRestrictedChecked] = true;
3667                 }
3668                 return this.dataGridViewState1[DATAGRIDVIEWSTATE1_isRestricted];
3669             }
3670         }
3671  
3672         private bool IsSharedCellReadOnly(DataGridViewCell dataGridViewCell, int rowIndex)
3673         {
3674             Debug.Assert(dataGridViewCell != null);
3675             Debug.Assert(rowIndex >= 0);
3676             DataGridViewElementStates rowState = this.Rows.GetRowState(rowIndex); 
3677             return this.ReadOnly ||
3678                    (rowState & DataGridViewElementStates.ReadOnly) != 0 ||
3679                    (dataGridViewCell.OwningColumn != null && dataGridViewCell.OwningColumn.ReadOnly) ||
3680                    dataGridViewCell.StateIncludes(DataGridViewElementStates.ReadOnly);
3681         }
3682  
3683         internal bool IsSharedCellSelected(DataGridViewCell dataGridViewCell, int rowIndex)
3684         {
3685             Debug.Assert(dataGridViewCell != null);
3686             Debug.Assert(rowIndex >= 0);
3687             DataGridViewElementStates rowState = this.Rows.GetRowState(rowIndex);
3688             return (rowState & DataGridViewElementStates.Selected) != 0 ||
3689                    (dataGridViewCell.OwningColumn != null && dataGridViewCell.OwningColumn.Selected) ||
3690                    dataGridViewCell.StateIncludes(DataGridViewElementStates.Selected);
3691         }
3692  
3693         internal bool IsSharedCellVisible(DataGridViewCell dataGridViewCell, int rowIndex)
3694         {
3695             Debug.Assert(dataGridViewCell != null);
3696             Debug.Assert(rowIndex >= 0);
3697             DataGridViewElementStates rowState = this.Rows.GetRowState(rowIndex);
3698             return (rowState & DataGridViewElementStates.Visible) != 0 &&
3699                    (dataGridViewCell.OwningColumn != null && dataGridViewCell.OwningColumn.Visible);
3700         }
3701  
3702         internal LayoutData LayoutInfo
3703         {
3704             get
3705             {
3706                 if (this.layout.dirty && this.IsHandleCreated)
3707                 {
3708                     PerformLayoutPrivate(false /*useRowShortcut*/, true /*computeVisibleRows*/, false /*invalidInAdjustFillingColumns*/, false /*repositionEditingControl*/);
3709                 }
3710                 return this.layout;
3711             }
3712         }
3713  
3714         internal Point MouseDownCellAddress
3715         {
3716             get
3717             {
3718                 return this.ptMouseDownCell;
3719             }
3720         }
3721  
3722         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.MultiSelect"]/*‘ />
3723         [
3724             SRCategory(SR.CatBehavior),
3725             DefaultValue(true),
3726             SRDescription(SR.DataGridView_MultiSelectDescr)
3727         ]
3728         public bool MultiSelect
3729         {
3730             get
3731             {
3732                 return this.dataGridViewState1[DATAGRIDVIEWSTATE1_multiSelect];
3733             }
3734             set
3735             {
3736                 if (this.MultiSelect != value)
3737                 {
3738                     ClearSelection();
3739                     this.dataGridViewState1[DATAGRIDVIEWSTATE1_multiSelect] = value;
3740                     OnMultiSelectChanged(EventArgs.Empty);
3741                 }
3742             }
3743         }
3744  
3745         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.MultiSelectChanged"]/*‘ />
3746         [
3747             SRCategory(SR.CatPropertyChanged), 
3748             SRDescription(SR.DataGridViewOnMultiSelectChangedDescr)
3749         ]
3750         public event EventHandler MultiSelectChanged
3751         {
3752             add
3753             {
3754                 this.Events.AddHandler(EVENT_DATAGRIDVIEWMULTISELECTCHANGED, value);
3755             }
3756             remove
3757             {
3758                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWMULTISELECTCHANGED, value);
3759             }
3760         }
3761  
3762         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.NewRowIndex"]/*‘ />
3763         [
3764             Browsable(false),
3765             DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
3766         ]
3767         public int NewRowIndex
3768         {
3769             get
3770             {
3771                 return this.newRowIndex;
3772             }
3773         }
3774  
3775         internal bool NoDimensionChangeAllowed
3776         {
3777             get
3778             {
3779                 return this.noDimensionChangeCount > 0;
3780             }
3781         }
3782  
3783         private int NoSelectionChangeCount
3784         {
3785             get
3786             {
3787                 return this.noSelectionChangeCount;
3788             }
3789             set
3790             {
3791                 Debug.Assert(value >= 0);
3792                 this.noSelectionChangeCount = value;
3793                 if (value == 0)
3794                 {
3795                     FlushSelectionChanged();
3796                 }
3797             }
3798         }
3799  
3800         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.Padding"]/*‘ />
3801         [
3802             Browsable(false),
3803             EditorBrowsable(EditorBrowsableState.Never),
3804             DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
3805         ]
3806         public new Padding Padding 
3807         {
3808             get 
3809             { 
3810                 return base.Padding; 
3811             }
3812             set 
3813             { 
3814                 base.Padding = value;
3815             }        
3816         }
3817  
3818         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.PaddingChanged"]/*‘ />
3819         [
3820             Browsable(false),
3821             EditorBrowsable(EditorBrowsableState.Never),
3822             DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
3823         ]
3824         public new event EventHandler PaddingChanged
3825         {
3826             add
3827             {
3828                 base.PaddingChanged += value;
3829             }
3830             remove
3831             {
3832                 base.PaddingChanged -= value;
3833             }
3834         }
3835  
3836         internal DataGridViewCellStyle PlaceholderCellStyle
3837         {
3838             get
3839             {
3840                 if (this.placeholderCellStyle == null)
3841                 {
3842                     this.placeholderCellStyle = new DataGridViewCellStyle();
3843                 }
3844                 return this.placeholderCellStyle;
3845             }
3846         }
3847  
3848         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ReadOnly"]/*‘ />
3849         [
3850             Browsable(true),
3851             DefaultValue(false),
3852             SRCategory(SR.CatBehavior),
3853             SRDescription(SR.DataGridView_ReadOnlyDescr)
3854         ]
3855         public bool ReadOnly
3856         {
3857             get
3858             {
3859                 return this.dataGridViewState1[DATAGRIDVIEWSTATE1_readOnly];
3860             }
3861             set
3862             {
3863                 if (value != this.dataGridViewState1[DATAGRIDVIEWSTATE1_readOnly])
3864                 {
3865                     if (value &&
3866                         this.ptCurrentCell.X != -1 &&
3867                         this.IsCurrentCellInEditMode)
3868                     {
3869                         // Current cell becomes read-only. Exit editing mode.
3870                         if (!EndEdit(DataGridViewDataErrorContexts.Parsing | DataGridViewDataErrorContexts.Commit,
3871                                      DataGridViewValidateCellInternal.Always /*validateCell*/, 
3872                                      false /*fireCellLeave*/,
3873                                      false /*fireCellEnter*/,
3874                                      false /*fireRowLeave*/,
3875                                      false /*fireRowEnter*/,
3876                                      false /*fireLeave*/, 
3877                                      true /*keepFocus*/,
3878                                      false /*resetCurrentCell*/,
3879                                      false /*resetAnchorCell*/))
3880                         {
3881                             throw new InvalidOperationException(SR.GetString(SR.DataGridView_CommitFailedCannotCompleteOperation));
3882                         }
3883                     }
3884  
3885                     this.dataGridViewState1[DATAGRIDVIEWSTATE1_readOnly] = value;
3886  
3887                     if (value)
3888                     {
3889                         try
3890                         {
3891                             this.dataGridViewOper[DATAGRIDVIEWOPER_inReadOnlyChange] = true;
3892                             for (int columnIndex = 0; columnIndex < this.Columns.Count; columnIndex++)
3893                             {
3894                                 SetReadOnlyColumnCore(columnIndex, false);
3895                             }
3896                             int rowCount = this.Rows.Count;
3897                             for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)
3898                             {
3899                                 SetReadOnlyRowCore(rowIndex, false);
3900                             }
3901                         }
3902                         finally
3903                         {
3904                             this.dataGridViewOper[DATAGRIDVIEWOPER_inReadOnlyChange] = false;
3905                         }
3906                     }
3907 #if DEBUG
3908                     else
3909                     {
3910                         Debug.Assert(this.individualReadOnlyCells.Count == 0);
3911                         for (int columnIndex = 0; columnIndex < this.Columns.Count; columnIndex++)
3912                         {
3913                             Debug.Assert(this.Columns[columnIndex].ReadOnly == false);
3914                         }
3915                         int rowCount = this.Rows.Count;
3916                         for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)
3917                         {
3918                             Debug.Assert((this.Rows.GetRowState(rowIndex) & DataGridViewElementStates.ReadOnly) == 0);
3919                         }
3920                     }
3921 #endif
3922                     OnReadOnlyChanged(EventArgs.Empty);
3923                 }
3924             }
3925         }
3926  
3927         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ReadOnlyChanged"]/*‘ />
3928         [
3929             SRCategory(SR.CatPropertyChanged), 
3930             SRDescription(SR.DataGridViewOnReadOnlyChangedDescr)
3931         ]
3932         public event EventHandler ReadOnlyChanged
3933         {
3934             add
3935             {
3936                 this.Events.AddHandler(EVENT_DATAGRIDVIEWREADONLYCHANGED, value);
3937             }
3938             remove
3939             {
3940                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWREADONLYCHANGED, value);
3941             }
3942         }
3943  
3944         private void ResetCurrentCell()
3945         {
3946             if (this.ptCurrentCell.X != -1 &&
3947                 !SetCurrentCellAddressCore(-1, -1, true /*setAnchorCellAddress*/, true /*validateCurrentCell*/, false /*throughMouseClick*/))
3948             {
3949                 // Edited value couldn‘t be committed or aborted
3950                 throw new InvalidOperationException(SR.GetString(SR.DataGridView_CellChangeCannotBeCommittedOrAborted));
3951             }
3952         }
3953  
3954         internal bool ResizingOperationAboutToStart
3955         {
3956             get
3957             {
3958                 return this.dataGridViewOper[DATAGRIDVIEWOPER_resizingOperationAboutToStart];
3959             }
3960         }
3961  
3962         internal bool RightToLeftInternal
3963         {
3964             get
3965             {
3966                 if (this.dataGridViewState2[DATAGRIDVIEWSTATE2_rightToLeftValid])
3967                 {
3968                     return this.dataGridViewState2[DATAGRIDVIEWSTATE2_rightToLeftMode];
3969                 }
3970                 this.dataGridViewState2[DATAGRIDVIEWSTATE2_rightToLeftMode] = (this.RightToLeft == RightToLeft.Yes);
3971                 this.dataGridViewState2[DATAGRIDVIEWSTATE2_rightToLeftValid] = true;
3972                 return this.dataGridViewState2[DATAGRIDVIEWSTATE2_rightToLeftMode];
3973             }
3974         }
3975  
3976         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowCount"]/*‘ />
3977         [
3978             Browsable(false),
3979             DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
3980             EditorBrowsable(EditorBrowsableState.Advanced),
3981             DefaultValue(0)
3982         ]
3983         public int RowCount
3984         {
3985             get
3986             {
3987                 return this.Rows.Count;
3988             }
3989             set
3990             {
3991                 if (this.AllowUserToAddRowsInternal)
3992                 {
3993                     if (value < 1)
3994                     {
3995                         throw new ArgumentOutOfRangeException("RowCount", SR.GetString(SR.InvalidLowBoundArgumentEx, "RowCount", value.ToString(CultureInfo.CurrentCulture), (1).ToString(CultureInfo.CurrentCulture)));
3996                     }
3997                 }
3998                 else
3999                 {
4000                     if (value < 0)
4001                     {
4002                         throw new ArgumentOutOfRangeException("RowCount", SR.GetString(SR.InvalidLowBoundArgumentEx, "RowCount", value.ToString(CultureInfo.CurrentCulture), (0).ToString(CultureInfo.CurrentCulture)));
4003                     }
4004                 }
4005                 if (this.DataSource != null)
4006                 {
4007                     throw new InvalidOperationException(SR.GetString(SR.DataGridView_CannotSetRowCountOnDataBoundDataGridView));
4008                 }
4009                 if (value != this.Rows.Count)
4010                 {
4011                     if (value == 0)
4012                     {
4013                         // Total removal of the rows.
4014                         this.Rows.Clear();
4015                     }
4016                     else if (value < this.Rows.Count)
4017                     {
4018                         // Some rows need to be removed, from the tail of the rows collection
4019                         while (value < this.Rows.Count)
4020                         {
4021                             int currentRowCount = this.Rows.Count;
4022                             this.Rows.RemoveAt(currentRowCount - (this.AllowUserToAddRowsInternal ? 2 :  1));
4023                             if (this.Rows.Count >= currentRowCount)
4024                             {
4025                                 // Row removal failed. We stop the loop.
4026                                 break;
4027                             }
4028                         }
4029                     }
4030                     else
4031                     {
4032                         // Some rows need to be appened.
4033                         if (this.Columns.Count == 0)
4034                         {
4035                             // There are no columns yet, we simply create a single DataGridViewTextBoxColumn.
4036                             DataGridViewTextBoxColumn dataGridViewTextBoxColumn = new DataGridViewTextBoxColumn();
4037                             this.Columns.Add(dataGridViewTextBoxColumn);
4038                         }
4039                         int rowsToAdd = value - this.Rows.Count;
4040                         if (rowsToAdd > 0)
4041                         {
4042                             this.Rows.Add(rowsToAdd);
4043                         }
4044                     }
4045                 }
4046             }
4047         }
4048  
4049         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowHeadersBorderStyle"]/*‘ />
4050         [
4051             SRCategory(SR.CatAppearance),
4052             SRDescription(SR.DataGridView_RowHeadersBorderStyleDescr),
4053             Browsable(true),
4054             DefaultValue(DataGridViewHeaderBorderStyle.Raised)
4055         ]
4056         public DataGridViewHeaderBorderStyle RowHeadersBorderStyle
4057         {
4058             get
4059             {
4060                 switch (this.advancedRowHeadersBorderStyle.All)
4061                 {
4062                     case DataGridViewAdvancedCellBorderStyle.NotSet:
4063                         return DataGridViewHeaderBorderStyle.Custom;
4064  
4065                     case DataGridViewAdvancedCellBorderStyle.None:
4066                         return DataGridViewHeaderBorderStyle.None;
4067  
4068                     case DataGridViewAdvancedCellBorderStyle.Single:
4069                         return DataGridViewHeaderBorderStyle.Single;
4070  
4071                     case DataGridViewAdvancedCellBorderStyle.InsetDouble:
4072                         return DataGridViewHeaderBorderStyle.Sunken;
4073  
4074                     case DataGridViewAdvancedCellBorderStyle.OutsetPartial:
4075                         return DataGridViewHeaderBorderStyle.Raised;
4076  
4077                     default:
4078                         return DataGridViewHeaderBorderStyle.Custom;
4079                 }
4080             }
4081             set
4082             {
4083                 // Sequential enum.  Valid values are 0x0 to 0x4
4084                 if (!ClientUtils.IsEnumValid(value, (int)value, (int)DataGridViewHeaderBorderStyle.Custom, (int)DataGridViewHeaderBorderStyle.None))
4085                 {
4086                     throw new InvalidEnumArgumentException("value", (int)value, typeof(DataGridViewHeaderBorderStyle)); 
4087                 }
4088  
4089                 if (value != this.RowHeadersBorderStyle)
4090                 {
4091                     if (value == DataGridViewHeaderBorderStyle.Custom)
4092                     {
4093                         throw new ArgumentException(SR.GetString(SR.DataGridView_CustomCellBorderStyleInvalid, "RowHeadersBorderStyle"));
4094                     }
4095                     this.dataGridViewOper[DATAGRIDVIEWOPER_inBorderStyleChange] = true;
4096                     try
4097                     {
4098                         switch (value)
4099                         {
4100                             case DataGridViewHeaderBorderStyle.Single:
4101                                 this.advancedRowHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
4102                                 break;
4103  
4104                             case DataGridViewHeaderBorderStyle.Raised:
4105                                 this.advancedRowHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.OutsetPartial;
4106                                 break;
4107  
4108                             case DataGridViewHeaderBorderStyle.Sunken:
4109                                 this.advancedRowHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.InsetDouble;
4110                                 break;
4111  
4112                             case DataGridViewHeaderBorderStyle.None:
4113                                 this.advancedRowHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.None;
4114                                 break;
4115                         }
4116                     }
4117                     finally
4118                     {
4119                         this.dataGridViewOper[DATAGRIDVIEWOPER_inBorderStyleChange] = false;
4120                     }
4121                     OnRowHeadersBorderStyleChanged(EventArgs.Empty);
4122                 }
4123             }
4124         }
4125  
4126         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowHeadersBorderStyleChanged"]/*‘ />
4127         [
4128             SRCategory(SR.CatPropertyChanged), 
4129             SRDescription(SR.DataGridView_RowHeadersBorderStyleChangedDescr)
4130         ]
4131         public event EventHandler RowHeadersBorderStyleChanged
4132         {
4133             add
4134             {
4135                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWHEADERSBORDERSTYLECHANGED, value);
4136             }
4137             remove
4138             {
4139                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWHEADERSBORDERSTYLECHANGED, value);
4140             }
4141         }
4142  
4143         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowHeadersDefaultCellStyle"]/*‘ />
4144         [
4145             SRCategory(SR.CatAppearance),
4146             SRDescription(SR.DataGridView_RowHeadersDefaultCellStyleDescr),
4147             AmbientValue(null)
4148         ]
4149         public DataGridViewCellStyle RowHeadersDefaultCellStyle
4150         {
4151             get 
4152             {
4153                 if (this.rowHeadersDefaultCellStyle == null)
4154                 {
4155                     this.rowHeadersDefaultCellStyle = this.DefaultRowHeadersDefaultCellStyle;
4156                 }
4157                 return this.rowHeadersDefaultCellStyle;
4158             }
4159             set 
4160             {
4161                 DataGridViewCellStyle cs = this.RowHeadersDefaultCellStyle;
4162                 cs.RemoveScope(DataGridViewCellStyleScopes.RowHeaders);
4163                 this.rowHeadersDefaultCellStyle = value;
4164                 if (value != null)
4165                 {
4166                     this.rowHeadersDefaultCellStyle.AddScope(this, DataGridViewCellStyleScopes.RowHeaders);
4167                 }
4168                 DataGridViewCellStyleDifferences dgvcsc = cs.GetDifferencesFrom(this.RowHeadersDefaultCellStyle);
4169                 if (dgvcsc != DataGridViewCellStyleDifferences.None)
4170                 {
4171                     this.CellStyleChangedEventArgs.ChangeAffectsPreferredSize = (dgvcsc == DataGridViewCellStyleDifferences.AffectPreferredSize);
4172                     OnRowHeadersDefaultCellStyleChanged(this.CellStyleChangedEventArgs);
4173                 }
4174             }
4175         }
4176  
4177         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowHeadersDefaultCellStyleChanged"]/*‘ />
4178         [
4179             SRCategory(SR.CatPropertyChanged), 
4180             SRDescription(SR.DataGridViewRowHeadersDefaultCellStyleChangedDescr)
4181         ]
4182         public event EventHandler RowHeadersDefaultCellStyleChanged
4183         {
4184             add 
4185             {
4186                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWHEADERSDEFAULTCELLSTYLECHANGED, value);
4187             }
4188             remove 
4189             {
4190                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWHEADERSDEFAULTCELLSTYLECHANGED, value);
4191             }
4192         }
4193         
4194         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowHeadersVisible"]/*‘ />
4195         /// <devdoc>
4196         ///    <para>
4197         ///       Gets or sets a value indicating whether the dataGridView‘s row headers are
4198         ///       visible.
4199         ///    </para>
4200         /// </devdoc>
4201         [
4202             SRCategory(SR.CatAppearance),
4203             DefaultValue(true),
4204             SRDescription(SR.DataGridViewRowHeadersVisibleDescr)
4205         ]
4206         public bool RowHeadersVisible
4207         {
4208             get 
4209             {
4210                 return this.dataGridViewState1[DATAGRIDVIEWSTATE1_rowHeadersVisible];
4211             }
4212             set 
4213             {
4214                 if (this.RowHeadersVisible != value)
4215                 {
4216                     if (!value &&
4217                         (this.autoSizeRowsMode == DataGridViewAutoSizeRowsMode.AllHeaders || this.autoSizeRowsMode == DataGridViewAutoSizeRowsMode.DisplayedHeaders))
4218                     {
4219                         throw new InvalidOperationException(SR.GetString(SR.DataGridView_RowHeadersCannotBeInvisible));
4220                     }
4221                     using (LayoutTransaction.CreateTransactionIf(this.AutoSize, this.ParentInternal, this, PropertyNames.RowHeadersVisible))
4222                     {
4223                         this.dataGridViewState1[DATAGRIDVIEWSTATE1_rowHeadersVisible] = value;
4224                         this.layout.RowHeadersVisible = value;
4225                         this.displayedBandsInfo.EnsureDirtyState();
4226                         if (!this.AutoSize)
4227                         {
4228                             PerformLayoutPrivate(false /*useRowShortcut*/, false /*computeVisibleRows*/, true /*invalidInAdjustFillingColumns*/, true /*repositionEditingControl*/);
4229                         }
4230                         InvalidateInside();
4231                         OnRowHeadersGlobalAutoSize(value /*expandingRows*/);
4232                     }
4233                 }
4234             }
4235         }
4236  
4237         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowHeadersWidth"]/*‘ />
4238         [
4239             SRCategory(SR.CatLayout),
4240             Localizable(true), 
4241             SRDescription(SR.DataGridView_RowHeadersWidthDescr)
4242         ]
4243         public int RowHeadersWidth
4244         {
4245             get 
4246             {
4247                 return this.rowHeadersWidth;
4248             }
4249             set 
4250             {
4251                 if (value < minimumRowHeadersWidth)
4252                 {
4253                     throw new ArgumentOutOfRangeException("RowHeadersWidth", SR.GetString(SR.InvalidLowBoundArgumentEx, "RowHeadersWidth", (value).ToString(CultureInfo.CurrentCulture), (minimumRowHeadersWidth).ToString(CultureInfo.CurrentCulture)));
4254                 }
4255                 if (value > maxHeadersThickness)
4256                 {
4257                     throw new ArgumentOutOfRangeException("RowHeadersWidth", SR.GetString(SR.InvalidHighBoundArgumentEx, "RowHeadersWidth", (value).ToString(CultureInfo.CurrentCulture), (maxHeadersThickness).ToString(CultureInfo.CurrentCulture)));
4258                 }
4259                 if (this.RowHeadersWidthSizeMode != DataGridViewRowHeadersWidthSizeMode.EnableResizing &&
4260                     this.RowHeadersWidthSizeMode != DataGridViewRowHeadersWidthSizeMode.DisableResizing)
4261                 {
4262                     this.cachedRowHeadersWidth = value;
4263                 }
4264                 else if (this.rowHeadersWidth != value)
4265                 {
4266                     this.RowHeadersWidthInternal = value;
4267                 }
4268             }
4269         }
4270  
4271         private int RowHeadersWidthInternal
4272         {
4273             set
4274             {
4275                 using (LayoutTransaction.CreateTransactionIf(this.AutoSize, this.ParentInternal, this, PropertyNames.RowHeadersWidth))
4276                 {
4277                     Debug.Assert(this.rowHeadersWidth != value);
4278                     Debug.Assert(value >= minimumRowHeadersWidth);
4279                     this.rowHeadersWidth = value;
4280                     if (this.AutoSize)
4281                     {
4282                         InvalidateInside();
4283                     }
4284                     else
4285                     {
4286                         if (this.layout.RowHeadersVisible)
4287                         {
4288                             PerformLayoutPrivate(false /*useRowShortcut*/, false /*computeVisibleRows*/, true /*invalidInAdjustFillingColumns*/, true /*repositionEditingControl*/);
4289                             InvalidateInside();
4290                         }
4291                     }
4292                     OnRowHeadersWidthChanged(EventArgs.Empty);
4293                 }
4294             }
4295         }
4296  
4297         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowHeadersWidthChanged"]/*‘ />
4298         [
4299             SRCategory(SR.CatPropertyChanged), 
4300             SRDescription(SR.DataGridViewRowHeadersWidthChangedDescr)
4301         ]
4302         public event EventHandler RowHeadersWidthChanged
4303         {
4304             add 
4305             {
4306                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWHEADERSWIDTHCHANGED, value);
4307             }
4308             remove 
4309             {
4310                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWHEADERSWIDTHCHANGED, value);
4311             }
4312         }
4313  
4314         private bool ShouldSerializeRowHeadersWidth()
4315         {
4316             return (this.rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.EnableResizing || this.rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.DisableResizing) && 
4317                    defaultRowHeadersWidth != this.RowHeadersWidth;
4318         }
4319  
4320         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowHeadersWidthSizeMode"]/*‘ />
4321         /// <devdoc>
4322         ///    <para>
4323         ///       Gets or sets a value that determines the behavior for adjusting the row headers width.
4324         ///    </para>
4325         /// </devdoc>
4326         [
4327             DefaultValue(DataGridViewRowHeadersWidthSizeMode.EnableResizing),
4328             RefreshProperties(RefreshProperties.All),
4329             SRCategory(SR.CatBehavior),
4330             SRDescription(SR.DataGridView_RowHeadersWidthSizeModeDescr)
4331         ]
4332         public DataGridViewRowHeadersWidthSizeMode RowHeadersWidthSizeMode
4333         {
4334             get
4335             {
4336                 return this.rowHeadersWidthSizeMode;
4337             }
4338             set
4339             {
4340                 // Sequential enum.  Valid values are 0x0 to 0x4
4341                 if (!ClientUtils.IsEnumValid(value, (int)value, (int)DataGridViewRowHeadersWidthSizeMode.EnableResizing, (int)DataGridViewRowHeadersWidthSizeMode.AutoSizeToFirstHeader))
4342                 {
4343                     throw new InvalidEnumArgumentException("value", (int)value, typeof(DataGridViewRowHeadersWidthSizeMode)); 
4344                 }
4345                 if (this.rowHeadersWidthSizeMode != value)
4346                 {
4347                     /*if (value != DataGridViewRowHeadersWidthSizeMode.EnableResizing && 
4348                      *    value != DataGridViewRowHeadersWidthSizeMode.DisableResizing &&
4349                      *    !this.RowHeadersVisible)
4350                     {
4351                         We intentionally don‘t throw an error because of designer code spit order.
4352                     }*/
4353                     DataGridViewAutoSizeModeEventArgs dgvasme = new DataGridViewAutoSizeModeEventArgs(this.rowHeadersWidthSizeMode != DataGridViewRowHeadersWidthSizeMode.EnableResizing &&
4354                                                                                                       this.rowHeadersWidthSizeMode != DataGridViewRowHeadersWidthSizeMode.DisableResizing);
4355                     this.rowHeadersWidthSizeMode = value;
4356                     OnRowHeadersWidthSizeModeChanged(dgvasme);
4357                 }
4358             }
4359         }
4360  
4361         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowHeadersWidthSizeModeChanged"]/*‘ />
4362         [
4363             SRCategory(SR.CatPropertyChanged), 
4364             SRDescription(SR.DataGridView_RowHeadersWidthSizeModeChangedDescr)
4365         ]
4366         public event DataGridViewAutoSizeModeEventHandler RowHeadersWidthSizeModeChanged
4367         {
4368             add
4369             {
4370                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWHEADERSWIDTHSIZEMODECHANGED, value);
4371             }
4372             remove
4373             {
4374                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWHEADERSWIDTHSIZEMODECHANGED, value);
4375             }
4376         }
4377  
4378         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.Rows"]/*‘ />
4379         [
4380             Browsable(false)
4381         ]
4382         public DataGridViewRowCollection Rows
4383         {
4384             get
4385             {
4386                 if (this.dataGridViewRows == null)
4387                 {
4388                     this.dataGridViewRows = CreateRowsInstance();
4389                 }
4390                 return this.dataGridViewRows;
4391             }
4392         }
4393  
4394         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowsDefaultCellStyle"]/*‘ />
4395         [
4396             SRCategory(SR.CatAppearance),
4397             SRDescription(SR.DataGridView_RowsDefaultCellStyleDescr)
4398         ]
4399         public DataGridViewCellStyle RowsDefaultCellStyle
4400         {
4401             get
4402             {
4403                 if (this.rowsDefaultCellStyle == null)
4404                 {
4405                     this.rowsDefaultCellStyle = new DataGridViewCellStyle();
4406                     this.rowsDefaultCellStyle.AddScope(this, DataGridViewCellStyleScopes.Rows);
4407                 }
4408                 return this.rowsDefaultCellStyle;
4409             }
4410             set
4411             {
4412                 DataGridViewCellStyle cs = this.RowsDefaultCellStyle;
4413                 cs.RemoveScope(DataGridViewCellStyleScopes.Rows);
4414                 this.rowsDefaultCellStyle = value;
4415                 if (value != null)
4416                 {
4417                     this.rowsDefaultCellStyle.AddScope(this, DataGridViewCellStyleScopes.Rows);
4418                 }
4419                 DataGridViewCellStyleDifferences dgvcsc = cs.GetDifferencesFrom(this.RowsDefaultCellStyle);
4420                 if (dgvcsc != DataGridViewCellStyleDifferences.None)
4421                 {
4422                     this.CellStyleChangedEventArgs.ChangeAffectsPreferredSize = (dgvcsc == DataGridViewCellStyleDifferences.AffectPreferredSize);
4423                     OnRowsDefaultCellStyleChanged(this.CellStyleChangedEventArgs);
4424                 }
4425             }
4426         }
4427  
4428         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowsDefaultCellStyleChanged"]/*‘ />
4429         [
4430             SRCategory(SR.CatPropertyChanged), 
4431             SRDescription(SR.DataGridViewRowsDefaultCellStyleChangedDescr)
4432         ]
4433         public event EventHandler RowsDefaultCellStyleChanged
4434         {
4435             add
4436             {
4437                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWSDEFAULTCELLSTYLECHANGED, value);
4438             }
4439             remove
4440             {
4441                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWSDEFAULTCELLSTYLECHANGED, value);
4442             }
4443         }
4444  
4445         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowTemplate"]/*‘ />
4446         [
4447             SRCategory(SR.CatAppearance),
4448             Browsable(true),
4449             SRDescription(SR.DataGridView_RowTemplateDescr),
4450             DesignerSerializationVisibility(DesignerSerializationVisibility.Content)
4451         ]
4452         public DataGridViewRow RowTemplate
4453         {
4454             get
4455             {
4456                 if (this.rowTemplate == null)
4457                 {
4458                     this.rowTemplate = new DataGridViewRow();
4459                 }
4460                 return this.rowTemplate;
4461             }
4462             set
4463             {
4464                 DataGridViewRow dataGridViewRow = value;
4465                 if (dataGridViewRow != null)
4466                 {
4467                     if (dataGridViewRow.DataGridView != null)
4468                     {
4469                         throw new InvalidOperationException(SR.GetString(SR.DataGridView_RowAlreadyBelongsToDataGridView));
4470                     }
4471                     //if (dataGridViewRow.Selected)
4472                     //{
4473                     //    throw new InvalidOperationException(SR.GetString(SR.DataGridView_RowTemplateCannotBeSelected));
4474                     //}
4475                 }
4476                 this.rowTemplate = dataGridViewRow;
4477             }
4478         }
4479  
4480         private bool ShouldSerializeRowTemplate()
4481         {
4482             return this.rowTemplate != null;
4483         }
4484  
4485         internal DataGridViewRow RowTemplateClone
4486         {
4487             get
4488             {
4489                 DataGridViewRow rowTemplateClone = (DataGridViewRow) this.RowTemplate.Clone();
4490                 CompleteCellsCollection(rowTemplateClone);
4491                 return rowTemplateClone;
4492             }
4493         }
4494  
4495         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ScrollBars"]/*‘ />
4496         /// <devdoc>
4497         ///     Possible return values are given by the ScrollBars enumeration.
4498         /// </devdoc>
4499         [
4500             DefaultValue(ScrollBars.Both), 
4501             Localizable(true), 
4502             SRCategory(SR.CatLayout), 
4503             SRDescription(SR.DataGridView_ScrollBarsDescr)
4504         ]
4505         public ScrollBars ScrollBars
4506         {
4507             get
4508             {
4509                 return this.scrollBars;
4510             }
4511             set
4512             {
4513                 // Sequential enum.  Valid values are 0x0 to 0x3
4514                 if (!ClientUtils.IsEnumValid(value, (int)value, (int)ScrollBars.None, (int)ScrollBars.Both))
4515                 {
4516                      throw new InvalidEnumArgumentException("value", (int)value, typeof(ScrollBars)); 
4517                 }
4518  
4519                 if (this.scrollBars != value)
4520                 {
4521                     using (LayoutTransaction.CreateTransactionIf(this.AutoSize, this.ParentInternal, this, PropertyNames.ScrollBars))
4522                     {
4523                         // Before changing the value of this.scrollBars, we scroll to the top-left cell to
4524                         // avoid inconsitent state of scrollbars.
4525                         DataGridViewColumn dataGridViewColumn = this.Columns.GetFirstColumn(DataGridViewElementStates.Visible);
4526                         int firstVisibleRowIndex = this.Rows.GetFirstRow(DataGridViewElementStates.Visible);
4527  
4528                         if (dataGridViewColumn != null && firstVisibleRowIndex != -1)
4529                         {
4530                             if (!ScrollIntoView(dataGridViewColumn.Index, firstVisibleRowIndex, false))
4531                             {
4532                                 throw new InvalidOperationException(SR.GetString(SR.DataGridView_CellChangeCannotBeCommittedOrAborted));
4533                             }
4534                         }
4535                         Debug.Assert(this.HorizontalOffset == 0);
4536                         Debug.Assert(this.VerticalOffset == 0);
4537  
4538                         this.scrollBars = value;
4539  
4540                         if (!this.AutoSize)
4541                         {
4542                             PerformLayoutPrivate(false /*useRowShortcut*/, false /*computeVisibleRows*/, true /*invalidInAdjustFillingColumns*/, true /*repositionEditingControl*/);
4543                         }
4544                         Invalidate();
4545                     }
4546                 }
4547             }
4548         }
4549  
4550         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.SelectedCells"]/*‘ />
4551         [
4552             Browsable(false)
4553         ]
4554         public DataGridViewSelectedCellCollection SelectedCells
4555         {
4556             [
4557                 SuppressMessage("Microsoft.Performance", "CA1817:DoNotCallPropertiesThatCloneValuesInLoops"), // not legitimate
4558                 SuppressMessage("Microsoft.Performance", "CA1808:AvoidCallsThatBoxValueTypes") // consider using generics instead of DataGridViewIntLinkedList
4559             ]
4560             get
4561             {
4562                 DataGridViewSelectedCellCollection stcc = new DataGridViewSelectedCellCollection();
4563                 switch (this.SelectionMode)
4564                 {
4565                     case DataGridViewSelectionMode.CellSelect:
4566                     {
4567                         // Note: If we change the design and decide that SelectAll() should use band selection, 
4568                         // we need to add those to the selected cells.
4569                         stcc.AddCellLinkedList(this.individualSelectedCells);
4570                         break;
4571                     }
4572                     case DataGridViewSelectionMode.FullColumnSelect:
4573                     case DataGridViewSelectionMode.ColumnHeaderSelect:
4574                     {
4575                         foreach (int columnIndex in this.selectedBandIndexes)
4576                         {
4577                             foreach (DataGridViewRow dataGridViewRow in this.Rows)   // unshares all rows!
4578                             {
4579                                 stcc.Add(dataGridViewRow.Cells[columnIndex]);
4580                             }
4581                         }
4582                         if (this.SelectionMode == DataGridViewSelectionMode.ColumnHeaderSelect)
4583                         {
4584                             stcc.AddCellLinkedList(this.individualSelectedCells);
4585                         }
4586                         break;
4587                     }
4588                     case DataGridViewSelectionMode.FullRowSelect:
4589                     case DataGridViewSelectionMode.RowHeaderSelect:
4590                     {
4591                         foreach (int rowIndex in this.selectedBandIndexes)
4592                         {
4593                             DataGridViewRow dataGridViewRow = (DataGridViewRow) this.Rows[rowIndex]; // unshares the selected row
4594                             foreach (DataGridViewCell dataGridViewCell in dataGridViewRow.Cells)
4595                             {
4596                                 stcc.Add(dataGridViewCell);
4597                             }
4598                         }
4599                         if (this.SelectionMode == DataGridViewSelectionMode.RowHeaderSelect)
4600                         {
4601                             stcc.AddCellLinkedList(this.individualSelectedCells);
4602                         }
4603                         break;
4604                     }
4605                 }
4606                 return stcc;
4607             }
4608         }
4609  
4610         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.SelectedColumns"]/*‘ />
4611         [
4612             Browsable(false)
4613         ]
4614         public DataGridViewSelectedColumnCollection SelectedColumns
4615         {
4616             [
4617                 SuppressMessage("Microsoft.Performance", "CA1808:AvoidCallsThatBoxValueTypes") // consider using generics instead of DataGridViewIntLinkedList
4618             ]
4619             get
4620             {
4621                 DataGridViewSelectedColumnCollection strc = new DataGridViewSelectedColumnCollection();
4622                 switch (this.SelectionMode)
4623                 {
4624                     case DataGridViewSelectionMode.CellSelect:
4625                     case DataGridViewSelectionMode.FullRowSelect:
4626                     case DataGridViewSelectionMode.RowHeaderSelect:
4627                         break;
4628                     case DataGridViewSelectionMode.FullColumnSelect:
4629                     case DataGridViewSelectionMode.ColumnHeaderSelect:
4630                         foreach (int columnIndex in this.selectedBandIndexes)
4631                         {
4632                             strc.Add(this.Columns[columnIndex]);
4633                         }
4634                         break;
4635                 }
4636                 return strc;
4637             }
4638         }
4639         
4640         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.SelectedRows"]/*‘ />
4641         [
4642             Browsable(false),
4643         ]
4644         public DataGridViewSelectedRowCollection SelectedRows
4645         {
4646             [
4647                 SuppressMessage("Microsoft.Performance", "CA1808:AvoidCallsThatBoxValueTypes"), // using specialized DataGridViewIntLinkedList class instead of generics
4648                 SuppressMessage("Microsoft.Performance", "CA1817:DoNotCallPropertiesThatCloneValuesInLoops") // not legitimate
4649             ]
4650             get
4651             {
4652                 DataGridViewSelectedRowCollection strc = new DataGridViewSelectedRowCollection();
4653                 switch (this.SelectionMode)
4654                 {
4655                     case DataGridViewSelectionMode.CellSelect:
4656                     case DataGridViewSelectionMode.FullColumnSelect:
4657                     case DataGridViewSelectionMode.ColumnHeaderSelect:
4658                         break;
4659                     case DataGridViewSelectionMode.FullRowSelect:
4660                     case DataGridViewSelectionMode.RowHeaderSelect:
4661                         foreach (int rowIndex in this.selectedBandIndexes)
4662                         {
4663                             strc.Add((DataGridViewRow) this.Rows[rowIndex]); // unshares the selected row
4664                         }
4665                         break;
4666                 }
4667                 return strc;
4668             }
4669         }
4670  
4671         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.SelectionMode"]/*‘ />
4672         [
4673             Browsable(true),
4674             SRCategory(SR.CatBehavior),
4675             DefaultValue(DataGridViewSelectionMode.RowHeaderSelect),
4676             SRDescription(SR.DataGridView_SelectionModeDescr)
4677         ]
4678         public DataGridViewSelectionMode SelectionMode
4679         {
4680             get
4681             {
4682                 return this.selectionMode;
4683             }
4684             set
4685             {
4686                 // Sequential enum.  Valid values are 0x0 to 0x4
4687                 if (!ClientUtils.IsEnumValid(value, (int)value, (int)DataGridViewSelectionMode.CellSelect, (int)DataGridViewSelectionMode.ColumnHeaderSelect))
4688                 {
4689                     throw new InvalidEnumArgumentException("value", (int)value, typeof(DataGridViewSelectionMode)); 
4690                 }
4691  
4692                 if (this.SelectionMode != value)
4693                 {
4694                     if (!this.dataGridViewState2[DATAGRIDVIEWSTATE2_initializing] &&
4695                         (value == DataGridViewSelectionMode.FullColumnSelect || value == DataGridViewSelectionMode.ColumnHeaderSelect))
4696                     {
4697                         foreach (DataGridViewColumn dataGridViewColumn in this.Columns)
4698                         {
4699                             if (dataGridViewColumn.SortMode == DataGridViewColumnSortMode.Automatic)
4700                             {
4701                                 throw new InvalidOperationException(SR.GetString(SR.DataGridView_SelectionModeAndSortMode*, (value).ToString()));
4702                             }
4703                         }
4704                     }
4705                     ClearSelection();
4706                     this.selectionMode = value;
4707                 }
4708             }
4709         }
4710  
4711         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ShowCellErrors"]/*‘ />
4712         [
4713             DefaultValue(true),
4714             SRCategory(SR.CatAppearance),
4715             SRDescription(SR.DataGridView_ShowCellErrorsDescr)
4716         ]
4717         public bool ShowCellErrors
4718         {
4719             get
4720             {
4721                 return this.dataGridViewState2[DATAGRIDVIEWSTATE2_showCellErrors];
4722             }
4723             set
4724             {
4725                 if (this.ShowCellErrors != value)
4726                 {
4727                     this.dataGridViewState2[DATAGRIDVIEWSTATE2_showCellErrors] = value;
4728  
4729                     // Put this into OnShowCellErrorsChanged if created.
4730                     if (this.IsHandleCreated && !this.DesignMode)
4731                     {
4732                         if (value && !this.ShowRowErrors && !this.ShowCellToolTips)
4733                         {
4734                             // the tool tip hasn‘t yet been activated
4735                             // activate it now
4736                             this.toolTipControl.Activate(!String.IsNullOrEmpty(this.toolTipCaption));
4737                         }
4738  
4739                         if (!value && !this.ShowRowErrors && !this.ShowCellToolTips)
4740                         {
4741                             // there is no reason to keep the tool tip activated
4742                             // deactivate it
4743                             this.toolTipCaption = String.Empty;
4744                             this.toolTipControl.Activate(false /*activate*/);
4745                         }
4746  
4747                         if (!value && (this.ShowRowErrors || this.ShowCellToolTips))
4748                         {
4749                             // reset the tool tip
4750                             this.toolTipControl.Activate(!String.IsNullOrEmpty(this.toolTipCaption));
4751                         }
4752  
4753                         // Some autosizing may have to be applied since the potential presence of error icons influences the preferred sizes.
4754                         OnGlobalAutoSize();
4755                     }
4756  
4757                     if (!this.layout.dirty && !this.DesignMode)
4758                     {
4759                         this.Invalidate(Rectangle.Union(this.layout.Data, this.layout.ColumnHeaders));
4760                         this.Invalidate(this.layout.TopLeftHeader);
4761                     }
4762                 }
4763             }
4764         }
4765  
4766         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ShowCellToolTips"]/*‘ />
4767         [
4768             DefaultValue(true),
4769             SRCategory(SR.CatAppearance),
4770             SRDescription(SR.DataGridView_ShowCellToolTipsDescr)
4771         ]
4772         public bool ShowCellToolTips
4773         {
4774             get
4775             {
4776                 return this.dataGridViewState2[DATAGRIDVIEWSTATE2_showCellToolTips];
4777             }
4778             set
4779             {
4780                 if (this.ShowCellToolTips != value)
4781                 {
4782                     this.dataGridViewState2[DATAGRIDVIEWSTATE2_showCellToolTips] = value;
4783  
4784                     if (this.IsHandleCreated && !this.DesignMode)
4785                     {
4786                         if (value && !this.ShowRowErrors && !this.ShowCellErrors)
4787                         {
4788                             // the tool tip hasn‘t yet been activated
4789                             // activate it now
4790                             this.toolTipControl.Activate(!String.IsNullOrEmpty(this.toolTipCaption) /*activate*/);
4791                         }
4792  
4793                         if (!value && !this.ShowRowErrors && !this.ShowCellErrors)
4794                         {
4795                             // there is no reason to keep the tool tip activated
4796                             // deactivate it
4797                             this.toolTipCaption = String.Empty;
4798                             this.toolTipControl.Activate(false /*activate*/);
4799                         }
4800  
4801                         if (!value && (this.ShowRowErrors || this.ShowCellErrors))
4802                         {
4803                             bool activate = !String.IsNullOrEmpty(this.toolTipCaption);
4804                             Point mouseCoord = System.Windows.Forms.Control.MousePosition;
4805                             activate &= this.ClientRectangle.Contains(PointToClient(mouseCoord));
4806  
4807                             // reset the tool tip
4808                             this.toolTipControl.Activate(activate);
4809                         }
4810                     }
4811  
4812                     if (!this.layout.dirty && !this.DesignMode)
4813                     {
4814                         Invalidate(this.layout.Data);
4815                     }
4816                 }
4817             }
4818         }
4819  
4820         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ShowEditingIcon"]/*‘ />
4821         [
4822             DefaultValue(true),
4823             SRCategory(SR.CatAppearance),
4824             SRDescription(SR.DataGridView_ShowEditingIconDescr)
4825         ]
4826         public bool ShowEditingIcon
4827         {
4828             get
4829             {
4830                 return this.dataGridViewState2[DATAGRIDVIEWSTATE2_showEditingIcon];
4831             }
4832             set
4833             {
4834                 if (this.ShowEditingIcon != value)
4835                 {
4836                     this.dataGridViewState2[DATAGRIDVIEWSTATE2_showEditingIcon] = value;
4837  
4838                     // invalidate the row header to pick up the new ShowEditingIcon value 
4839                     if (this.RowHeadersVisible)
4840                     {
4841                         if (this.VirtualMode || this.DataSource != null)
4842                         {
4843                             if (this.IsCurrentRowDirty)
4844                             {
4845                                 Debug.Assert(this.ptCurrentCell.Y >= 0);
4846                                 InvalidateCellPrivate(-1, this.ptCurrentCell.Y);
4847                             }
4848                         }
4849                         else
4850                         {
4851                             if (this.IsCurrentCellDirty) {
4852                                 Debug.Assert(this.ptCurrentCell.Y >= 0);
4853                                 InvalidateCellPrivate(-1, this.ptCurrentCell.Y);
4854                             }
4855                         }
4856                     }
4857                 }
4858             }
4859         }
4860  
4861         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ShowRowErrors"]/*‘ />
4862         [
4863             DefaultValue(true),
4864             SRCategory(SR.CatAppearance),
4865             SRDescription(SR.DataGridView_ShowRowErrorsDescr)
4866         ]
4867         public bool ShowRowErrors
4868         {
4869             get
4870             {
4871                 return this.dataGridViewState2[DATAGRIDVIEWSTATE2_showRowErrors];
4872             }
4873             set 
4874             {
4875                 if (this.ShowRowErrors != value)
4876                 {
4877                     this.dataGridViewState2[DATAGRIDVIEWSTATE2_showRowErrors] = value;
4878  
4879                     if (this.IsHandleCreated && !this.DesignMode)
4880                     {
4881                         if (value && !this.ShowCellErrors && !this.ShowCellToolTips)
4882                         {
4883                             // the tool tip hasn‘t yet been activated
4884                             // activate it now
4885                             this.toolTipControl.Activate(!String.IsNullOrEmpty(this.toolTipCaption));
4886                         }
4887  
4888                         if (!value && !this.ShowCellErrors && !this.ShowCellToolTips)
4889                         {
4890                             // there is no reason to keep the tool tip activated
4891                             // deactivate it
4892                             this.toolTipCaption = String.Empty;
4893                             this.toolTipControl.Activate(false /*activate*/);
4894                         }
4895  
4896                         if (!value && (this.ShowCellErrors || this.ShowCellToolTips))
4897                         {
4898                             // reset the tool tip
4899                             this.toolTipControl.Activate(!String.IsNullOrEmpty(this.toolTipCaption));
4900                         }
4901                     }
4902  
4903                     if (!this.layout.dirty && !this.DesignMode)
4904                     {
4905                         Invalidate(this.layout.RowHeaders);
4906                     }
4907                 }
4908             }
4909         }
4910  
4911         internal bool SingleHorizontalBorderAdded
4912         {
4913             get
4914             {
4915                 return !this.layout.ColumnHeadersVisible && 
4916                     (this.AdvancedCellBorderStyle.All == DataGridViewAdvancedCellBorderStyle.Single ||
4917                      this.CellBorderStyle == DataGridViewCellBorderStyle.SingleHorizontal);
4918             }
4919         }
4920  
4921         internal bool SingleVerticalBorderAdded
4922         {
4923             get
4924             {
4925                 return !this.layout.RowHeadersVisible && 
4926                     (this.AdvancedCellBorderStyle.All == DataGridViewAdvancedCellBorderStyle.Single ||
4927                      this.CellBorderStyle == DataGridViewCellBorderStyle.SingleVertical);
4928             }
4929         }
4930  
4931         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.SortedColumn"]/*‘ />
4932         [
4933             Browsable(false)
4934         ]
4935         public DataGridViewColumn SortedColumn
4936         {
4937             get
4938             {
4939                 return this.sortedColumn;
4940             }
4941         }
4942  
4943         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.SortOrder"]/*‘ />
4944         [
4945             Browsable(false)
4946         ]
4947         public SortOrder SortOrder
4948         {
4949             get
4950             {
4951                 return this.sortOrder;
4952             }
4953         }
4954  
4955         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.StandardTab"]/*‘ />
4956         /// <devdoc>
4957         ///    <para>
4958         ///    </para>
4959         /// </devdoc>
4960         [
4961             SRCategory(SR.CatBehavior), 
4962             DefaultValue(false), 
4963             EditorBrowsable(EditorBrowsableState.Advanced),
4964             SRDescription(SR.DataGridView_StandardTabDescr)
4965         ]
4966         public bool StandardTab
4967         {
4968             get
4969             {
4970                 return this.dataGridViewState1[DATAGRIDVIEWSTATE1_standardTab];
4971             }
4972             set
4973             {
4974                 if (this.dataGridViewState1[DATAGRIDVIEWSTATE1_standardTab] != value)
4975                 {
4976                     this.dataGridViewState1[DATAGRIDVIEWSTATE1_standardTab] = value;
4977                     //OnStandardTabChanged(EventArgs.Empty);
4978                 }
4979             }
4980         }
4981  
4982         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.Text"]/*‘ />
4983         [
4984             Browsable(false), 
4985             EditorBrowsable(EditorBrowsableState.Never),
4986             Bindable(false)
4987         ]
4988         public override string Text
4989         {
4990             get
4991             {
4992                 return base.Text;
4993             }
4994             set
4995             {
4996                 base.Text = value;
4997             }
4998         }
4999  
5000         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.TextChanged"]/*‘ />
5001         [
5002             Browsable(false),
5003             EditorBrowsable(EditorBrowsableState.Never)
5004         ]
5005         new public event EventHandler TextChanged
5006         {
5007             add
5008             {
5009                 base.TextChanged += value;
5010             }
5011             remove
5012             {
5013                 base.TextChanged -= value;
5014             }
5015         }
5016  
5017         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.this"]/*‘ />
5018         [
5019             Browsable(false),
5020             DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
5021             SuppressMessage("Microsoft.Design", "CA1023:IndexersShouldNotBeMultidimensional")
5022         ]
5023         public DataGridViewCell this[int columnIndex, int rowIndex]
5024         {
5025             get
5026             {
5027                 DataGridViewRow row = this.Rows[rowIndex];
5028                 return row.Cells[columnIndex];
5029             }
5030             set
5031             {
5032                 DataGridViewRow row = this.Rows[rowIndex];
5033                 row.Cells[columnIndex] = value;
5034             }
5035         }
5036  
5037         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.this1"]/*‘ />
5038         [
5039             Browsable(false),
5040             DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
5041             SuppressMessage("Microsoft.Design", "CA1023:IndexersShouldNotBeMultidimensional")
5042         ]
5043         public DataGridViewCell this[string columnName, int rowIndex]
5044         {
5045             get
5046             {
5047                 DataGridViewRow row = this.Rows[rowIndex];
5048                 return row.Cells[columnName];
5049             }
5050             set
5051             {
5052                 DataGridViewRow row = this.Rows[rowIndex];
5053                 row.Cells[columnName] = value;
5054             }
5055         }
5056  
5057         private string ToolTipPrivate
5058         {
5059             get
5060             {
5061                 return this.toolTipCaption;
5062             }
5063         }
5064  
5065         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.TopLeftHeaderCell"]/*‘ />
5066         [
5067             Browsable(false),
5068             DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
5069         ]
5070         public DataGridViewHeaderCell TopLeftHeaderCell
5071         {
5072             get
5073             {
5074                 if (this.topLeftHeaderCell == null)
5075                 {
5076                     this.TopLeftHeaderCell = new DataGridViewTopLeftHeaderCell();
5077                 }
5078                 return this.topLeftHeaderCell;
5079             }
5080             set
5081             {
5082                 if (this.topLeftHeaderCell != value)
5083                 {
5084                     if (this.topLeftHeaderCell != null)
5085                     {
5086                         // Detach existing header cell
5087                         this.topLeftHeaderCell.DataGridViewInternal = null;
5088                     }
5089                     this.topLeftHeaderCell = value;
5090                     if (value != null)
5091                     {
5092                         this.topLeftHeaderCell.DataGridViewInternal = this;
5093                     }
5094                     if (this.ColumnHeadersVisible && this.RowHeadersVisible)
5095                     {
5096                         // If headers (rows or columns) are autosized, then this.RowHeadersWidth or this.ColumnHeadersHeight
5097                         // must be updated based on new cell preferred size
5098                         OnColumnHeadersGlobalAutoSize();
5099                         // In all cases, the top left cell needs to repaint
5100                         Invalidate(new Rectangle(this.layout.Inside.X, this.layout.Inside.Y, this.RowHeadersWidth, this.ColumnHeadersHeight));
5101                     }
5102                 }
5103             }
5104         }
5105  
5106         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.UserSetCursor"]/*‘ />
5107         [
5108             Browsable(false),
5109             EditorBrowsable(EditorBrowsableState.Advanced)
5110         ]
5111         public Cursor UserSetCursor
5112         {
5113             get
5114             {
5115                 if (this.dataGridViewState1[DATAGRIDVIEWSTATE1_customCursorSet])
5116                 {
5117                     return this.oldCursor;
5118                 }
5119                 else
5120                 {
5121                     return this.Cursor;
5122                 }
5123             }
5124         }
5125  
5126         internal int VerticalOffset
5127         {
5128             get
5129             {
5130                 return this.verticalOffset;
5131             }
5132             set 
5133             {
5134                 if (value < 0)
5135                 {
5136                     value = 0;
5137                 }
5138                 int totalVisibleFrozenHeight = this.Rows.GetRowsHeight(DataGridViewElementStates.Visible | DataGridViewElementStates.Frozen);
5139                 int fittingTrailingScrollingRowsHeight = ComputeHeightOfFittingTrailingScrollingRows(totalVisibleFrozenHeight);
5140                 if (value > this.vertScrollBar.Maximum - fittingTrailingScrollingRowsHeight)
5141                 {
5142                     value = this.vertScrollBar.Maximum - fittingTrailingScrollingRowsHeight;
5143                 }
5144                 if (value == this.verticalOffset)
5145                 {
5146                     return;
5147                 }
5148  
5149                 int change = value - this.verticalOffset;
5150                 if (this.vertScrollBar.Enabled)
5151                 {
5152                     this.vertScrollBar.Value = value;
5153                 }
5154                 ScrollRowsByHeight(change); // calculate how many rows need to be scrolled based on ‘change‘
5155             }
5156         }
5157  
5158         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.VerticalScrollBar"]/*‘ />
5159         protected ScrollBar VerticalScrollBar
5160         {
5161             get
5162             {
5163                 return this.vertScrollBar;
5164             }
5165         }
5166  
5167         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.VerticalScrollingOffset"]/*‘ />
5168         [
5169             Browsable(false),
5170             DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
5171         ]
5172         public int VerticalScrollingOffset
5173         {
5174             get
5175             {
5176                 return this.verticalOffset;
5177             }
5178         }
5179  
5180         private System.Windows.Forms.Timer VertScrollTimer
5181         {
5182             get
5183             {
5184                 if (this.vertScrollTimer == null)
5185                 {
5186                     this.vertScrollTimer = new System.Windows.Forms.Timer();
5187                     this.vertScrollTimer.Tick += new System.EventHandler(VertScrollTimer_Tick);
5188                 }
5189                 return this.vertScrollTimer;
5190             }
5191         }
5192  
5193         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.VirtualMode"]/*‘ />
5194         /// <devdoc>
5195         ///    <para>
5196         ///    </para>
5197         /// </devdoc>
5198         [
5199             SRCategory(SR.CatBehavior),
5200             DefaultValue(false),
5201             EditorBrowsable(EditorBrowsableState.Advanced),
5202             SRDescription(SR.DataGridViewVirtualModeDescr)
5203         ]
5204         public bool VirtualMode
5205         {
5206             get
5207             {
5208                 return this.dataGridViewState1[DATAGRIDVIEWSTATE1_virtualMode];
5209             }
5210             set
5211             {
5212                 if (this.dataGridViewState1[DATAGRIDVIEWSTATE1_virtualMode] != value)
5213                 {
5214                     this.dataGridViewState1[DATAGRIDVIEWSTATE1_virtualMode] = value;
5215                     InvalidateRowHeights();
5216                     //OnVirtualModeChanged(EventArgs.Empty);
5217                 }
5218             }
5219         }
5220  
5221         private bool VisibleCellExists
5222         {
5223             get
5224             {
5225                 if (null == this.Columns.GetFirstColumn(DataGridViewElementStates.Visible))
5226                 {
5227                     return false;
5228                 }
5229                 return -1 != this.Rows.GetFirstRow(DataGridViewElementStates.Visible);
5230             }
5231         }
5232  
5233         // Events start here
5234  
5235         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.AutoSizeColumnModeChanged"]/*‘ />
5236         [
5237             SRCategory(SR.CatPropertyChanged), 
5238             SRDescription(SR.DataGridViewAutoSizeColumnModeChangedDescr)
5239         ]
5240         public event DataGridViewAutoSizeColumnModeEventHandler AutoSizeColumnModeChanged
5241         {
5242             add
5243             {
5244                 this.Events.AddHandler(EVENT_DATAGRIDVIEWAUTOSIZECOLUMNMODECHANGED, value);
5245             }
5246             remove
5247             {
5248                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWAUTOSIZECOLUMNMODECHANGED, value);
5249             }
5250         }
5251  
5252         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CancelRowEdit"]/*‘ />
5253         [
5254             SRCategory(SR.CatAction),
5255             SRDescription(SR.DataGridView_CancelRowEditDescr)
5256         ]
5257         public event QuestionEventHandler CancelRowEdit
5258         {
5259             add
5260             {
5261                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCANCELROWEDIT, value);
5262             }
5263             remove
5264             {
5265                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCANCELROWEDIT, value);
5266             }
5267         }
5268  
5269         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellBeginEdit"]/*‘ />
5270         [
5271             SRCategory(SR.CatData),
5272             SRDescription(SR.DataGridView_CellBeginEditDescr)
5273         ]
5274         public event DataGridViewCellCancelEventHandler CellBeginEdit 
5275         {
5276             add 
5277             {
5278                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLBEGINEDIT, value);
5279             }
5280             remove 
5281             {
5282                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLBEGINEDIT, value);
5283             }
5284         }
5285  
5286         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellClick"]/*‘ />
5287         [
5288             SRCategory(SR.CatMouse),
5289             SRDescription(SR.DataGridView_CellClickDescr)
5290         ]
5291         public event DataGridViewCellEventHandler CellClick
5292         {
5293             add 
5294             {
5295                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLCLICK, value);
5296             }
5297             remove 
5298             {
5299                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLCLICK, value);
5300             }
5301         }
5302  
5303         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellContentClick"]/*‘ />
5304         [
5305             SRCategory(SR.CatMouse),
5306             SRDescription(SR.DataGridView_CellContentClick)
5307         ]
5308         public event DataGridViewCellEventHandler CellContentClick
5309         {
5310             add 
5311             {
5312                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLCONTENTCLICK, value);
5313             }
5314             remove 
5315             {
5316                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLCONTENTCLICK, value);
5317             }
5318         }
5319  
5320         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellContentDoubleClick"]/*‘ />
5321         [
5322             SRCategory(SR.CatMouse),
5323             SRDescription(SR.DataGridView_CellContentDoubleClick)
5324         ]
5325         public event DataGridViewCellEventHandler CellContentDoubleClick
5326         {
5327             add
5328             {
5329                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLCONTENTDOUBLECLICK, value);
5330             }
5331             remove
5332             {
5333                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLCONTENTDOUBLECLICK, value);
5334             }
5335         }
5336  
5337         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellContextMenuStripChanged"]/*‘ />
5338         [
5339             SRCategory(SR.CatAction),
5340             SRDescription(SR.DataGridView_CellContextMenuStripChanged),
5341             EditorBrowsable(EditorBrowsableState.Advanced)
5342         ]
5343         public event DataGridViewCellEventHandler CellContextMenuStripChanged
5344         {
5345             add
5346             {
5347                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLCONTEXTMENUSTRIPCHANGED, value);
5348             }
5349             remove
5350             {
5351                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLCONTEXTMENUSTRIPCHANGED, value);
5352             }
5353         }
5354  
5355         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellContextMenuStripNeeded"]/*‘ />
5356         [
5357             SRCategory(SR.CatBehavior),
5358             SRDescription(SR.DataGridView_CellContextMenuStripNeeded),
5359             EditorBrowsable(EditorBrowsableState.Advanced)
5360         ]
5361         public event DataGridViewCellContextMenuStripNeededEventHandler CellContextMenuStripNeeded
5362         {
5363             add
5364             {
5365                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLCONTEXTMENUSTRIPNEEDED, value);
5366             }
5367             remove
5368             {
5369                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLCONTEXTMENUSTRIPNEEDED, value);
5370             }
5371         }
5372  
5373         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellDoubleClick"]/*‘ />
5374         [
5375             SRCategory(SR.CatMouse),
5376             SRDescription(SR.DataGridView_CellDoubleClickDescr)
5377         ]
5378         public event DataGridViewCellEventHandler CellDoubleClick
5379         {
5380             add
5381             {
5382                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLDOUBLECLICK, value);
5383             }
5384             remove
5385             {
5386                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLDOUBLECLICK, value);
5387             }
5388         }
5389  
5390         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellEndEdit"]/*‘ />
5391         [
5392             SRCategory(SR.CatData),
5393             SRDescription(SR.DataGridView_CellEndEditDescr)
5394         ]
5395         public event DataGridViewCellEventHandler CellEndEdit 
5396         {
5397             add 
5398             {
5399                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLENDEDIT, value);
5400             }
5401             remove 
5402             {
5403                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLENDEDIT, value);
5404             }
5405         }
5406  
5407         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellEnter"]/*‘ />
5408         [
5409             SRCategory(SR.CatFocus),
5410             SRDescription(SR.DataGridView_CellEnterDescr)
5411         ]
5412         public event DataGridViewCellEventHandler CellEnter
5413         {
5414             add 
5415             {
5416                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLENTER, value);
5417             }
5418             remove 
5419             {
5420                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLENTER, value);
5421             }
5422         }
5423  
5424         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellErrorTextChanged"]/*‘ />
5425         [
5426             SRCategory(SR.CatPropertyChanged),
5427             SRDescription(SR.DataGridView_CellErrorTextChangedDescr)
5428         ]
5429         public event DataGridViewCellEventHandler CellErrorTextChanged
5430         {
5431             add
5432             {
5433                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLERRORTEXTCHANGED, value);
5434             }
5435             remove
5436             {
5437                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLERRORTEXTCHANGED, value);
5438             }
5439         }
5440  
5441         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellErrorTextNeeded"]/*‘ />
5442         [
5443             SRCategory(SR.CatData),
5444             EditorBrowsable(EditorBrowsableState.Advanced),
5445             SRDescription(SR.DataGridView_CellErrorTextNeededDescr)
5446         ]
5447         public event DataGridViewCellErrorTextNeededEventHandler CellErrorTextNeeded
5448         {
5449             add
5450             {
5451                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLERRORTEXTNEEDED, value);
5452             }
5453             remove
5454             {
5455                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLERRORTEXTNEEDED, value);
5456             }
5457         }
5458  
5459         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellFormatting"]/*‘ />
5460         [
5461             SRCategory(SR.CatDisplay),
5462             SRDescription(SR.DataGridView_CellFormattingDescr)
5463         ]
5464         public event DataGridViewCellFormattingEventHandler CellFormatting 
5465         {
5466             add 
5467             {
5468                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLFORMATTING, value);
5469             }
5470             remove 
5471             {
5472                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLFORMATTING, value);
5473             }
5474         }
5475  
5476         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellLeave"]/*‘ />
5477         [
5478             SRCategory(SR.CatFocus),
5479             SRDescription(SR.DataGridView_CellLeaveDescr)
5480         ]
5481         public event DataGridViewCellEventHandler CellLeave
5482         {
5483             add 
5484             {
5485                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLLEAVE, value);
5486             }
5487             remove 
5488             {
5489                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLLEAVE, value);
5490             }
5491         }
5492  
5493         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellMouseClick"]/*‘ />
5494         [
5495             SRCategory(SR.CatMouse),
5496             SRDescription(SR.DataGridView_CellMouseClickDescr)
5497         ]
5498         public event DataGridViewCellMouseEventHandler CellMouseClick
5499         {
5500             add 
5501             {
5502                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLMOUSECLICK, value);
5503             }
5504             remove 
5505             {
5506                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLMOUSECLICK, value);
5507             }
5508         }
5509  
5510         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellMouseDoubleClick"]/*‘ />
5511         [
5512             SRCategory(SR.CatMouse),
5513             SRDescription(SR.DataGridView_CellMouseDoubleClickDescr)
5514         ]
5515         public event DataGridViewCellMouseEventHandler CellMouseDoubleClick
5516         {
5517             add
5518             {
5519                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLMOUSEDOUBLECLICK, value);
5520             }
5521             remove
5522             {
5523                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLMOUSEDOUBLECLICK, value);
5524             }
5525         }
5526  
5527         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellMouseDown"]/*‘ />
5528         [
5529             SRCategory(SR.CatMouse),
5530             SRDescription(SR.DataGridView_CellMouseDownDescr)
5531         ]
5532         public event DataGridViewCellMouseEventHandler CellMouseDown
5533         {
5534             add 
5535             {
5536                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLMOUSEDOWN, value);
5537             }
5538             remove 
5539             {
5540                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLMOUSEDOWN, value);
5541             }
5542         }
5543  
5544         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellMouseEnter"]/*‘ />
5545         [
5546             SRCategory(SR.CatMouse),
5547             SRDescription(SR.DataGridView_CellMouseEnterDescr)
5548         ]
5549         public event DataGridViewCellEventHandler CellMouseEnter
5550         {
5551             add 
5552             {
5553                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLMOUSEENTER, value);
5554             }
5555             remove 
5556             {
5557                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLMOUSEENTER, value);
5558             }
5559         }
5560  
5561         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellMouseLeave"]/*‘ />
5562         [
5563             SRCategory(SR.CatMouse),
5564             SRDescription(SR.DataGridView_CellMouseLeaveDescr)
5565         ]
5566         public event DataGridViewCellEventHandler CellMouseLeave
5567         {
5568             add 
5569             {
5570                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLMOUSELEAVE, value);
5571             }
5572             remove 
5573             {
5574                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLMOUSELEAVE, value);
5575             }
5576         }
5577  
5578         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellMouseMove"]/*‘ />
5579         [
5580             SRCategory(SR.CatMouse),
5581             SRDescription(SR.DataGridView_CellMouseMoveDescr)
5582         ]
5583         public event DataGridViewCellMouseEventHandler CellMouseMove
5584         {
5585             add 
5586             {
5587                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLMOUSEMOVE, value);
5588             }
5589             remove 
5590             {
5591                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLMOUSEMOVE, value);
5592             }
5593         }
5594  
5595         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellMouseUp"]/*‘ />
5596         [
5597             SRCategory(SR.CatMouse),
5598             SRDescription(SR.DataGridView_CellMouseUpDescr)
5599         ]
5600         public event DataGridViewCellMouseEventHandler CellMouseUp 
5601         {
5602             add 
5603             {
5604                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLMOUSEUP, value);
5605             }
5606             remove 
5607             {
5608                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLMOUSEUP, value);
5609             }
5610         }
5611  
5612         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellPainting"]/*‘ />
5613         [
5614             SRCategory(SR.CatDisplay),
5615             SRDescription(SR.DataGridView_CellPaintingDescr)
5616         ]
5617         public event DataGridViewCellPaintingEventHandler CellPainting 
5618         {
5619             add 
5620             {
5621                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLPAINTING, value);
5622             }
5623             remove 
5624             {
5625                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLPAINTING, value);
5626             }
5627         }
5628  
5629         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellParsing"]/*‘ />
5630         [
5631             SRCategory(SR.CatDisplay),
5632             SRDescription(SR.DataGridView_CellParsingDescr)
5633         ]
5634         public event DataGridViewCellParsingEventHandler CellParsing
5635         {
5636             add 
5637             {
5638                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLPARSING, value);
5639             }
5640             remove 
5641             {
5642                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLPARSING, value);
5643             }
5644         }
5645  
5646         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellStateChanged"]/*‘ />
5647         [
5648             SRCategory(SR.CatBehavior),
5649             SRDescription(SR.DataGridView_CellStateChangedDescr)
5650         ]
5651         public event DataGridViewCellStateChangedEventHandler CellStateChanged 
5652         {
5653             add 
5654             {
5655                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLSTATECHANGED, value);
5656             }
5657             remove 
5658             {
5659                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLSTATECHANGED, value);
5660             }
5661         }
5662  
5663         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellStyleChanged"]/*‘ />
5664         [
5665             SRCategory(SR.CatPropertyChanged),
5666             SRDescription(SR.DataGridView_CellStyleChangedDescr)
5667         ]
5668         public event DataGridViewCellEventHandler CellStyleChanged 
5669         {
5670             add 
5671             {
5672                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLSTYLECHANGED, value);
5673             }
5674             remove 
5675             {
5676                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLSTYLECHANGED, value);
5677             }
5678         }
5679  
5680         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellStyleContentChanged"]/*‘ />
5681         [
5682             SRCategory(SR.CatPropertyChanged),
5683             SRDescription(SR.DataGridView_CellStyleContentChangedDescr)
5684         ]
5685         public event DataGridViewCellStyleContentChangedEventHandler CellStyleContentChanged
5686         {
5687             add
5688             {
5689                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLSTYLECONTENTCHANGED, value);
5690             }
5691             remove
5692             {
5693                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLSTYLECONTENTCHANGED, value);
5694             }
5695         }
5696  
5697         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellToolTipTextChanged"]/*‘ />
5698         [
5699             SRCategory(SR.CatPropertyChanged),
5700             SRDescription(SR.DataGridView_CellToolTipTextChangedDescr)
5701         ]
5702         public event DataGridViewCellEventHandler CellToolTipTextChanged
5703         {
5704             add
5705             {
5706                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLTOOLTIPTEXTCHANGED, value);
5707             }
5708             remove
5709             {
5710                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLTOOLTIPTEXTCHANGED, value);
5711             }
5712         }
5713  
5714         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellToolTipTextNeeded"]/*‘ />
5715         [
5716             SRCategory(SR.CatBehavior),
5717             SRDescription(SR.DataGridView_CellToolTipTextNeededDescr),
5718             EditorBrowsable(EditorBrowsableState.Advanced)
5719         ]
5720         public event DataGridViewCellToolTipTextNeededEventHandler CellToolTipTextNeeded
5721         {
5722             add
5723             {
5724                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLTOOLTIPTEXTNEEDED, value);
5725             }
5726             remove
5727             {
5728                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLTOOLTIPTEXTNEEDED, value);
5729             }
5730         }
5731  
5732         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellValidated"]/*‘ />
5733         [
5734             SRCategory(SR.CatFocus),
5735             SRDescription(SR.DataGridView_CellValidatedDescr)
5736         ]
5737         public event DataGridViewCellEventHandler CellValidated
5738         {
5739             add 
5740             {
5741                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLVALIDATED, value);
5742             }
5743             remove 
5744             {
5745                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLVALIDATED, value);
5746             }
5747         }
5748  
5749         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellValidating"]/*‘ />
5750         [
5751             SRCategory(SR.CatFocus),
5752             SRDescription(SR.DataGridView_CellValidatingDescr)
5753         ]
5754         public event DataGridViewCellValidatingEventHandler CellValidating
5755         {
5756             add 
5757             {
5758                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLVALIDATING, value);
5759             }
5760             remove 
5761             {
5762                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLVALIDATING, value);
5763             }
5764         }
5765  
5766         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellValueChanged"]/*‘ />
5767         [
5768             SRCategory(SR.CatAction),
5769             SRDescription(SR.DataGridView_CellValueChangedDescr)
5770         ]
5771         public event DataGridViewCellEventHandler CellValueChanged 
5772         {
5773             add 
5774             {
5775                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLVALUECHANGED, value);
5776             }
5777             remove 
5778             {
5779                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLVALUECHANGED, value);
5780             }
5781         }
5782  
5783         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellValueNeeded"]/*‘ />
5784         [
5785             SRCategory(SR.CatData),
5786             EditorBrowsable(EditorBrowsableState.Advanced),
5787             SRDescription(SR.DataGridView_CellValueNeededDescr)
5788         ]
5789         public event DataGridViewCellValueEventHandler CellValueNeeded 
5790         {
5791             add 
5792             {
5793                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLVALUENEEDED, value);
5794             }
5795             remove 
5796             {
5797                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLVALUENEEDED, value);
5798             }
5799         }
5800  
5801         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CellValuePushed"]/*‘ />
5802         [
5803             SRCategory(SR.CatData),
5804             EditorBrowsable(EditorBrowsableState.Advanced),
5805             SRDescription(SR.DataGridView_CellValuePushedDescr)
5806         ]
5807         public event DataGridViewCellValueEventHandler CellValuePushed 
5808         {
5809             add 
5810             {
5811                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCELLVALUEPUSHED, value);
5812             }
5813             remove 
5814             {
5815                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLVALUEPUSHED, value);
5816             }
5817         }
5818  
5819         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnAdded"]/*‘ />
5820         [
5821             SRCategory(SR.CatAction),
5822             SRDescription(SR.DataGridView_ColumnAddedDescr)
5823         ]
5824         public event DataGridViewColumnEventHandler ColumnAdded
5825         {
5826             add
5827             {
5828                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNADDED, value);
5829             }
5830             remove
5831             {
5832                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNADDED, value);
5833             }
5834         }
5835  
5836         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnContextMenuStripChanged"]/*‘ />
5837         [
5838             SRCategory(SR.CatPropertyChanged),
5839             SRDescription(SR.DataGridView_ColumnContextMenuStripChangedDescr)
5840         ]
5841         public event DataGridViewColumnEventHandler ColumnContextMenuStripChanged
5842         {
5843             add
5844             {
5845                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNCONTEXTMENUSTRIPCHANGED, value);
5846             }
5847             remove
5848             {
5849                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNCONTEXTMENUSTRIPCHANGED, value);
5850             }
5851         }
5852  
5853         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnDataPropertyNameChanged"]/*‘ />
5854         [
5855             SRCategory(SR.CatPropertyChanged),
5856             SRDescription(SR.DataGridView_ColumnDataPropertyNameChangedDescr)
5857         ]
5858         public event DataGridViewColumnEventHandler ColumnDataPropertyNameChanged
5859         {
5860             add
5861             {
5862                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNDATAPROPERTYNAMECHANGED, value);
5863             }
5864             remove
5865             {
5866                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNDATAPROPERTYNAMECHANGED, value);
5867             }
5868         }
5869  
5870         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnDefaultCellStyleChanged"]/*‘ />
5871         [
5872             SRCategory(SR.CatPropertyChanged),
5873             SRDescription(SR.DataGridView_ColumnDefaultCellStyleChangedDescr)
5874         ]
5875         public event DataGridViewColumnEventHandler ColumnDefaultCellStyleChanged
5876         {
5877             add 
5878             {
5879                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNDEFAULTCELLSTYLECHANGED, value);
5880             }
5881             remove 
5882             {
5883                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNDEFAULTCELLSTYLECHANGED, value);
5884             }
5885         }
5886  
5887         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnDisplayIndexChanged"]/*‘ />
5888         [
5889             SRCategory(SR.CatPropertyChanged),
5890             SRDescription(SR.DataGridView_ColumnDisplayIndexChangedDescr)
5891         ]
5892         public event DataGridViewColumnEventHandler ColumnDisplayIndexChanged 
5893         {
5894             add 
5895             {
5896                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNDISPLAYINDEXCHANGED, value);
5897             }
5898             remove 
5899             {
5900                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNDISPLAYINDEXCHANGED, value);
5901             }
5902         }
5903  
5904         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnDividerDoubleClick"]/*‘ />
5905         [
5906             SRCategory(SR.CatMouse),
5907             SRDescription(SR.DataGridView_ColumnDividerDoubleClickDescr)
5908         ]
5909         public event DataGridViewColumnDividerDoubleClickEventHandler ColumnDividerDoubleClick
5910         {
5911             add
5912             {
5913                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNDIVIDERDOUBLECLICK, value);
5914             }
5915             remove
5916             {
5917                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNDIVIDERDOUBLECLICK, value);
5918             }
5919         }
5920  
5921         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnDividerWidthChanged"]/*‘ />
5922         [
5923             SRCategory(SR.CatPropertyChanged),
5924             SRDescription(SR.DataGridView_ColumnDividerWidthChangedDescr)
5925         ]
5926         public event DataGridViewColumnEventHandler ColumnDividerWidthChanged
5927         {
5928             add 
5929             {
5930                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNDIVIDERWIDTHCHANGED, value);
5931             }
5932             remove 
5933             {
5934                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNDIVIDERWIDTHCHANGED, value);
5935             }
5936         }
5937  
5938         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnHeaderMouseClick"]/*‘ />
5939         [
5940             SRCategory(SR.CatMouse),
5941             SRDescription(SR.DataGridView_ColumnHeaderMouseClickDescr)
5942         ]
5943         public event DataGridViewCellMouseEventHandler ColumnHeaderMouseClick 
5944         {
5945             add 
5946             {
5947                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNHEADERMOUSECLICK, value);
5948             }
5949             remove 
5950             {
5951                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNHEADERMOUSECLICK, value);
5952             }
5953         }
5954  
5955         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnHeaderMouseDoubleClick"]/*‘ />
5956         [
5957             SRCategory(SR.CatMouse), 
5958             SRDescription(SR.DataGridView_ColumnHeaderMouseDoubleClickDescr)
5959         ]
5960         public event DataGridViewCellMouseEventHandler ColumnHeaderMouseDoubleClick
5961         {
5962             add
5963             {
5964                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNHEADERMOUSEDOUBLECLICK, value);
5965             }
5966             remove
5967             {
5968                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNHEADERMOUSEDOUBLECLICK, value);
5969             }
5970         }
5971  
5972         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnHeaderCellChanged"]/*‘ />
5973         [
5974             SRCategory(SR.CatPropertyChanged),
5975             SRDescription(SR.DataGridView_ColumnHeaderCellChangedDescr)
5976         ]
5977         public event DataGridViewColumnEventHandler ColumnHeaderCellChanged 
5978         {
5979             add 
5980             {
5981                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNHEADERCELLCHANGED, value);
5982             }
5983             remove 
5984             {
5985                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNHEADERCELLCHANGED, value);
5986             }
5987         }
5988  
5989         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnMinimumWidthChanged"]/*‘ />
5990         [
5991             SRCategory(SR.CatPropertyChanged),
5992             SRDescription(SR.DataGridView_ColumnMinimumWidthChangedDescr)
5993         ]
5994         public event DataGridViewColumnEventHandler ColumnMinimumWidthChanged 
5995         {
5996             add 
5997             {
5998                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNMINIMUMWIDTHCHANGED, value);
5999             }
6000             remove 
6001             {
6002                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNMINIMUMWIDTHCHANGED, value);
6003             }
6004         }
6005  
6006         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnNameChanged"]/*‘ />
6007         [
6008             SRCategory(SR.CatPropertyChanged),
6009             SRDescription(SR.DataGridView_ColumnNameChangedDescr)
6010         ]
6011         public event DataGridViewColumnEventHandler ColumnNameChanged
6012         {
6013             add 
6014             {
6015                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNNAMECHANGED, value);
6016             }
6017             remove 
6018             {
6019                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNNAMECHANGED, value);
6020             }
6021         }
6022  
6023         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnRemoved"]/*‘ />
6024         [
6025             SRCategory(SR.CatAction),
6026             SRDescription(SR.DataGridView_ColumnRemovedDescr)
6027         ]
6028         public event DataGridViewColumnEventHandler ColumnRemoved
6029         {
6030             add
6031             {
6032                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNREMOVED, value);
6033             }
6034             remove
6035             {
6036                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNREMOVED, value);
6037             }
6038         }
6039  
6040         /*/// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnsDefaultCellStyleChanged"]/*‘ />
6041         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnsDefaultCellStyleChanged"]/*‘ />
6042         public event EventHandler ColumnsDefaultCellStyleChanged
6043         {
6044             add
6045             {
6046                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNSDEFAULTCELLSTYLECHANGED, value);
6047             }
6048             remove
6049             {
6050                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNSDEFAULTCELLSTYLECHANGED, value);
6051             }
6052         }*/
6053  
6054         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnSortModeChanged"]/*‘ />
6055         [
6056             SRCategory(SR.CatBehavior),
6057             SRDescription(SR.DataGridViewColumnSortModeChangedDescr)
6058         ]
6059         public event DataGridViewColumnEventHandler ColumnSortModeChanged
6060         {
6061             add
6062             {
6063                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNSORTMODECHANGED, value);
6064             }
6065             remove
6066             {
6067                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNSORTMODECHANGED, value);
6068             }
6069         }
6070  
6071         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnStateChanged"]/*‘ />
6072         [
6073             SRCategory(SR.CatBehavior),
6074             SRDescription(SR.DataGridView_ColumnStateChangedDescr)
6075         ]
6076         public event DataGridViewColumnStateChangedEventHandler ColumnStateChanged 
6077         {
6078             add 
6079             {
6080                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNSTATECHANGED, value);
6081             }
6082             remove 
6083             {
6084                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNSTATECHANGED, value);
6085             }
6086         }
6087  
6088         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnToolTipTextChanged"]/*‘ />
6089         [
6090             SRCategory(SR.CatPropertyChanged),
6091             SRDescription(SR.DataGridView_ColumnToolTipTextChangedDescr)
6092         ]
6093         public event DataGridViewColumnEventHandler ColumnToolTipTextChanged
6094         {
6095             add
6096             {
6097                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNTOOLTIPTEXTCHANGED, value);
6098             }
6099             remove
6100             {
6101                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNTOOLTIPTEXTCHANGED, value);
6102             }
6103         }
6104  
6105         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.ColumnWidthChanged"]/*‘ />
6106         [
6107             SRCategory(SR.CatAction),
6108             SRDescription(SR.DataGridView_ColumnWidthChangedDescr)
6109         ]
6110         public event DataGridViewColumnEventHandler ColumnWidthChanged 
6111         {
6112             add 
6113             {
6114                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCOLUMNWIDTHCHANGED, value);
6115             }
6116             remove 
6117             {
6118                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCOLUMNWIDTHCHANGED, value);
6119             }
6120         }
6121  
6122         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CurrentCellChanged"]/*‘ />
6123         [
6124             SRCategory(SR.CatAction), 
6125             SRDescription(SR.DataGridView_CurrentCellChangedDescr)
6126         ]
6127         public event EventHandler CurrentCellChanged
6128         {
6129             add
6130             {
6131                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCURRENTCELLCHANGED, value);
6132             }
6133             remove
6134             {
6135                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCURRENTCELLCHANGED, value);
6136             }
6137         }
6138  
6139         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.CurrentCellDirtyStateChanged"]/*‘ />
6140         [
6141             SRCategory(SR.CatBehavior), 
6142             EditorBrowsable(EditorBrowsableState.Advanced),
6143             SRDescription(SR.DataGridView_CurrentCellDirtyStateChangedDescr)
6144         ]
6145         public event EventHandler CurrentCellDirtyStateChanged
6146         {
6147             add
6148             {
6149                 this.Events.AddHandler(EVENT_DATAGRIDVIEWCURRENTCELLDIRTYSTATECHANGED, value);
6150             }
6151             remove
6152             {
6153                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWCURRENTCELLDIRTYSTATECHANGED, value);
6154             }
6155         }
6156  
6157         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.BindingComplete"]/*‘ />
6158         [
6159             SRCategory(SR.CatData), 
6160             SRDescription(SR.DataGridView_DataBindingCompleteDescr)
6161         ]
6162         public event DataGridViewBindingCompleteEventHandler DataBindingComplete
6163         {
6164             add
6165             {
6166                 this.Events.AddHandler(EVENT_DATAGRIDVIEWDATABINDINGCOMPLETE, value);
6167             }
6168             remove
6169             {
6170                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWDATABINDINGCOMPLETE, value);
6171             }
6172         }
6173  
6174         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.DataError"]/*‘ />
6175         [
6176             SRCategory(SR.CatBehavior),
6177             SRDescription(SR.DataGridView_DataErrorDescr)
6178         ]
6179         public event DataGridViewDataErrorEventHandler DataError
6180         {
6181             add 
6182             {
6183                 this.Events.AddHandler(EVENT_DATAGRIDVIEWDATAERROR, value);
6184             }
6185             remove 
6186             {
6187                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWDATAERROR, value);
6188             }
6189         }
6190  
6191         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.DefaultValuesNeeded"]/*‘ />
6192         [
6193             SRCategory(SR.CatData), 
6194             EditorBrowsable(EditorBrowsableState.Advanced),
6195             SRDescription(SR.DataGridView_DefaultValuesNeededDescr)
6196         ]
6197         public event DataGridViewRowEventHandler DefaultValuesNeeded
6198         {
6199             add
6200             {
6201                 this.Events.AddHandler(EVENT_DATAGRIDVIEWDEFAULTVALUESNEEDED, value);
6202             }
6203             remove
6204             {
6205                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWDEFAULTVALUESNEEDED, value);
6206             }
6207         }
6208  
6209         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.EditingControlShowing"]/*‘ />
6210         [
6211             SRCategory(SR.CatAction),
6212             SRDescription(SR.DataGridView_EditingControlShowingDescr)
6213         ]
6214         public event DataGridViewEditingControlShowingEventHandler EditingControlShowing
6215         {
6216             add
6217             {
6218                 this.Events.AddHandler(EVENT_DATAGRIDVIEWEDITINGCONTROLSHOWING, value);
6219             }
6220             remove
6221             {
6222                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWEDITINGCONTROLSHOWING, value);
6223             }
6224         }
6225  
6226         /*
6227         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.KeepNewRow"]/*‘ />
6228         public event QuestionEventHandler KeepNewRow
6229         {
6230             add
6231             {
6232                 this.Events.AddHandler(EVENT_DATAGRIDVIEWKEEPNEWROW, value);
6233             }
6234             remove
6235             {
6236                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWKEEPNEWROW, value);
6237             }
6238         }*/
6239  
6240         /*/// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.NewRowDiscarded"]/*‘ />
6241         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.NewRowDiscarded"]/*‘ />
6242         public event EventHandler NewRowDiscarded
6243         {
6244             add
6245             {
6246                 this.Events.AddHandler(EVENT_DATAGRIDVIEWNEWROWDISCARDED, value);
6247             }
6248             remove
6249             {
6250                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWNEWROWDISCARDED, value);
6251             }
6252         }*/
6253  
6254         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.NewRowNeeded"]/*‘ />
6255         [
6256             SRCategory(SR.CatData),
6257             SRDescription(SR.DataGridView_NewRowNeededDescr)
6258         ]
6259         public event DataGridViewRowEventHandler NewRowNeeded
6260         {
6261             add
6262             {
6263                 this.Events.AddHandler(EVENT_DATAGRIDVIEWNEWROWNEEDED, value);
6264             }
6265             remove
6266             {
6267                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWNEWROWNEEDED, value);
6268             }
6269         }
6270  
6271         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowContextMenuStripChanged"]/*‘ />
6272         [
6273             SRCategory(SR.CatPropertyChanged),
6274             SRDescription(SR.DataGridView_RowContextMenuStripChangedDescr)
6275         ]
6276         public event DataGridViewRowEventHandler RowContextMenuStripChanged
6277         {
6278             add 
6279             {
6280                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWCONTEXTMENUSTRIPCHANGED, value);
6281             }
6282             remove 
6283             {
6284                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWCONTEXTMENUSTRIPCHANGED, value);
6285             }
6286         }
6287  
6288         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowContextMenuStripNeeded"]/*‘ />
6289         [
6290             SRCategory(SR.CatData),
6291             EditorBrowsable(EditorBrowsableState.Advanced),
6292             SRDescription(SR.DataGridView_RowContextMenuStripNeededDescr)
6293         ]
6294         public event DataGridViewRowContextMenuStripNeededEventHandler RowContextMenuStripNeeded
6295         {
6296             add
6297             {
6298                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWCONTEXTMENUSTRIPNEEDED, value);
6299             }
6300             remove
6301             {
6302                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWCONTEXTMENUSTRIPNEEDED, value);
6303             }
6304         }
6305  
6306         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowDefaultCellStyleChanged"]/*‘ />
6307         [
6308             SRCategory(SR.CatPropertyChanged),
6309             SRDescription(SR.DataGridView_RowDefaultCellStyleChangedDescr)
6310         ]
6311         public event DataGridViewRowEventHandler RowDefaultCellStyleChanged 
6312         {
6313             add 
6314             {
6315                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWDEFAULTCELLSTYLECHANGED, value);
6316             }
6317             remove 
6318             {
6319                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWDEFAULTCELLSTYLECHANGED, value);
6320             }
6321         }
6322  
6323         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowDirtyStateNeeded"]/*‘ />
6324         [
6325             SRCategory(SR.CatData),
6326             EditorBrowsable(EditorBrowsableState.Advanced),
6327             SRDescription(SR.DataGridView_RowDirtyStateNeededDescr)
6328         ]
6329         public event QuestionEventHandler RowDirtyStateNeeded
6330         {
6331             add
6332             {
6333                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWDIRTYSTATENEEDED, value);
6334             }
6335             remove
6336             {
6337                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWDIRTYSTATENEEDED, value);
6338             }
6339         }
6340  
6341         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowDividerDoubleClick"]/*‘ />
6342         [
6343             SRCategory(SR.CatMouse),
6344             SRDescription(SR.DataGridView_RowDividerDoubleClickDescr)
6345         ]
6346         public event DataGridViewRowDividerDoubleClickEventHandler RowDividerDoubleClick
6347         {
6348             add
6349             {
6350                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWDIVIDERDOUBLECLICK, value);
6351             }
6352             remove
6353             {
6354                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWDIVIDERDOUBLECLICK, value);
6355             }
6356         }
6357  
6358         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowDividerHeightChanged"]/*‘ />
6359         [
6360             SRCategory(SR.CatAppearance),
6361             SRDescription(SR.DataGridView_RowDividerHeightChangedDescr)
6362         ]
6363         public event DataGridViewRowEventHandler RowDividerHeightChanged
6364         {
6365             add
6366             {
6367                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWDIVIDERHEIGHTCHANGED, value);
6368             }
6369             remove
6370             {
6371                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWDIVIDERHEIGHTCHANGED, value);
6372             }
6373         }
6374  
6375         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowEnter"]/*‘ />
6376         [
6377             SRCategory(SR.CatFocus),
6378             SRDescription(SR.DataGridView_RowEnterDescr)
6379         ]
6380         public event DataGridViewCellEventHandler RowEnter
6381         {
6382             add
6383             {
6384                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWENTER, value);
6385             }
6386             remove
6387             {
6388                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWENTER, value);
6389             }
6390         }
6391  
6392         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowErrorTextChanged"]/*‘ />
6393         [
6394             SRCategory(SR.CatPropertyChanged),
6395             SRDescription(SR.DataGridView_RowErrorTextChangedDescr)
6396         ]
6397         public event DataGridViewRowEventHandler RowErrorTextChanged
6398         {
6399             add
6400             {
6401                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWERRORTEXTCHANGED, value);
6402             }
6403             remove
6404             {
6405                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWERRORTEXTCHANGED, value);
6406             }
6407         }
6408  
6409         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowErrorTextNeeded"]/*‘ />
6410         [
6411             SRCategory(SR.CatData),
6412             EditorBrowsable(EditorBrowsableState.Advanced),
6413             SRDescription(SR.DataGridView_RowErrorTextNeededDescr)
6414         ]
6415         public event DataGridViewRowErrorTextNeededEventHandler RowErrorTextNeeded
6416         {
6417             add
6418             {
6419                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWERRORTEXTNEEDED, value);
6420             }
6421             remove
6422             {
6423                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWERRORTEXTNEEDED, value);
6424             }
6425         }
6426  
6427         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowHeaderMouseClick"]/*‘ />
6428         [
6429             SRCategory(SR.CatMouse),
6430             SRDescription(SR.DataGridView_RowHeaderMouseClickDescr)
6431         ]
6432         public event DataGridViewCellMouseEventHandler RowHeaderMouseClick 
6433         {
6434             add 
6435             {
6436                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWHEADERMOUSECLICK, value);
6437             }
6438             remove 
6439             {
6440                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWHEADERMOUSECLICK, value);
6441             }
6442         }
6443  
6444         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowHeaderMouseDoubleClick"]/*‘ />
6445         [
6446             SRCategory(SR.CatMouse),
6447             SRDescription(SR.DataGridView_RowHeaderMouseDoubleClickDescr)
6448         ]
6449         public event DataGridViewCellMouseEventHandler RowHeaderMouseDoubleClick 
6450         {
6451             add 
6452             {
6453                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWHEADERMOUSEDOUBLECLICK, value);
6454             }
6455             remove 
6456             {
6457                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWHEADERMOUSEDOUBLECLICK, value);
6458             }
6459         }
6460  
6461         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowHeaderCellChanged"]/*‘ />
6462         [
6463             SRCategory(SR.CatPropertyChanged),
6464             SRDescription(SR.DataGridView_RowHeaderCellChangedDescr)
6465         ]
6466         public event DataGridViewRowEventHandler RowHeaderCellChanged 
6467         {
6468             add 
6469             {
6470                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWHEADERCELLCHANGED, value);
6471             }
6472             remove 
6473             {
6474                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWHEADERCELLCHANGED, value);
6475             }
6476         }
6477  
6478         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowHeightChanged"]/*‘ />
6479         [
6480             SRCategory(SR.CatPropertyChanged),
6481             SRDescription(SR.DataGridView_RowHeightChangedDescr)
6482         ]
6483         public event DataGridViewRowEventHandler RowHeightChanged 
6484         {
6485             add 
6486             {
6487                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWHEIGHTCHANGED, value);
6488             }
6489             remove 
6490             {
6491                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWHEIGHTCHANGED, value);
6492             }
6493         }
6494  
6495         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowHeightInfoNeeded"]/*‘ />
6496         [
6497             SRCategory(SR.CatData),
6498             EditorBrowsable(EditorBrowsableState.Advanced),
6499             SRDescription(SR.DataGridView_RowHeightInfoNeededDescr)
6500         ]
6501         public event DataGridViewRowHeightInfoNeededEventHandler RowHeightInfoNeeded
6502         {
6503             add
6504             {
6505                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWHEIGHTINFONEEDED, value);
6506             }
6507             remove
6508             {
6509                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWHEIGHTINFONEEDED, value);
6510             }
6511         }
6512  
6513         internal DataGridViewRowHeightInfoNeededEventArgs RowHeightInfoNeededEventArgs
6514         {
6515             get
6516             {
6517                 if (this.dgvrhine == null)
6518                 {
6519                     this.dgvrhine = new DataGridViewRowHeightInfoNeededEventArgs();
6520                 }
6521                 return this.dgvrhine;
6522             }
6523         }
6524  
6525         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowHeightInfoPushed"]/*‘ />
6526         [
6527             SRCategory(SR.CatData),
6528             EditorBrowsable(EditorBrowsableState.Advanced),
6529             SRDescription(SR.DataGridView_RowHeightInfoPushedDescr)
6530         ]
6531         public event DataGridViewRowHeightInfoPushedEventHandler RowHeightInfoPushed
6532         {
6533             add
6534             {
6535                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWHEIGHTINFOPUSHED, value);
6536             }
6537             remove
6538             {
6539                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWHEIGHTINFOPUSHED, value);
6540             }
6541         }
6542  
6543         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowLeave"]/*‘ />
6544         [
6545             SRCategory(SR.CatFocus),
6546             SRDescription(SR.DataGridView_RowLeaveDescr)
6547         ]
6548         public event DataGridViewCellEventHandler RowLeave
6549         {
6550             add
6551             {
6552                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWLEAVE, value);
6553             }
6554             remove
6555             {
6556                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWLEAVE, value);
6557             }
6558         }
6559  
6560         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowMinimumHeightChanged"]/*‘ />
6561         [
6562             SRCategory(SR.CatPropertyChanged),
6563             SRDescription(SR.DataGridView_RowMinimumHeightChangedDescr)
6564         ]
6565         public event DataGridViewRowEventHandler RowMinimumHeightChanged 
6566         {
6567             add 
6568             {
6569                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWMINIMUMHEIGHTCHANGED, value);
6570             }
6571             remove 
6572             {
6573                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWMINIMUMHEIGHTCHANGED, value);
6574             }
6575         }
6576  
6577         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowPostPaint"]/*‘ />
6578         [
6579             SRCategory(SR.CatDisplay), 
6580             SRDescription(SR.DataGridView_RowPostPaintDescr)
6581         ]
6582         public event DataGridViewRowPostPaintEventHandler RowPostPaint
6583         {
6584             add
6585             {
6586                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWPOSTPAINT, value);
6587             }
6588             remove
6589             {
6590                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWPOSTPAINT, value);
6591             }
6592         }
6593  
6594         internal DataGridViewRowPostPaintEventArgs RowPostPaintEventArgs
6595         {
6596             get
6597             {
6598                 if (this.dgvrpope == null)
6599                 {
6600                     this.dgvrpope = new DataGridViewRowPostPaintEventArgs(this);
6601                 }
6602                 return this.dgvrpope;
6603             }
6604         }
6605  
6606         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowPrePaint"]/*‘ />
6607         [
6608             SRCategory(SR.CatDisplay), 
6609             SRDescription(SR.DataGridView_RowPrePaintDescr)
6610         ]
6611         public event DataGridViewRowPrePaintEventHandler RowPrePaint
6612         {
6613             add
6614             {
6615                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWPREPAINT, value);
6616             }
6617             remove
6618             {
6619                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWPREPAINT, value);
6620             }
6621         }
6622  
6623         internal DataGridViewRowPrePaintEventArgs RowPrePaintEventArgs
6624         {
6625             get
6626             {
6627                 if (this.dgvrprpe == null)
6628                 {
6629                     this.dgvrprpe = new DataGridViewRowPrePaintEventArgs(this);
6630                 }
6631                 return this.dgvrprpe;
6632             }
6633         }
6634  
6635         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowsAdded"]/*‘ />
6636         [
6637             SRCategory(SR.CatAction), 
6638             SRDescription(SR.DataGridView_RowsAddedDescr)
6639         ]
6640         public event DataGridViewRowsAddedEventHandler RowsAdded
6641         {
6642             add
6643             {
6644                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWSADDED, value);
6645             }
6646             remove
6647             {
6648                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWSADDED, value);
6649             }
6650         }
6651  
6652         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowsRemoved"]/*‘ />
6653         [
6654             SRCategory(SR.CatAction),
6655             SRDescription(SR.DataGridView_RowsRemovedDescr)
6656         ]
6657         public event DataGridViewRowsRemovedEventHandler RowsRemoved
6658         {
6659             add
6660             {
6661                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWSREMOVED, value);
6662             }
6663             remove
6664             {
6665                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWSREMOVED, value);
6666             }
6667         }
6668  
6669         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowStateChanged"]/*‘ />
6670         [
6671             SRCategory(SR.CatBehavior),
6672             SRDescription(SR.DataGridView_RowStateChangedDescr)
6673         ]
6674         public event DataGridViewRowStateChangedEventHandler RowStateChanged 
6675         {
6676             add 
6677             {
6678                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWSTATECHANGED, value);
6679             }
6680             remove 
6681             {
6682                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWSTATECHANGED, value);
6683             }
6684         }
6685  
6686         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowUnshared"]/*‘ />
6687         [
6688             SRCategory(SR.CatBehavior),
6689             EditorBrowsable(EditorBrowsableState.Advanced),
6690             SRDescription(SR.DataGridView_RowUnsharedDescr)
6691         ] 
6692         public event DataGridViewRowEventHandler RowUnshared 
6693         {
6694             add 
6695             {
6696                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWUNSHARED, value);
6697             }
6698             remove 
6699             {
6700                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWUNSHARED, value);
6701             }
6702         }
6703  
6704         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowValidated"]/*‘ />
6705         [
6706             SRCategory(SR.CatFocus),
6707             SRDescription(SR.DataGridView_RowValidatedDescr)
6708         ]
6709         public event DataGridViewCellEventHandler RowValidated
6710         {
6711             add
6712             {
6713                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWVALIDATED, value);
6714             }
6715             remove
6716             {
6717                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWVALIDATED, value);
6718             }
6719         }
6720  
6721         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.RowValidating"]/*‘ />
6722         [
6723             SRCategory(SR.CatFocus),
6724             SRDescription(SR.DataGridView_RowValidatingDescr)
6725         ]
6726         public event DataGridViewCellCancelEventHandler RowValidating
6727         {
6728             add
6729             {
6730                 this.Events.AddHandler(EVENT_DATAGRIDVIEWROWVALIDATING, value);
6731             }
6732             remove
6733             {
6734                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWROWVALIDATING, value);
6735             }
6736         }
6737  
6738         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.Scroll"]/*‘ />
6739         [
6740             SRCategory(SR.CatAction), 
6741             SRDescription(SR.DataGridView_ScrollDescr)
6742         ]
6743         public event ScrollEventHandler Scroll
6744         {
6745             add
6746             {
6747                 this.Events.AddHandler(EVENT_DATAGRIDVIEWSCROLL, value);
6748             }
6749             remove
6750             {
6751                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWSCROLL, value);
6752             }
6753         }
6754  
6755         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.SelectionChanged"]/*‘ />
6756         [
6757             SRCategory(SR.CatAction),
6758             SRDescription(SR.DataGridView_SelectionChangedDescr)
6759         ]
6760         public event EventHandler SelectionChanged
6761         {
6762             add
6763             {
6764                 this.Events.AddHandler(EVENT_DATAGRIDVIEWSELECTIONCHANGED, value);
6765             }
6766             remove 
6767             {
6768                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWSELECTIONCHANGED, value);
6769             }
6770         }
6771  
6772         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.SortCompare"]/*‘ />
6773         [
6774             SRCategory(SR.CatData),
6775             EditorBrowsable(EditorBrowsableState.Advanced),
6776             SRDescription(SR.DataGridView_SortCompareDescr)
6777         ]
6778         public event DataGridViewSortCompareEventHandler SortCompare
6779         {
6780             add
6781             {
6782                 this.Events.AddHandler(EVENT_DATAGRIDVIEWSORTCOMPARE, value);
6783             }
6784             remove
6785             {
6786                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWSORTCOMPARE, value);
6787             }
6788         }
6789  
6790         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.Sorted"]/*‘ />
6791         [
6792             SRCategory(SR.CatData),
6793             SRDescription(SR.DataGridView_SortedDescr)
6794         ]
6795         public event EventHandler Sorted
6796         {
6797             add
6798             {
6799                 this.Events.AddHandler(EVENT_DATAGRIDVIEWSORTED, value);
6800             }
6801             remove
6802             {
6803                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWSORTED, value);
6804             }
6805         }
6806  
6807         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.StyleChanged"]/*‘ />
6808         /// <internalonly/>
6809         [
6810             Browsable(false), 
6811             EditorBrowsable(EditorBrowsableState.Never)
6812         ]
6813         new public event EventHandler StyleChanged
6814         {
6815             add
6816             {
6817                 base.StyleChanged += value;
6818             }
6819             remove
6820             {
6821                 base.StyleChanged -= value;
6822             }
6823         }
6824  
6825         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.UserAddedRow"]/*‘ />
6826         [
6827             SRCategory(SR.CatAction),
6828             SRDescription(SR.DataGridView_UserAddedRowDescr)
6829         ]
6830         public event DataGridViewRowEventHandler UserAddedRow
6831         {
6832             add
6833             {
6834                 this.Events.AddHandler(EVENT_DATAGRIDVIEWUSERADDEDROW, value);
6835             }
6836             remove
6837             {
6838                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWUSERADDEDROW, value);
6839             }
6840         }
6841  
6842         /*/// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.UserAddingRow"]/*‘ />
6843         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.UserAddingRow"]/*‘ />
6844         public event DataGridViewRowCancelEventHandler UserAddingRow
6845         {
6846             add
6847             {
6848                 this.Events.AddHandler(EVENT_DATAGRIDVIEWUSERADDINGROW, value);
6849             }
6850             remove
6851             {
6852                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWUSERADDINGROW, value);
6853             }
6854         }*/
6855  
6856         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.UserDeletedRow"]/*‘ />
6857         [
6858             SRCategory(SR.CatAction),
6859             SRDescription(SR.DataGridView_UserDeletedRowDescr)
6860         ]
6861         public event DataGridViewRowEventHandler UserDeletedRow
6862         {
6863             add
6864             {
6865                 this.Events.AddHandler(EVENT_DATAGRIDVIEWUSERDELETEDROW, value);
6866             }
6867             remove
6868             {
6869                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWUSERDELETEDROW, value);
6870             }
6871         }
6872  
6873         /// <include file=‘doc\DataGridView.uex‘ path=‘docs/doc[@for="DataGridView.UserDeletingRow"]/*‘ />
6874         [
6875             SRCategory(SR.CatAction),
6876             SRDescription(SR.DataGridView_UserDeletingRowDescr)
6877         ]
6878         public event DataGridViewRowCancelEventHandler UserDeletingRow
6879         {
6880             add
6881             {
6882                 this.Events.AddHandler(EVENT_DATAGRIDVIEWUSERDELETINGROW, value);
6883             }
6884             remove
6885             {
6886                 this.Events.RemoveHandler(EVENT_DATAGRIDVIEWUSERDELETINGROW, value);
6887             }
6888         }
6889  
6890         ////////////////////////
6891         //                    //
6892         // ISupportInitialize //
6893         //                    //
6894         ////////////////////////
6895         [
6896             SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes") // VSWhidbey 405004
6897         ]
6898         void ISupportInitialize.BeginInit()
6899         {
6900             if (this.dataGridViewState2[DATAGRIDVIEWSTATE2_initializing])
6901             {
6902                 throw new InvalidOperationException(SR.GetString(SR.DataGridViewBeginInit));
6903             }
6904  
6905             this.dataGridViewState2[DATAGRIDVIEWSTATE2_initializing] = true;
6906         }
6907  
6908         [
6909             SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes") // VSWhidbey 405004
6910         ]
6911         void ISupportInitialize.EndInit()
6912         {
6913             this.dataGridViewState2[DATAGRIDVIEWSTATE2_initializing] = false;
6914  
6915             foreach (DataGridViewColumn dataGridViewColumn in this.Columns)
6916             {
6917                 if (dataGridViewColumn.Frozen &&
6918                     dataGridViewColumn.Visible &&
6919                     dataGridViewColumn.InheritedAutoSizeMode == DataGridViewAutoSizeColumnMode.Fill)
6920                 {
6921                     dataGridViewColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
6922                 }
6923             }
6924  
6925             DataGridViewSelectionMode selectionMode = this.SelectionMode;
6926             if (selectionMode == DataGridViewSelectionMode.FullColumnSelect || selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect)
6927             {
6928                 foreach (DataGridViewColumn dataGridViewColumn in this.Columns)
6929                 {
6930                     if (dataGridViewColumn.SortMode == DataGridViewColumnSortMode.Automatic)
6931                     {
6932                         // Resetting SelectionMode to its acceptable default value. We don‘t want the control to ever end up in an invalid state.
6933                         this.SelectionMode = defaultSelectionMode; // DataGridViewSelectionMode.RowHeaderSelect
6934                         throw new InvalidOperationException(SR.GetString(SR.DataGridView_SelectionModeReset, 
6935                                                                          SR.GetString(SR.DataGridView_SelectionModeAndSortMode*, (selectionMode).ToString()), 
6936                                                                          (defaultSelectionMode).ToString()));
6937                     }
6938                 }
6939             }
6940         }
6941  
6942         /* INTERNAL ENUMERATIONS */
6943  
6944         internal enum DataGridViewHitTestTypeInternal 
6945         {
6946             None,
6947             Cell,
6948             ColumnHeader,
6949             RowHeader,
6950             ColumnResizeLeft,
6951             ColumnResizeRight,
6952             RowResizeTop,
6953             RowResizeBottom,
6954             FirstColumnHeaderLeft,
6955             TopLeftHeader,
6956             TopLeftHeaderResizeLeft,
6957             TopLeftHeaderResizeRight,
6958             TopLeftHeaderResizeTop,
6959             TopLeftHeaderResizeBottom,
6960             ColumnHeadersResizeBottom,
6961             ColumnHeadersResizeTop,
6962             RowHeadersResizeRight,
6963             RowHeadersResizeLeft,
6964             ColumnHeaderLeft,
6965             ColumnHeaderRight
6966         }
6967  
6968         internal enum DataGridViewValidateCellInternal
6969         {
6970             Never,
6971             Always,
6972             WhenChanged
6973         }
6974  
6975         private enum DataGridViewMouseEvent
6976         {
6977             Click,
6978             DoubleClick,
6979             MouseClick,
6980             MouseDoubleClick,
6981             MouseDown,
6982             MouseUp,
6983             MouseMove
6984         }
6985  
6986         private struct MouseClickInfo
6987         {
6988             public MouseButtons button;
6989             public long timeStamp;
6990             public int x;
6991             public int y;
6992             public int col;
6993             public int row;
6994         }
6995     }
6996 }
6997 Document OutlineProject ExplorerNamespace Explorer
View Code

 

System.Windows.Forms

上一篇:Echart可视化学习(七)


下一篇:云计算!STP生成树!