1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
23 // Pedro MartÃnez Juliá <pedromj@gmail.com>
24 // Ivan N. Zlatev <contact@i-nz.net>
30 using System.ComponentModel;
31 using System.Runtime.InteropServices;
33 using System.Reflection;
34 using System.Collections;
36 using System.Collections.Generic;
38 namespace System.Windows.Forms {
40 [ComVisibleAttribute(true)]
41 [ClassInterfaceAttribute(ClassInterfaceType.AutoDispatch)]
42 [Designer("System.Windows.Forms.Design.DataGridViewDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
43 [Editor("System.Windows.Forms.Design.DataGridViewComponentEditor, " + Consts.AssemblySystem_Design, typeof (System.ComponentModel.ComponentEditor))]
44 [ComplexBindingProperties ("DataSource", "DataMember")]
45 [DefaultEvent ("CellContentClick")]
46 [Docking (DockingBehavior.Ask)]
47 public class DataGridView : Control, ISupportInitialize, IBindableComponent, IDropTarget
50 private DataGridViewAdvancedBorderStyle adjustedTopLeftHeaderBorderStyle;
51 private DataGridViewAdvancedBorderStyle advancedCellBorderStyle;
52 private DataGridViewAdvancedBorderStyle advancedColumnHeadersBorderStyle;
53 private DataGridViewAdvancedBorderStyle advancedRowHeadersBorderStyle;
54 private bool allowUserToAddRows;
55 private bool allowUserToDeleteRows;
56 private bool allowUserToOrderColumns;
57 private bool allowUserToResizeColumns;
58 private bool allowUserToResizeRows;
59 private DataGridViewCellStyle alternatingRowsDefaultCellStyle;
60 private Point anchor_cell;
61 private bool autoGenerateColumns;
62 private bool autoSize;
63 private DataGridViewAutoSizeColumnsMode autoSizeColumnsMode;
64 private DataGridViewAutoSizeRowsMode autoSizeRowsMode;
65 private Color backColor;
66 private Color backgroundColor;
67 private Image backgroundImage;
68 private BorderStyle borderStyle;
69 private DataGridViewCellBorderStyle cellBorderStyle;
70 private DataGridViewClipboardCopyMode clipboardCopyMode;
71 private DataGridViewHeaderBorderStyle columnHeadersBorderStyle;
72 private DataGridViewCellStyle columnHeadersDefaultCellStyle;
73 private int columnHeadersHeight;
74 private DataGridViewColumnHeadersHeightSizeMode columnHeadersHeightSizeMode;
75 private bool columnHeadersVisible;
76 private DataGridViewColumnCollection columns;
77 private DataGridViewCell currentCell;
78 private Point currentCellAddress;
79 private DataGridViewRow currentRow;
80 private string dataMember;
81 private object dataSource;
82 private DataGridViewCellStyle defaultCellStyle;
83 //private Control editingControl;
84 private DataGridViewEditMode editMode;
85 private bool enableHeadersVisualStyles = true;
86 private DataGridViewCell firstDisplayedCell;
87 private int firstDisplayedScrollingColumnHiddenWidth;
88 private int firstDisplayedScrollingColumnIndex;
89 private int firstDisplayedScrollingRowIndex;
90 private Color gridColor = Color.FromKnownColor(KnownColor.ControlDark);
91 private int horizontalScrollingOffset;
92 private DataGridViewCell hover_cell = null;
93 private bool isCurrentCellDirty;
94 //private bool isCurrentRowDirty;
95 private bool multiSelect;
96 private bool readOnly;
97 private DataGridViewHeaderBorderStyle rowHeadersBorderStyle;
98 private DataGridViewCellStyle rowHeadersDefaultCellStyle;
99 private bool rowHeadersVisible;
100 private int rowHeadersWidth;
101 private DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode;
102 private DataGridViewRowCollection rows;
103 private DataGridViewCellStyle rowsDefaultCellStyle;
104 private DataGridViewRow rowTemplate;
105 private ScrollBars scrollBars;
106 private DataGridViewSelectionMode selectionMode;
107 private bool showCellErrors;
108 private bool showCellToolTips;
109 private bool showEditingIcon;
110 private bool showRowErrors;
111 private DataGridViewColumn sortedColumn = null;
112 private SortOrder sortOrder;
113 private bool standardTab;
114 private DataGridViewHeaderCell topLeftHeaderCell;
115 private Cursor userSetCursor;
116 private int verticalScrollingOffset;
117 private bool virtualMode;
118 private HScrollBar horizontalScrollBar;
119 private VScrollBar verticalScrollBar;
120 private Control editingControl;
121 private bool new_row_commited = true;
122 private bool is_autogenerating_columns = false;
123 private bool in_binding_context_changed = false;
125 // These are used to implement selection behaviour with SHIFT pressed.
126 private int selected_row = -1;
127 private int selected_column = -1;
129 // Stuff for error Tooltips
130 private Timer tooltip_timer;
131 private ToolTip tooltip_window;
132 private DataGridViewCell tooltip_currently_showing;
134 private DataGridViewSelectedRowCollection selected_rows;
135 private DataGridViewSelectedColumnCollection selected_columns;
136 private DataGridViewRow editing_row;
138 private int gridWidth;
139 private int gridHeight;
141 DataGridViewHeaderCell pressed_header_cell;
142 DataGridViewHeaderCell entered_header_cell;
144 // For column/row resizing via mouse
145 private bool column_resize_active = false;
146 private bool row_resize_active = false;
147 private int resize_band = -1;
148 private int resize_band_start = 0;
149 private int resize_band_delta = 0;
151 public DataGridView ()
153 SetStyle (ControlStyles.Opaque, true);
154 //SetStyle (ControlStyles.UserMouse, true);
155 SetStyle (ControlStyles.OptimizedDoubleBuffer, true);
157 adjustedTopLeftHeaderBorderStyle = new DataGridViewAdvancedBorderStyle();
158 adjustedTopLeftHeaderBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
159 advancedCellBorderStyle = new DataGridViewAdvancedBorderStyle();
160 advancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
161 advancedColumnHeadersBorderStyle = new DataGridViewAdvancedBorderStyle();
162 advancedColumnHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
163 advancedRowHeadersBorderStyle = new DataGridViewAdvancedBorderStyle();
164 advancedRowHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
165 alternatingRowsDefaultCellStyle = new DataGridViewCellStyle();
166 allowUserToAddRows = true;
167 allowUserToDeleteRows = true;
168 allowUserToOrderColumns = false;
169 allowUserToResizeColumns = true;
170 allowUserToResizeRows = true;
171 autoGenerateColumns = true;
172 autoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
173 autoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
174 backColor = Control.DefaultBackColor;
175 backgroundColor = SystemColors.AppWorkspace;
176 borderStyle = BorderStyle.FixedSingle;
177 cellBorderStyle = DataGridViewCellBorderStyle.Single;
178 clipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithAutoHeaderText;
179 columnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
180 columnHeadersDefaultCellStyle = new DataGridViewCellStyle();
181 columnHeadersDefaultCellStyle.BackColor = SystemColors.Control;
182 columnHeadersDefaultCellStyle.ForeColor = SystemColors.WindowText;
183 columnHeadersDefaultCellStyle.SelectionBackColor = SystemColors.Highlight;
184 columnHeadersDefaultCellStyle.SelectionForeColor = SystemColors.HighlightText;
185 columnHeadersDefaultCellStyle.Font = this.Font;
186 columnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
187 columnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.True;
188 columnHeadersHeight = 23;
189 columnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
190 columnHeadersVisible = true;
191 columns = CreateColumnsInstance();
192 columns.CollectionChanged += OnColumnCollectionChanged;
193 dataMember = String.Empty;
194 defaultCellStyle = new DataGridViewCellStyle();
195 defaultCellStyle.BackColor = SystemColors.Window;
196 defaultCellStyle.ForeColor = SystemColors.ControlText;
197 defaultCellStyle.SelectionBackColor = SystemColors.Highlight;
198 defaultCellStyle.SelectionForeColor = SystemColors.HighlightText;
199 defaultCellStyle.Font = this.Font;
200 defaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
201 defaultCellStyle.WrapMode = DataGridViewTriState.False;
202 editMode = DataGridViewEditMode.EditOnKeystrokeOrF2;
203 firstDisplayedScrollingColumnHiddenWidth = 0;
204 isCurrentCellDirty = false;
207 rowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
208 rowHeadersDefaultCellStyle = (DataGridViewCellStyle) columnHeadersDefaultCellStyle.Clone ();
209 rowHeadersVisible = true;
210 rowHeadersWidth = 41;
211 rowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing;
212 rows = CreateRowsInstance();
213 rowsDefaultCellStyle = new DataGridViewCellStyle();
214 selectionMode = DataGridViewSelectionMode.RowHeaderSelect;
215 showCellErrors = true;
216 showEditingIcon = true;
217 userSetCursor = Cursor.Current;
220 horizontalScrollBar = new HScrollBar();
221 horizontalScrollBar.Scroll += OnHScrollBarScroll;
222 horizontalScrollBar.Visible = false;
224 verticalScrollBar = new VScrollBar();
225 verticalScrollBar.Scroll += OnVScrollBarScroll;
226 verticalScrollBar.Visible = false;
228 Controls.AddRange (new Control[] {horizontalScrollBar, verticalScrollBar});
231 void ISupportInitialize.BeginInit ()
235 void ISupportInitialize.EndInit ()
242 [EditorBrowsable (EditorBrowsableState.Advanced)]
243 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
244 public virtual DataGridViewAdvancedBorderStyle AdjustedTopLeftHeaderBorderStyle {
245 get { return adjustedTopLeftHeaderBorderStyle; }
249 [EditorBrowsable (EditorBrowsableState.Advanced)]
250 public DataGridViewAdvancedBorderStyle AdvancedCellBorderStyle {
251 get { return advancedCellBorderStyle; }
255 [EditorBrowsable (EditorBrowsableState.Advanced)]
256 public DataGridViewAdvancedBorderStyle AdvancedColumnHeadersBorderStyle {
257 get { return advancedColumnHeadersBorderStyle; }
261 [EditorBrowsable (EditorBrowsableState.Advanced)]
262 public DataGridViewAdvancedBorderStyle AdvancedRowHeadersBorderStyle {
263 get { return advancedRowHeadersBorderStyle; }
266 [DefaultValue (true)]
267 public bool AllowUserToAddRows {
268 get { return allowUserToAddRows; }
270 if (allowUserToAddRows != value) {
271 allowUserToAddRows = value;
272 OnAllowUserToAddRowsChanged(EventArgs.Empty);
273 PrepareEditingRow (false, false);
279 [DefaultValue (true)]
280 public bool AllowUserToDeleteRows {
281 get { return allowUserToDeleteRows; }
283 if (allowUserToDeleteRows != value) {
284 allowUserToDeleteRows = value;
285 OnAllowUserToDeleteRowsChanged(EventArgs.Empty);
290 [DefaultValue (false)]
291 public bool AllowUserToOrderColumns {
292 get { return allowUserToOrderColumns; }
294 if (allowUserToOrderColumns != value) {
295 allowUserToOrderColumns = value;
296 OnAllowUserToOrderColumnsChanged(EventArgs.Empty);
301 [DefaultValue (true)]
302 public bool AllowUserToResizeColumns {
303 get { return allowUserToResizeColumns; }
305 if (allowUserToResizeColumns != value) {
306 allowUserToResizeColumns = value;
307 OnAllowUserToResizeColumnsChanged(EventArgs.Empty);
312 [DefaultValue (true)]
313 public bool AllowUserToResizeRows {
314 get { return allowUserToResizeRows; }
316 if (allowUserToResizeRows != value) {
317 allowUserToResizeRows = value;
318 OnAllowUserToResizeRowsChanged(EventArgs.Empty);
323 public DataGridViewCellStyle AlternatingRowsDefaultCellStyle {
324 get { return alternatingRowsDefaultCellStyle; }
326 if (alternatingRowsDefaultCellStyle != value) {
327 alternatingRowsDefaultCellStyle = value;
328 OnAlternatingRowsDefaultCellStyleChanged(EventArgs.Empty);
335 [EditorBrowsable (EditorBrowsableState.Advanced)]
336 [DefaultValue (true)]
337 public bool AutoGenerateColumns {
338 get { return autoGenerateColumns; }
340 if (autoGenerateColumns != value) {
341 autoGenerateColumns = value;
342 OnAutoGenerateColumnsChanged(EventArgs.Empty);
347 public override bool AutoSize {
348 get { return autoSize; }
350 if (autoSize != value) {
352 //OnAutoSizeChanged(EventArgs.Empty);
357 [DefaultValue (DataGridViewAutoSizeColumnsMode.None)]
358 public DataGridViewAutoSizeColumnsMode AutoSizeColumnsMode {
359 get { return autoSizeColumnsMode; }
361 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeColumnsMode), value)) {
362 throw new InvalidEnumArgumentException("Value is not valid DataGridViewAutoSizeColumnsMode.");
364 if (value == DataGridViewAutoSizeColumnsMode.ColumnHeader && columnHeadersVisible == false) {
365 foreach (DataGridViewColumn col in columns) {
366 if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet) {
367 throw new InvalidOperationException("Cant set this property to ColumnHeader in this DataGridView.");
371 if (value == DataGridViewAutoSizeColumnsMode.Fill) {
372 foreach (DataGridViewColumn col in columns) {
373 if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet) {
375 throw new InvalidOperationException("Cant set this property to Fill in this DataGridView.");
381 autoSizeColumnsMode = value;
382 AutoResizeColumns (value);
387 [DefaultValue (DataGridViewAutoSizeRowsMode.None)]
388 public DataGridViewAutoSizeRowsMode AutoSizeRowsMode {
389 get { return autoSizeRowsMode; }
391 if (autoSizeRowsMode != value) {
392 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeRowsMode), value)) {
393 throw new InvalidEnumArgumentException("Value is not valid DataGridViewRowsMode.");
395 if ((value == DataGridViewAutoSizeRowsMode.AllHeaders || value == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && rowHeadersVisible == false) {
396 throw new InvalidOperationException("Cant set this property to AllHeaders or DisplayedHeaders in this DataGridView.");
398 autoSizeRowsMode = value;
400 if (value == DataGridViewAutoSizeRowsMode.None)
401 foreach (DataGridViewRow row in Rows)
402 row.ResetToExplicitHeight ();
404 AutoResizeRows (value);
406 OnAutoSizeRowsModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
408 ////////////////////////////////////////////////////////////////
414 [EditorBrowsable (EditorBrowsableState.Never)]
415 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
416 public override Color BackColor {
417 get { return backColor; }
419 if (backColor != value) {
421 OnBackColorChanged(EventArgs.Empty);
426 public Color BackgroundColor {
427 get { return backgroundColor; }
429 if (backgroundColor != value) {
430 if (value == Color.Empty) {
431 throw new ArgumentException("Cant set an Empty color.");
433 backgroundColor = value;
434 OnBackgroundColorChanged(EventArgs.Empty);
440 [EditorBrowsable (EditorBrowsableState.Never)]
441 public override Image BackgroundImage {
442 get { return backgroundImage; }
444 if (backgroundImage != value) {
445 backgroundImage = value;
446 OnBackgroundImageChanged(EventArgs.Empty);
452 [EditorBrowsable (EditorBrowsableState.Never)]
453 public override ImageLayout BackgroundImageLayout {
454 get { return base.BackgroundImageLayout; }
455 set { base.BackgroundImageLayout = value; }
458 [DefaultValue (BorderStyle.FixedSingle)]
459 public BorderStyle BorderStyle {
460 get { return borderStyle; }
462 if (borderStyle != value) {
463 if (!Enum.IsDefined(typeof(BorderStyle), value)) {
464 throw new InvalidEnumArgumentException("Invalid border style.");
467 OnBorderStyleChanged(EventArgs.Empty);
472 internal int BorderWidth {
474 switch (BorderStyle) {
475 case BorderStyle.Fixed3D:
477 case BorderStyle.FixedSingle:
479 case BorderStyle.None:
487 [DefaultValue (DataGridViewCellBorderStyle.Single)]
488 public DataGridViewCellBorderStyle CellBorderStyle {
489 get { return cellBorderStyle; }
491 if (cellBorderStyle != value) {
492 if (value == DataGridViewCellBorderStyle.Custom)
493 throw new ArgumentException ("CellBorderStyle cannot be set to Custom.");
495 cellBorderStyle = value;
497 DataGridViewAdvancedBorderStyle border = new DataGridViewAdvancedBorderStyle ();
499 switch (cellBorderStyle) {
500 case DataGridViewCellBorderStyle.Single:
501 border.All = DataGridViewAdvancedCellBorderStyle.Single;
503 case DataGridViewCellBorderStyle.Raised:
504 case DataGridViewCellBorderStyle.RaisedVertical:
505 border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
506 border.Top = DataGridViewAdvancedCellBorderStyle.None;
507 border.Left = DataGridViewAdvancedCellBorderStyle.Outset;
508 border.Right = DataGridViewAdvancedCellBorderStyle.Outset;
510 case DataGridViewCellBorderStyle.Sunken:
511 border.All = DataGridViewAdvancedCellBorderStyle.Inset;
513 case DataGridViewCellBorderStyle.None:
514 border.All = DataGridViewAdvancedCellBorderStyle.None;
516 case DataGridViewCellBorderStyle.SingleVertical:
517 border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
518 border.Top = DataGridViewAdvancedCellBorderStyle.None;
519 border.Left = DataGridViewAdvancedCellBorderStyle.None;
520 border.Right = DataGridViewAdvancedCellBorderStyle.Single;
522 case DataGridViewCellBorderStyle.SunkenVertical:
523 border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
524 border.Top = DataGridViewAdvancedCellBorderStyle.None;
525 border.Left = DataGridViewAdvancedCellBorderStyle.Inset;
526 border.Right = DataGridViewAdvancedCellBorderStyle.Inset;
528 case DataGridViewCellBorderStyle.SingleHorizontal:
529 case DataGridViewCellBorderStyle.SunkenHorizontal:
530 border.Bottom = DataGridViewAdvancedCellBorderStyle.Inset;
531 border.Top = DataGridViewAdvancedCellBorderStyle.Inset;
532 border.Left = DataGridViewAdvancedCellBorderStyle.None;
533 border.Right = DataGridViewAdvancedCellBorderStyle.None;
535 case DataGridViewCellBorderStyle.RaisedHorizontal:
536 border.Bottom = DataGridViewAdvancedCellBorderStyle.Outset;
537 border.Top = DataGridViewAdvancedCellBorderStyle.Outset;
538 border.Left = DataGridViewAdvancedCellBorderStyle.None;
539 border.Right = DataGridViewAdvancedCellBorderStyle.None;
543 advancedCellBorderStyle = border;
545 OnCellBorderStyleChanged (EventArgs.Empty);
551 [DefaultValue (DataGridViewClipboardCopyMode.EnableWithAutoHeaderText)]
552 public DataGridViewClipboardCopyMode ClipboardCopyMode {
553 get { return clipboardCopyMode; }
554 set { clipboardCopyMode = value; }
558 [EditorBrowsable (EditorBrowsableState.Advanced)]
559 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
561 public int ColumnCount {
562 get { return columns.Count; }
565 throw new ArgumentOutOfRangeException("ColumnCount",
566 "ColumnCount must be >= 0.");
568 if (dataSource != null) {
569 throw new InvalidOperationException("Cant change column count if DataSource is set.");
571 if (value < columns.Count) {
572 for (int i = value; i < columns.Count; i++) {
576 else if (value > columns.Count) {
577 for (int i = 0; i < value; i++) {
578 DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn ();
586 [DefaultValue (DataGridViewHeaderBorderStyle.Raised)]
587 public DataGridViewHeaderBorderStyle ColumnHeadersBorderStyle {
588 get { return columnHeadersBorderStyle; }
590 if (columnHeadersBorderStyle != value) {
591 columnHeadersBorderStyle = value;
592 OnColumnHeadersBorderStyleChanged(EventArgs.Empty);
597 [AmbientValue (null)]
598 public DataGridViewCellStyle ColumnHeadersDefaultCellStyle {
599 get { return columnHeadersDefaultCellStyle; }
601 if (columnHeadersDefaultCellStyle != value) {
602 columnHeadersDefaultCellStyle = value;
603 OnColumnHeadersDefaultCellStyleChanged(EventArgs.Empty);
609 public int ColumnHeadersHeight {
610 get { return columnHeadersHeight; }
612 if (columnHeadersHeight != value) {
614 throw new ArgumentOutOfRangeException("ColumnHeadersHeight",
615 "Column headers height cant be less than 4.");
617 if (value > 32768 ) {
618 throw new ArgumentOutOfRangeException("ColumnHeadersHeight",
619 "Column headers height cannot be more than 32768.");
621 columnHeadersHeight = value;
622 OnColumnHeadersHeightChanged(EventArgs.Empty);
624 if (columnHeadersVisible)
630 [RefreshProperties (RefreshProperties.All)]
631 [DefaultValue (DataGridViewColumnHeadersHeightSizeMode.EnableResizing)]
632 public DataGridViewColumnHeadersHeightSizeMode ColumnHeadersHeightSizeMode {
633 get { return columnHeadersHeightSizeMode; }
635 if (columnHeadersHeightSizeMode != value) {
636 if (!Enum.IsDefined(typeof(DataGridViewColumnHeadersHeightSizeMode), value)) {
637 throw new InvalidEnumArgumentException("Value is not a valid DataGridViewColumnHeadersHeightSizeMode.");
639 columnHeadersHeightSizeMode = value;
640 OnColumnHeadersHeightSizeModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
645 [DefaultValue (true)]
646 public bool ColumnHeadersVisible {
647 get { return columnHeadersVisible; }
649 if (columnHeadersVisible != value) {
650 columnHeadersVisible = value;
656 [MergableProperty (false)]
657 [Editor ("System.Windows.Forms.Design.DataGridViewColumnCollectionEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
658 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
659 public DataGridViewColumnCollection Columns {
660 get { return columns; }
664 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
665 public DataGridViewCell CurrentCell {
666 get { return currentCell; }
668 /////////////////////////////////////////////////////
669 /// *** InvalidOperationException ***
670 /// Changes to the specified cell cannot be committed
671 /// to the data cache, or the new cell is in a hidden
673 /////////////////////////////////////////////////////
674 if (value.DataGridView != this)
675 throw new ArgumentException("The cell is not in this DataGridView.");
678 MoveCurrentCell (value.OwningColumn.Index, value.OwningRow.Index, true, false, false, true);
680 MoveCurrentCell (-1, -1, true, false, false, true);
685 public Point CurrentCellAddress {
686 get { return currentCellAddress; }
690 public DataGridViewRow CurrentRow {
692 if (currentCell != null)
693 return currentCell.OwningRow;
699 [Editor ("System.Windows.Forms.Design.DataMemberListEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
700 public string DataMember {
701 get { return dataMember; }
703 if (dataMember != value) {
707 OnDataMemberChanged(EventArgs.Empty);
714 [RefreshProperties (RefreshProperties.Repaint)]
715 [DefaultValue (null)]
716 [AttributeProvider (typeof (IListSource))]
717 public object DataSource {
718 get { return dataSource; }
720 /* The System.Windows.Forms.DataGridView class supports the standard Windows Forms data-binding model. This means the data source can be of any type that implements:
721 - the System.Collections.IList interface, including one-dimensional arrays.
722 - the System.ComponentModel.IListSource interface, such as the System.Data.DataTable and System.Data.DataSet classes.
723 - the System.ComponentModel.IBindingList interface, such as the System.ComponentModel.Collections.BindingList<> class.
724 - the System.ComponentModel.IBindingListView interface, such as the System.Windows.Forms.BindingSource class.
726 if (!(value == null || value is IList || value is IListSource || value is IBindingList || value is IBindingListView))
727 throw new NotSupportedException ("Type cannot be bound.");
732 OnDataSourceChanged (EventArgs.Empty);
738 internal CurrencyManager DataManager {
740 if (DataSource != null && BindingContext != null) {
741 string dataMember = DataMember;
742 if (dataMember == null)
743 dataMember = String.Empty;
744 return (CurrencyManager) this.BindingContext[DataSource, dataMember];
750 [AmbientValue (null)]
751 public DataGridViewCellStyle DefaultCellStyle {
752 get { return defaultCellStyle; }
754 if (defaultCellStyle != value) {
755 defaultCellStyle = value;
756 OnDefaultCellStyleChanged(EventArgs.Empty);
761 public override Rectangle DisplayRectangle {
762 get { return base.DisplayRectangle; }
766 [EditorBrowsable (EditorBrowsableState.Advanced)]
767 public Control EditingControl {
769 return editingControl;
774 [EditorBrowsable (EditorBrowsableState.Advanced)]
775 public Panel EditingPanel {
776 get { throw new NotImplementedException(); }
779 [DefaultValue (DataGridViewEditMode.EditOnKeystrokeOrF2)]
780 public DataGridViewEditMode EditMode {
781 get { return editMode; }
783 if (editMode != value) {
785 OnEditModeChanged(EventArgs.Empty);
790 [DefaultValue (true)]
791 public bool EnableHeadersVisualStyles {
792 get { return enableHeadersVisualStyles; }
793 set { enableHeadersVisualStyles = value; }
796 internal DataGridViewHeaderCell EnteredHeaderCell {
797 get { return entered_header_cell; }
799 if (entered_header_cell == value)
801 if (ThemeEngine.Current.DataGridViewHeaderCellHasHotStyle (this)) {
802 Region area_to_invalidate = new Region ();
803 area_to_invalidate.MakeEmpty ();
804 if (entered_header_cell != null)
805 area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell));
806 entered_header_cell = value;
807 if (entered_header_cell != null)
808 area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell));
809 Invalidate (area_to_invalidate);
810 area_to_invalidate.Dispose ();
812 entered_header_cell = value;
817 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
818 public DataGridViewCell FirstDisplayedCell {
819 get { return firstDisplayedCell; }
821 if (value.DataGridView != this) {
822 throw new ArgumentException("The cell is not in this DataGridView.");
824 firstDisplayedCell = value;
829 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
830 [EditorBrowsable (EditorBrowsableState.Advanced)]
831 public int FirstDisplayedScrollingColumnHiddenWidth {
832 get { return firstDisplayedScrollingColumnHiddenWidth; }
836 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
837 public int FirstDisplayedScrollingColumnIndex {
838 get { return firstDisplayedScrollingColumnIndex; }
839 set { firstDisplayedScrollingColumnIndex = value; }
843 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
844 public int FirstDisplayedScrollingRowIndex {
845 get { return firstDisplayedScrollingRowIndex; }
846 set { firstDisplayedScrollingRowIndex = value; }
850 [EditorBrowsable (EditorBrowsableState.Advanced)]
851 public override Font Font {
852 get { return base.Font; }
853 set { base.Font = value; }
857 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
858 [EditorBrowsable (EditorBrowsableState.Advanced)]
859 public override Color ForeColor {
860 get { return base.ForeColor; }
861 set { base.ForeColor = value; }
864 public Color GridColor {
865 get { return gridColor; }
867 if (gridColor != value) {
868 if (value == Color.Empty) {
869 throw new ArgumentException("Cant set an Empty color.");
872 OnGridColorChanged(EventArgs.Empty);
878 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
879 public int HorizontalScrollingOffset {
880 get { return horizontalScrollingOffset; }
881 set { horizontalScrollingOffset = value; }
885 public bool IsCurrentCellDirty {
886 get { return isCurrentCellDirty; }
890 public bool IsCurrentCellInEditMode {
892 if (currentCell == null) {
895 return currentCell.IsInEditMode;
900 public bool IsCurrentRowDirty {
903 return IsCurrentCellDirty;
906 throw new NotImplementedException();
911 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
912 public DataGridViewCell this [int columnIndex, int rowIndex] {
913 get { return rows[rowIndex].Cells[columnIndex]; }
914 set { rows[rowIndex].Cells[columnIndex] = value; }
918 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
919 public DataGridViewCell this [string columnName, int rowIndex] {
921 int columnIndex = -1;
922 foreach (DataGridViewColumn col in columns) {
923 if (col.Name == columnName) {
924 columnIndex = col.Index;
928 return this[columnIndex, rowIndex];
931 int columnIndex = -1;
932 foreach (DataGridViewColumn col in columns) {
933 if (col.Name == columnName) {
934 columnIndex = col.Index;
938 this[columnIndex, rowIndex] = value;
942 [DefaultValue (true)]
943 public bool MultiSelect {
944 get { return multiSelect; }
946 if (multiSelect != value) {
948 OnMultiSelectChanged(EventArgs.Empty);
954 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
955 public int NewRowIndex {
957 if (!allowUserToAddRows || ColumnCount == 0) {
960 return rows.Count - 1;
965 [EditorBrowsable (EditorBrowsableState.Never)]
966 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
967 public new Padding Padding {
968 get { return Padding.Empty; }
972 internal DataGridViewHeaderCell PressedHeaderCell {
973 get { return pressed_header_cell; }
977 [DefaultValue (false)]
978 public bool ReadOnly {
979 get { return readOnly; }
981 if (readOnly != value) {
983 OnReadOnlyChanged(EventArgs.Empty);
989 [EditorBrowsable (EditorBrowsableState.Advanced)]
990 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
992 public int RowCount {
993 get { return rows.Count; }
996 throw new ArgumentException("RowCount must be >= 0.");
998 if (value < 1 && allowUserToAddRows) {
999 throw new ArgumentException("RowCount must be >= 1 if AllowUserToAddRows is true.");
1001 if (dataSource != null) {
1002 throw new InvalidOperationException("Cant change row count if DataSource is set.");
1004 if (value < rows.Count) {
1005 for (int i = value; i < rows.Count; i++) {
1009 else if (value > rows.Count) {
1010 // If we need to add rows and don't have any columns,
1011 // we create one column
1012 if (ColumnCount == 0)
1015 for (int i = rows.Count; i < value; i++) {
1016 DataGridViewRow row = (DataGridViewRow) RowTemplateFull;
1017 rows.AddInternal (row, false);
1019 foreach (DataGridViewColumn col in columns)
1020 row.Cells.Add (col.CellTemplate.Clone () as DataGridViewCell);
1027 [DefaultValue (DataGridViewHeaderBorderStyle.Raised)]
1028 public DataGridViewHeaderBorderStyle RowHeadersBorderStyle {
1029 get { return rowHeadersBorderStyle; }
1031 if (rowHeadersBorderStyle != value) {
1032 rowHeadersBorderStyle = value;
1033 OnRowHeadersBorderStyleChanged(EventArgs.Empty);
1038 [AmbientValue (null)]
1039 public DataGridViewCellStyle RowHeadersDefaultCellStyle {
1040 get { return rowHeadersDefaultCellStyle; }
1042 if (rowHeadersDefaultCellStyle != value) {
1043 rowHeadersDefaultCellStyle = value;
1044 OnRowHeadersDefaultCellStyleChanged(EventArgs.Empty);
1049 [DefaultValue (true)]
1050 public bool RowHeadersVisible {
1051 get { return rowHeadersVisible; }
1053 if (rowHeadersVisible != value) {
1054 rowHeadersVisible = value;
1060 [Localizable (true)]
1061 public int RowHeadersWidth {
1062 get { return rowHeadersWidth; }
1064 if (rowHeadersWidth != value) {
1066 throw new ArgumentOutOfRangeException("RowHeadersWidth",
1067 "Row headers width cant be less than 4.");
1069 if (value > 32768 ) {
1070 throw new ArgumentOutOfRangeException("RowHeadersWidth",
1071 "Row headers width cannot be more than 32768.");
1073 rowHeadersWidth = value;
1074 OnRowHeadersWidthChanged(EventArgs.Empty);
1076 if (rowHeadersVisible)
1082 [RefreshProperties (RefreshProperties.All)]
1083 [DefaultValue (DataGridViewRowHeadersWidthSizeMode.EnableResizing)]
1084 public DataGridViewRowHeadersWidthSizeMode RowHeadersWidthSizeMode {
1085 get { return rowHeadersWidthSizeMode; }
1087 if (rowHeadersWidthSizeMode != value) {
1088 if (!Enum.IsDefined(typeof(DataGridViewRowHeadersWidthSizeMode), value)) {
1089 throw new InvalidEnumArgumentException("Value is not valid DataGridViewRowHeadersWidthSizeMode.");
1091 rowHeadersWidthSizeMode = value;
1092 OnRowHeadersWidthSizeModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
1098 public DataGridViewRowCollection Rows {
1099 get { return rows; }
1102 public DataGridViewCellStyle RowsDefaultCellStyle {
1103 get { return rowsDefaultCellStyle; }
1105 if (rowsDefaultCellStyle != value) {
1106 rowsDefaultCellStyle = value;
1107 OnRowsDefaultCellStyleChanged(EventArgs.Empty);
1112 // RowTemplate is just the row, it does not contain Cells
1114 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
1115 public DataGridViewRow RowTemplate {
1117 if (rowTemplate == null)
1118 rowTemplate = new DataGridViewRow ();
1123 rowTemplate = value;
1124 rowTemplate.SetDataGridView(this);
1128 // Take the RowTemplate, clone it, and add Cells
1129 // Note this is not stored, so you don't need to Clone it
1130 internal DataGridViewRow RowTemplateFull {
1132 DataGridViewRow row = (DataGridViewRow) RowTemplate.Clone ();
1134 for (int i = row.Cells.Count; i < Columns.Count; i++) {
1135 DataGridViewCell template = columns [i].CellTemplate;
1137 if (template == null)
1138 throw new InvalidOperationException ("At least one of the DataGridView control's columns has no cell template.");
1140 row.Cells.Add ((DataGridViewCell) template.Clone ());
1147 internal override bool ScaleChildrenInternal {
1148 get { return false; }
1151 [DefaultValue (ScrollBars.Both)]
1152 [Localizable (true)]
1153 public ScrollBars ScrollBars {
1154 get { return scrollBars; }
1156 if (!Enum.IsDefined(typeof(ScrollBars), value)) {
1157 throw new InvalidEnumArgumentException("Invalid ScrollBars value.");
1159 ////////////////////////////////////////////////////////////
1160 /// *** InvalidOperationException ***
1161 /// The System.Windows.Forms.DataGridView is unable to
1162 /// scroll due to a cell change that cannot be committed
1164 ///////////////////////////////////////////////////////////
1170 public DataGridViewSelectedCellCollection SelectedCells {
1172 DataGridViewSelectedCellCollection selectedCells = new DataGridViewSelectedCellCollection();
1173 foreach (DataGridViewRow row in rows) {
1174 foreach (DataGridViewCell cell in row.Cells) {
1175 if (cell.Selected) {
1176 selectedCells.InternalAdd(cell);
1180 return selectedCells;
1185 public DataGridViewSelectedColumnCollection SelectedColumns {
1188 DataGridViewSelectedColumnCollection result = new DataGridViewSelectedColumnCollection ();
1190 if (selectionMode != DataGridViewSelectionMode.FullColumnSelect && selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect)
1193 result.InternalAddRange (selected_columns);
1200 public DataGridViewSelectedRowCollection SelectedRows {
1202 DataGridViewSelectedRowCollection result = new DataGridViewSelectedRowCollection (this);
1204 if (selectionMode != DataGridViewSelectionMode.FullRowSelect && selectionMode != DataGridViewSelectionMode.RowHeaderSelect)
1207 result.InternalAddRange (selected_rows);
1214 [DefaultValue (DataGridViewSelectionMode.RowHeaderSelect)]
1215 public DataGridViewSelectionMode SelectionMode {
1216 get { return selectionMode; }
1218 if (!Enum.IsDefined (typeof(DataGridViewSelectionMode), value))
1219 throw new InvalidEnumArgumentException ("Value is not valid DataGridViewSelectionMode.");
1221 if (value == DataGridViewSelectionMode.ColumnHeaderSelect || value == DataGridViewSelectionMode.FullColumnSelect)
1222 foreach (DataGridViewColumn col in Columns)
1223 if (col.SortMode == DataGridViewColumnSortMode.Automatic)
1224 throw new InvalidOperationException (string.Format ("Cannot set SelectionMode to {0} because there are Automatic sort columns.", value));
1226 selectionMode = value;
1230 [DefaultValue (true)]
1231 public bool ShowCellErrors {
1232 get { return showCellErrors; }
1233 set { showCellErrors = value; }
1236 [DefaultValue (true)]
1237 public bool ShowCellToolTips {
1238 get { return showCellToolTips; }
1239 set { showCellToolTips = value; }
1242 [DefaultValue (true)]
1243 public bool ShowEditingIcon {
1244 get { return showEditingIcon; }
1245 set { showEditingIcon = value; }
1248 [DefaultValue (true)]
1249 public bool ShowRowErrors {
1250 get { return showRowErrors; }
1251 set { showRowErrors = value; }
1255 public DataGridViewColumn SortedColumn {
1256 get { return sortedColumn; }
1260 public SortOrder SortOrder {
1261 get { return sortOrder; }
1264 [DefaultValue (false)]
1265 [EditorBrowsable (EditorBrowsableState.Advanced)]
1266 public bool StandardTab {
1267 get { return standardTab; }
1268 set { standardTab = value; }
1273 [EditorBrowsable (EditorBrowsableState.Never)]
1274 public override string Text {
1275 get { return base.Text; }
1276 set { base.Text = value; }
1280 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1281 public DataGridViewHeaderCell TopLeftHeaderCell {
1283 if (topLeftHeaderCell == null) {
1284 topLeftHeaderCell = new DataGridViewTopLeftHeaderCell ();
1285 topLeftHeaderCell.SetDataGridView (this);
1287 return topLeftHeaderCell;
1290 topLeftHeaderCell = value;
1291 topLeftHeaderCell.SetDataGridView (this);
1296 [EditorBrowsable (EditorBrowsableState.Advanced)]
1297 public Cursor UserSetCursor {
1298 get { return userSetCursor; }
1302 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1303 public int VerticalScrollingOffset {
1304 get { return verticalScrollingOffset; }
1307 [MonoTODO ("VirtualMode is not supported.")]
1308 [EditorBrowsable (EditorBrowsableState.Advanced)]
1309 [DefaultValue (false)]
1310 public bool VirtualMode {
1311 get { return virtualMode; }
1312 set { virtualMode = value; }
1315 internal Control EditingControlInternal {
1317 return editingControl;
1320 if (value == editingControl)
1323 if (editingControl != null) {
1324 // Can't use Controls.Remove (editingControls), because that method
1325 // is overriden to not remove the editing control.
1326 DataGridView.DataGridViewControlCollection ctrls = Controls as DataGridView.DataGridViewControlCollection;
1327 if (ctrls != null) {
1328 ctrls.RemoveInternal (editingControl);
1330 Controls.Remove (editingControl);
1335 if (value != null) {
1336 value.Visible = false;
1337 Controls.Add (value);
1340 editingControl = value;
1344 static object AllowUserToAddRowsChangedEvent = new object ();
1345 static object AllowUserToDeleteRowsChangedEvent = new object ();
1346 static object AllowUserToOrderColumnsChangedEvent = new object ();
1347 static object AllowUserToResizeColumnsChangedEvent = new object ();
1348 static object AllowUserToResizeRowsChangedEvent = new object ();
1349 static object AlternatingRowsDefaultCellStyleChangedEvent = new object ();
1350 static object AutoGenerateColumnsChangedEvent = new object ();
1351 static object AutoSizeColumnModeChangedEvent = new object ();
1352 static object AutoSizeColumnsModeChangedEvent = new object ();
1353 static object AutoSizeRowsModeChangedEvent = new object ();
1354 static object BackgroundColorChangedEvent = new object ();
1355 static object BorderStyleChangedEvent = new object ();
1356 static object CancelRowEditEvent = new object ();
1357 static object CellBeginEditEvent = new object ();
1358 static object CellBorderStyleChangedEvent = new object ();
1359 static object CellClickEvent = new object ();
1360 static object CellContentClickEvent = new object ();
1361 static object CellContentDoubleClickEvent = new object ();
1362 static object CellContextMenuStripChangedEvent = new object ();
1363 static object CellContextMenuStripNeededEvent = new object ();
1364 static object CellDoubleClickEvent = new object ();
1365 static object CellEndEditEvent = new object ();
1366 static object CellEnterEvent = new object ();
1367 static object CellErrorTextChangedEvent = new object ();
1368 static object CellErrorTextNeededEvent = new object ();
1369 static object CellFormattingEvent = new object ();
1370 static object CellLeaveEvent = new object ();
1371 static object CellMouseClickEvent = new object ();
1372 static object CellMouseDoubleClickEvent = new object ();
1373 static object CellMouseDownEvent = new object ();
1374 static object CellMouseEnterEvent = new object ();
1375 static object CellMouseLeaveEvent = new object ();
1376 static object CellMouseMoveEvent = new object ();
1377 static object CellMouseUpEvent = new object ();
1378 static object CellPaintingEvent = new object ();
1379 static object CellParsingEvent = new object ();
1380 static object CellStateChangedEvent = new object ();
1381 static object CellStyleChangedEvent = new object ();
1382 static object CellStyleContentChangedEvent = new object ();
1383 static object CellToolTipTextChangedEvent = new object ();
1384 static object CellToolTipTextNeededEvent = new object ();
1385 static object CellValidatedEvent = new object ();
1386 static object CellValidatingEvent = new object ();
1387 static object CellValueChangedEvent = new object ();
1388 static object CellValueNeededEvent = new object ();
1389 static object CellValuePushedEvent = new object ();
1390 static object ColumnAddedEvent = new object ();
1391 static object ColumnContextMenuStripChangedEvent = new object ();
1392 static object ColumnDataPropertyNameChangedEvent = new object ();
1393 static object ColumnDefaultCellStyleChangedEvent = new object ();
1394 static object ColumnDisplayIndexChangedEvent = new object ();
1395 static object ColumnDividerDoubleClickEvent = new object ();
1396 static object ColumnDividerWidthChangedEvent = new object ();
1397 static object ColumnHeaderCellChangedEvent = new object ();
1398 static object ColumnHeaderMouseClickEvent = new object ();
1399 static object ColumnHeaderMouseDoubleClickEvent = new object ();
1400 static object ColumnHeadersBorderStyleChangedEvent = new object ();
1401 static object ColumnHeadersDefaultCellStyleChangedEvent = new object ();
1402 static object ColumnHeadersHeightChangedEvent = new object ();
1403 static object ColumnHeadersHeightSizeModeChangedEvent = new object ();
1404 static object ColumnMinimumWidthChangedEvent = new object ();
1405 static object ColumnNameChangedEvent = new object ();
1406 static object ColumnRemovedEvent = new object ();
1407 static object ColumnSortModeChangedEvent = new object ();
1408 static object ColumnStateChangedEvent = new object ();
1409 static object ColumnToolTipTextChangedEvent = new object ();
1410 static object ColumnWidthChangedEvent = new object ();
1411 static object CurrentCellChangedEvent = new object ();
1412 static object CurrentCellDirtyStateChangedEvent = new object ();
1413 static object DataBindingCompleteEvent = new object ();
1414 static object DataErrorEvent = new object ();
1415 static object DataMemberChangedEvent = new object ();
1416 static object DataSourceChangedEvent = new object ();
1417 static object DefaultCellStyleChangedEvent = new object ();
1418 static object DefaultValuesNeededEvent = new object ();
1419 static object EditingControlShowingEvent = new object ();
1420 static object EditModeChangedEvent = new object ();
1421 static object GridColorChangedEvent = new object ();
1422 static object MultiSelectChangedEvent = new object ();
1423 static object NewRowNeededEvent = new object ();
1424 static object ReadOnlyChangedEvent = new object ();
1425 static object RowContextMenuStripChangedEvent = new object ();
1426 static object RowContextMenuStripNeededEvent = new object ();
1427 static object RowDefaultCellStyleChangedEvent = new object ();
1428 static object RowDirtyStateNeededEvent = new object ();
1429 static object RowDividerDoubleClickEvent = new object ();
1430 static object RowDividerHeightChangedEvent = new object ();
1431 static object RowEnterEvent = new object ();
1432 static object RowErrorTextChangedEvent = new object ();
1433 static object RowErrorTextNeededEvent = new object ();
1434 static object RowHeaderCellChangedEvent = new object ();
1435 static object RowHeaderMouseClickEvent = new object ();
1436 static object RowHeaderMouseDoubleClickEvent = new object ();
1437 static object RowHeadersBorderStyleChangedEvent = new object ();
1438 static object RowHeadersDefaultCellStyleChangedEvent = new object ();
1439 static object RowHeadersWidthChangedEvent = new object ();
1440 static object RowHeadersWidthSizeModeChangedEvent = new object ();
1441 static object RowHeightChangedEvent = new object ();
1442 static object RowHeightInfoNeededEvent = new object ();
1443 static object RowHeightInfoPushedEvent = new object ();
1444 static object RowLeaveEvent = new object ();
1445 static object RowMinimumHeightChangedEvent = new object ();
1446 static object RowPostPaintEvent = new object ();
1447 static object RowPrePaintEvent = new object ();
1448 static object RowsAddedEvent = new object ();
1449 static object RowsDefaultCellStyleChangedEvent = new object ();
1450 static object RowsRemovedEvent = new object ();
1451 static object RowStateChangedEvent = new object ();
1452 static object RowUnsharedEvent = new object ();
1453 static object RowValidatedEvent = new object ();
1454 static object RowValidatingEvent = new object ();
1455 static object ScrollEvent = new object ();
1456 static object SelectionChangedEvent = new object ();
1457 static object SortCompareEvent = new object ();
1458 static object SortedEvent = new object ();
1459 static object UserAddedRowEvent = new object ();
1460 static object UserDeletedRowEvent = new object ();
1461 static object UserDeletingRowEvent = new object ();
1466 public event EventHandler AllowUserToAddRowsChanged {
1467 add { Events.AddHandler (AllowUserToAddRowsChangedEvent, value); }
1468 remove { Events.RemoveHandler (AllowUserToAddRowsChangedEvent, value); }
1471 public event EventHandler AllowUserToDeleteRowsChanged {
1472 add { Events.AddHandler (AllowUserToDeleteRowsChangedEvent, value); }
1473 remove { Events.RemoveHandler (AllowUserToDeleteRowsChangedEvent, value); }
1476 public event EventHandler AllowUserToOrderColumnsChanged {
1477 add { Events.AddHandler (AllowUserToOrderColumnsChangedEvent, value); }
1478 remove { Events.RemoveHandler (AllowUserToOrderColumnsChangedEvent, value); }
1481 public event EventHandler AllowUserToResizeColumnsChanged {
1482 add { Events.AddHandler (AllowUserToResizeColumnsChangedEvent, value); }
1483 remove { Events.RemoveHandler (AllowUserToResizeColumnsChangedEvent, value); }
1486 public event EventHandler AllowUserToResizeRowsChanged {
1487 add { Events.AddHandler (AllowUserToResizeRowsChangedEvent, value); }
1488 remove { Events.RemoveHandler (AllowUserToResizeRowsChangedEvent, value); }
1491 public event EventHandler AlternatingRowsDefaultCellStyleChanged {
1492 add { Events.AddHandler (AlternatingRowsDefaultCellStyleChangedEvent, value); }
1493 remove { Events.RemoveHandler (AlternatingRowsDefaultCellStyleChangedEvent, value); }
1497 [EditorBrowsable (EditorBrowsableState.Advanced)]
1498 public event EventHandler AutoGenerateColumnsChanged {
1499 add { Events.AddHandler (AutoGenerateColumnsChangedEvent, value); }
1500 remove { Events.RemoveHandler (AutoGenerateColumnsChangedEvent, value); }
1503 public event DataGridViewAutoSizeColumnModeEventHandler AutoSizeColumnModeChanged {
1504 add { Events.AddHandler (AutoSizeColumnModeChangedEvent, value); }
1505 remove { Events.RemoveHandler (AutoSizeColumnModeChangedEvent, value); }
1508 public event DataGridViewAutoSizeColumnsModeEventHandler AutoSizeColumnsModeChanged {
1509 add { Events.AddHandler (AutoSizeColumnsModeChangedEvent, value); }
1510 remove { Events.RemoveHandler (AutoSizeColumnsModeChangedEvent, value); }
1513 public event DataGridViewAutoSizeModeEventHandler AutoSizeRowsModeChanged {
1514 add { Events.AddHandler (AutoSizeRowsModeChangedEvent, value); }
1515 remove { Events.RemoveHandler (AutoSizeRowsModeChangedEvent, value); }
1519 [EditorBrowsable (EditorBrowsableState.Never)]
1520 public new event EventHandler BackColorChanged {
1521 add { base.BackColorChanged += value; }
1522 remove { base.BackColorChanged -= value; }
1525 public event EventHandler BackgroundColorChanged {
1526 add { Events.AddHandler (BackgroundColorChangedEvent, value); }
1527 remove { Events.RemoveHandler (BackgroundColorChangedEvent, value); }
1531 [EditorBrowsable (EditorBrowsableState.Never)]
1532 public new event EventHandler BackgroundImageChanged {
1533 add { base.BackgroundImageChanged += value; }
1534 remove { base.BackgroundImageChanged -= value; }
1538 [EditorBrowsable (EditorBrowsableState.Never)]
1539 public new event EventHandler BackgroundImageLayoutChanged {
1540 add { base.BackgroundImageLayoutChanged += value; }
1541 remove { base.BackgroundImageLayoutChanged -= value; }
1544 public event EventHandler BorderStyleChanged {
1545 add { Events.AddHandler (BorderStyleChangedEvent, value); }
1546 remove { Events.RemoveHandler (BorderStyleChangedEvent, value); }
1549 public event QuestionEventHandler CancelRowEdit {
1550 add { Events.AddHandler (CancelRowEditEvent, value); }
1551 remove { Events.RemoveHandler (CancelRowEditEvent, value); }
1554 public event DataGridViewCellCancelEventHandler CellBeginEdit {
1555 add { Events.AddHandler (CellBeginEditEvent, value); }
1556 remove { Events.RemoveHandler (CellBeginEditEvent, value); }
1559 public event EventHandler CellBorderStyleChanged {
1560 add { Events.AddHandler (CellBorderStyleChangedEvent, value); }
1561 remove { Events.RemoveHandler (CellBorderStyleChangedEvent, value); }
1564 public event DataGridViewCellEventHandler CellClick {
1565 add { Events.AddHandler (CellClickEvent, value); }
1566 remove { Events.RemoveHandler (CellClickEvent, value); }
1569 public event DataGridViewCellEventHandler CellContentClick {
1570 add { Events.AddHandler (CellContentClickEvent, value); }
1571 remove { Events.RemoveHandler (CellContentClickEvent, value); }
1574 public event DataGridViewCellEventHandler CellContentDoubleClick {
1575 add { Events.AddHandler (CellContentDoubleClickEvent, value); }
1576 remove { Events.RemoveHandler (CellContentDoubleClickEvent, value); }
1579 [EditorBrowsable (EditorBrowsableState.Advanced)]
1580 public event DataGridViewCellEventHandler CellContextMenuStripChanged {
1581 add { Events.AddHandler (CellContextMenuStripChangedEvent, value); }
1582 remove { Events.RemoveHandler (CellContextMenuStripChangedEvent, value); }
1585 [EditorBrowsable (EditorBrowsableState.Advanced)]
1586 public event DataGridViewCellContextMenuStripNeededEventHandler CellContextMenuStripNeeded {
1587 add { Events.AddHandler (CellContextMenuStripNeededEvent, value); }
1588 remove { Events.RemoveHandler (CellContextMenuStripNeededEvent, value); }
1591 public event DataGridViewCellEventHandler CellDoubleClick {
1592 add { Events.AddHandler (CellDoubleClickEvent, value); }
1593 remove { Events.RemoveHandler (CellDoubleClickEvent, value); }
1596 public event DataGridViewCellEventHandler CellEndEdit {
1597 add { Events.AddHandler (CellEndEditEvent, value); }
1598 remove { Events.RemoveHandler (CellEndEditEvent, value); }
1601 public event DataGridViewCellEventHandler CellEnter {
1602 add { Events.AddHandler (CellEnterEvent, value); }
1603 remove { Events.RemoveHandler (CellEnterEvent, value); }
1606 public event DataGridViewCellEventHandler CellErrorTextChanged {
1607 add { Events.AddHandler (CellErrorTextChangedEvent, value); }
1608 remove { Events.RemoveHandler (CellErrorTextChangedEvent, value); }
1611 [EditorBrowsable (EditorBrowsableState.Advanced)]
1612 public event DataGridViewCellErrorTextNeededEventHandler CellErrorTextNeeded {
1613 add { Events.AddHandler (CellErrorTextNeededEvent, value); }
1614 remove { Events.RemoveHandler (CellErrorTextNeededEvent, value); }
1617 public event DataGridViewCellFormattingEventHandler CellFormatting {
1618 add { Events.AddHandler (CellFormattingEvent, value); }
1619 remove { Events.RemoveHandler (CellFormattingEvent, value); }
1622 public event DataGridViewCellEventHandler CellLeave {
1623 add { Events.AddHandler (CellLeaveEvent, value); }
1624 remove { Events.RemoveHandler (CellLeaveEvent, value); }
1627 public event DataGridViewCellMouseEventHandler CellMouseClick {
1628 add { Events.AddHandler (CellMouseClickEvent, value); }
1629 remove { Events.RemoveHandler (CellMouseClickEvent, value); }
1632 public event DataGridViewCellMouseEventHandler CellMouseDoubleClick {
1633 add { Events.AddHandler (CellMouseDoubleClickEvent, value); }
1634 remove { Events.RemoveHandler (CellMouseDoubleClickEvent, value); }
1637 public event DataGridViewCellMouseEventHandler CellMouseDown {
1638 add { Events.AddHandler (CellMouseDownEvent, value); }
1639 remove { Events.RemoveHandler (CellMouseDownEvent, value); }
1642 public event DataGridViewCellEventHandler CellMouseEnter {
1643 add { Events.AddHandler (CellMouseEnterEvent, value); }
1644 remove { Events.RemoveHandler (CellMouseEnterEvent, value); }
1647 public event DataGridViewCellEventHandler CellMouseLeave {
1648 add { Events.AddHandler (CellMouseLeaveEvent, value); }
1649 remove { Events.RemoveHandler (CellMouseLeaveEvent, value); }
1652 public event DataGridViewCellMouseEventHandler CellMouseMove {
1653 add { Events.AddHandler (CellMouseMoveEvent, value); }
1654 remove { Events.RemoveHandler (CellMouseMoveEvent, value); }
1657 public event DataGridViewCellMouseEventHandler CellMouseUp {
1658 add { Events.AddHandler (CellMouseUpEvent, value); }
1659 remove { Events.RemoveHandler (CellMouseUpEvent, value); }
1662 public event DataGridViewCellPaintingEventHandler CellPainting {
1663 add { Events.AddHandler (CellPaintingEvent, value); }
1664 remove { Events.RemoveHandler (CellPaintingEvent, value); }
1667 public event DataGridViewCellParsingEventHandler CellParsing {
1668 add { Events.AddHandler (CellParsingEvent, value); }
1669 remove { Events.RemoveHandler (CellParsingEvent, value); }
1672 public event DataGridViewCellStateChangedEventHandler CellStateChanged {
1673 add { Events.AddHandler (CellStateChangedEvent, value); }
1674 remove { Events.RemoveHandler (CellStateChangedEvent, value); }
1677 public event DataGridViewCellEventHandler CellStyleChanged {
1678 add { Events.AddHandler (CellStyleChangedEvent, value); }
1679 remove { Events.RemoveHandler (CellStyleChangedEvent, value); }
1682 public event DataGridViewCellStyleContentChangedEventHandler CellStyleContentChanged {
1683 add { Events.AddHandler (CellStyleContentChangedEvent, value); }
1684 remove { Events.RemoveHandler (CellStyleContentChangedEvent, value); }
1687 public event DataGridViewCellEventHandler CellToolTipTextChanged {
1688 add { Events.AddHandler (CellToolTipTextChangedEvent, value); }
1689 remove { Events.RemoveHandler (CellToolTipTextChangedEvent, value); }
1692 [EditorBrowsable (EditorBrowsableState.Advanced)]
1693 public event DataGridViewCellToolTipTextNeededEventHandler CellToolTipTextNeeded {
1694 add { Events.AddHandler (CellToolTipTextNeededEvent, value); }
1695 remove { Events.RemoveHandler (CellToolTipTextNeededEvent, value); }
1698 public event DataGridViewCellEventHandler CellValidated {
1699 add { Events.AddHandler (CellValidatedEvent, value); }
1700 remove { Events.RemoveHandler (CellValidatedEvent, value); }
1703 public event DataGridViewCellValidatingEventHandler CellValidating {
1704 add { Events.AddHandler (CellValidatingEvent, value); }
1705 remove { Events.RemoveHandler (CellValidatingEvent, value); }
1708 public event DataGridViewCellEventHandler CellValueChanged {
1709 add { Events.AddHandler (CellValueChangedEvent, value); }
1710 remove { Events.RemoveHandler (CellValueChangedEvent, value); }
1713 [EditorBrowsable (EditorBrowsableState.Advanced)]
1714 public event DataGridViewCellValueEventHandler CellValueNeeded {
1715 add { Events.AddHandler (CellValueNeededEvent, value); }
1716 remove { Events.RemoveHandler (CellValueNeededEvent, value); }
1719 [EditorBrowsable (EditorBrowsableState.Advanced)]
1720 public event DataGridViewCellValueEventHandler CellValuePushed {
1721 add { Events.AddHandler (CellValuePushedEvent, value); }
1722 remove { Events.RemoveHandler (CellValuePushedEvent, value); }
1725 public event DataGridViewColumnEventHandler ColumnAdded {
1726 add { Events.AddHandler (ColumnAddedEvent, value); }
1727 remove { Events.RemoveHandler (ColumnAddedEvent, value); }
1730 public event DataGridViewColumnEventHandler ColumnContextMenuStripChanged {
1731 add { Events.AddHandler (ColumnContextMenuStripChangedEvent, value); }
1732 remove { Events.RemoveHandler (ColumnContextMenuStripChangedEvent, value); }
1735 public event DataGridViewColumnEventHandler ColumnDataPropertyNameChanged {
1736 add { Events.AddHandler (ColumnDataPropertyNameChangedEvent, value); }
1737 remove { Events.RemoveHandler (ColumnDataPropertyNameChangedEvent, value); }
1740 public event DataGridViewColumnEventHandler ColumnDefaultCellStyleChanged {
1741 add { Events.AddHandler (ColumnDefaultCellStyleChangedEvent, value); }
1742 remove { Events.RemoveHandler (ColumnDefaultCellStyleChangedEvent, value); }
1745 public event DataGridViewColumnEventHandler ColumnDisplayIndexChanged {
1746 add { Events.AddHandler (ColumnDisplayIndexChangedEvent, value); }
1747 remove { Events.RemoveHandler (ColumnDisplayIndexChangedEvent, value); }
1750 public event DataGridViewColumnDividerDoubleClickEventHandler ColumnDividerDoubleClick {
1751 add { Events.AddHandler (ColumnDividerDoubleClickEvent, value); }
1752 remove { Events.RemoveHandler (ColumnDividerDoubleClickEvent, value); }
1755 public event DataGridViewColumnEventHandler ColumnDividerWidthChanged {
1756 add { Events.AddHandler (ColumnDividerWidthChangedEvent, value); }
1757 remove { Events.RemoveHandler (ColumnDividerWidthChangedEvent, value); }
1760 public event DataGridViewColumnEventHandler ColumnHeaderCellChanged {
1761 add { Events.AddHandler (ColumnHeaderCellChangedEvent, value); }
1762 remove { Events.RemoveHandler (ColumnHeaderCellChangedEvent, value); }
1765 public event DataGridViewCellMouseEventHandler ColumnHeaderMouseClick {
1766 add { Events.AddHandler (ColumnHeaderMouseClickEvent, value); }
1767 remove { Events.RemoveHandler (ColumnHeaderMouseClickEvent, value); }
1770 public event DataGridViewCellMouseEventHandler ColumnHeaderMouseDoubleClick {
1771 add { Events.AddHandler (ColumnHeaderMouseDoubleClickEvent, value); }
1772 remove { Events.RemoveHandler (ColumnHeaderMouseDoubleClickEvent, value); }
1775 public event EventHandler ColumnHeadersBorderStyleChanged {
1776 add { Events.AddHandler (ColumnHeadersBorderStyleChangedEvent, value); }
1777 remove { Events.RemoveHandler (ColumnHeadersBorderStyleChangedEvent, value); }
1780 public event EventHandler ColumnHeadersDefaultCellStyleChanged {
1781 add { Events.AddHandler (ColumnHeadersDefaultCellStyleChangedEvent, value); }
1782 remove { Events.RemoveHandler (ColumnHeadersDefaultCellStyleChangedEvent, value); }
1785 public event EventHandler ColumnHeadersHeightChanged {
1786 add { Events.AddHandler (ColumnHeadersHeightChangedEvent, value); }
1787 remove { Events.RemoveHandler (ColumnHeadersHeightChangedEvent, value); }
1790 public event DataGridViewAutoSizeModeEventHandler ColumnHeadersHeightSizeModeChanged {
1791 add { Events.AddHandler (ColumnHeadersHeightSizeModeChangedEvent, value); }
1792 remove { Events.RemoveHandler (ColumnHeadersHeightSizeModeChangedEvent, value); }
1795 public event DataGridViewColumnEventHandler ColumnMinimumWidthChanged {
1796 add { Events.AddHandler (ColumnMinimumWidthChangedEvent, value); }
1797 remove { Events.RemoveHandler (ColumnMinimumWidthChangedEvent, value); }
1800 public event DataGridViewColumnEventHandler ColumnNameChanged {
1801 add { Events.AddHandler (ColumnNameChangedEvent, value); }
1802 remove { Events.RemoveHandler (ColumnNameChangedEvent, value); }
1805 public event DataGridViewColumnEventHandler ColumnRemoved {
1806 add { Events.AddHandler (ColumnRemovedEvent, value); }
1807 remove { Events.RemoveHandler (ColumnRemovedEvent, value); }
1810 public event DataGridViewColumnEventHandler ColumnSortModeChanged {
1811 add { Events.AddHandler (ColumnSortModeChangedEvent, value); }
1812 remove { Events.RemoveHandler (ColumnSortModeChangedEvent, value); }
1815 public event DataGridViewColumnStateChangedEventHandler ColumnStateChanged {
1816 add { Events.AddHandler (ColumnStateChangedEvent, value); }
1817 remove { Events.RemoveHandler (ColumnStateChangedEvent, value); }
1820 public event DataGridViewColumnEventHandler ColumnToolTipTextChanged {
1821 add { Events.AddHandler (ColumnToolTipTextChangedEvent, value); }
1822 remove { Events.RemoveHandler (ColumnToolTipTextChangedEvent, value); }
1825 public event DataGridViewColumnEventHandler ColumnWidthChanged {
1826 add { Events.AddHandler (ColumnWidthChangedEvent, value); }
1827 remove { Events.RemoveHandler (ColumnWidthChangedEvent, value); }
1830 public event EventHandler CurrentCellChanged {
1831 add { Events.AddHandler (CurrentCellChangedEvent, value); }
1832 remove { Events.RemoveHandler (CurrentCellChangedEvent, value); }
1835 [EditorBrowsable (EditorBrowsableState.Advanced)]
1836 public event EventHandler CurrentCellDirtyStateChanged {
1837 add { Events.AddHandler (CurrentCellDirtyStateChangedEvent, value); }
1838 remove { Events.RemoveHandler (CurrentCellDirtyStateChangedEvent, value); }
1841 public event DataGridViewBindingCompleteEventHandler DataBindingComplete {
1842 add { Events.AddHandler (DataBindingCompleteEvent, value); }
1843 remove { Events.RemoveHandler (DataBindingCompleteEvent, value); }
1846 public event DataGridViewDataErrorEventHandler DataError {
1847 add { Events.AddHandler (DataErrorEvent, value); }
1848 remove { Events.RemoveHandler (DataErrorEvent, value); }
1851 public event EventHandler DataMemberChanged {
1852 add { Events.AddHandler (DataMemberChangedEvent, value); }
1853 remove { Events.RemoveHandler (DataMemberChangedEvent, value); }
1856 public event EventHandler DataSourceChanged {
1857 add { Events.AddHandler (DataSourceChangedEvent, value); }
1858 remove { Events.RemoveHandler (DataSourceChangedEvent, value); }
1861 public event EventHandler DefaultCellStyleChanged {
1862 add { Events.AddHandler (DefaultCellStyleChangedEvent, value); }
1863 remove { Events.RemoveHandler (DefaultCellStyleChangedEvent, value); }
1866 [EditorBrowsable (EditorBrowsableState.Advanced)]
1867 public event DataGridViewRowEventHandler DefaultValuesNeeded {
1868 add { Events.AddHandler (DefaultValuesNeededEvent, value); }
1869 remove { Events.RemoveHandler (DefaultValuesNeededEvent, value); }
1872 public event DataGridViewEditingControlShowingEventHandler EditingControlShowing {
1873 add { Events.AddHandler (EditingControlShowingEvent, value); }
1874 remove { Events.RemoveHandler (EditingControlShowingEvent, value); }
1877 public event EventHandler EditModeChanged {
1878 add { Events.AddHandler (EditModeChangedEvent, value); }
1879 remove { Events.RemoveHandler (EditModeChangedEvent, value); }
1883 [EditorBrowsable (EditorBrowsableState.Advanced)]
1884 public new event EventHandler FontChanged {
1885 add { base.FontChanged += value; }
1886 remove { base.FontChanged -= value; }
1890 [EditorBrowsable (EditorBrowsableState.Advanced)]
1891 public new event EventHandler ForeColorChanged {
1892 add { base.ForeColorChanged += value; }
1893 remove { base.ForeColorChanged -= value; }
1897 [EditorBrowsable (EditorBrowsableState.Never)]
1898 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1899 public new event EventHandler PaddingChanged {
1900 add { base.PaddingChanged += value; }
1901 remove { base.PaddingChanged -= value; }
1904 public event EventHandler GridColorChanged {
1905 add { Events.AddHandler (GridColorChangedEvent, value); }
1906 remove { Events.RemoveHandler (GridColorChangedEvent, value); }
1909 public event EventHandler MultiSelectChanged {
1910 add { Events.AddHandler (MultiSelectChangedEvent, value); }
1911 remove { Events.RemoveHandler (MultiSelectChangedEvent, value); }
1914 public event DataGridViewRowEventHandler NewRowNeeded {
1915 add { Events.AddHandler (NewRowNeededEvent, value); }
1916 remove { Events.RemoveHandler (NewRowNeededEvent, value); }
1919 public event EventHandler ReadOnlyChanged {
1920 add { Events.AddHandler (ReadOnlyChangedEvent, value); }
1921 remove { Events.RemoveHandler (ReadOnlyChangedEvent, value); }
1924 public event DataGridViewRowEventHandler RowContextMenuStripChanged {
1925 add { Events.AddHandler (RowContextMenuStripChangedEvent, value); }
1926 remove { Events.RemoveHandler (RowContextMenuStripChangedEvent, value); }
1929 [EditorBrowsable (EditorBrowsableState.Advanced)]
1930 public event DataGridViewRowContextMenuStripNeededEventHandler RowContextMenuStripNeeded {
1931 add { Events.AddHandler (RowContextMenuStripNeededEvent, value); }
1932 remove { Events.RemoveHandler (RowContextMenuStripNeededEvent, value); }
1935 public event DataGridViewRowEventHandler RowDefaultCellStyleChanged {
1936 add { Events.AddHandler (RowDefaultCellStyleChangedEvent, value); }
1937 remove { Events.RemoveHandler (RowDefaultCellStyleChangedEvent, value); }
1940 [EditorBrowsable (EditorBrowsableState.Advanced)]
1941 public event QuestionEventHandler RowDirtyStateNeeded {
1942 add { Events.AddHandler (RowDirtyStateNeededEvent, value); }
1943 remove { Events.RemoveHandler (RowDirtyStateNeededEvent, value); }
1946 public event DataGridViewRowDividerDoubleClickEventHandler RowDividerDoubleClick {
1947 add { Events.AddHandler (RowDividerDoubleClickEvent, value); }
1948 remove { Events.RemoveHandler (RowDividerDoubleClickEvent, value); }
1951 public event DataGridViewRowEventHandler RowDividerHeightChanged {
1952 add { Events.AddHandler (RowDividerHeightChangedEvent, value); }
1953 remove { Events.RemoveHandler (RowDividerHeightChangedEvent, value); }
1956 public event DataGridViewCellEventHandler RowEnter {
1957 add { Events.AddHandler (RowEnterEvent, value); }
1958 remove { Events.RemoveHandler (RowEnterEvent, value); }
1961 public event DataGridViewRowEventHandler RowErrorTextChanged {
1962 add { Events.AddHandler (RowErrorTextChangedEvent, value); }
1963 remove { Events.RemoveHandler (RowErrorTextChangedEvent, value); }
1966 [EditorBrowsable (EditorBrowsableState.Advanced)]
1967 public event DataGridViewRowErrorTextNeededEventHandler RowErrorTextNeeded {
1968 add { Events.AddHandler (RowErrorTextNeededEvent, value); }
1969 remove { Events.RemoveHandler (RowErrorTextNeededEvent, value); }
1972 public event DataGridViewRowEventHandler RowHeaderCellChanged {
1973 add { Events.AddHandler (RowHeaderCellChangedEvent, value); }
1974 remove { Events.RemoveHandler (RowHeaderCellChangedEvent, value); }
1977 public event DataGridViewCellMouseEventHandler RowHeaderMouseClick {
1978 add { Events.AddHandler (RowHeaderMouseClickEvent, value); }
1979 remove { Events.RemoveHandler (RowHeaderMouseClickEvent, value); }
1982 public event DataGridViewCellMouseEventHandler RowHeaderMouseDoubleClick {
1983 add { Events.AddHandler (RowHeaderMouseDoubleClickEvent, value); }
1984 remove { Events.RemoveHandler (RowHeaderMouseDoubleClickEvent, value); }
1987 public event EventHandler RowHeadersBorderStyleChanged {
1988 add { Events.AddHandler (RowHeadersBorderStyleChangedEvent, value); }
1989 remove { Events.RemoveHandler (RowHeadersBorderStyleChangedEvent, value); }
1992 public event EventHandler RowHeadersDefaultCellStyleChanged {
1993 add { Events.AddHandler (RowHeadersDefaultCellStyleChangedEvent, value); }
1994 remove { Events.RemoveHandler (RowHeadersDefaultCellStyleChangedEvent, value); }
1997 public event EventHandler RowHeadersWidthChanged {
1998 add { Events.AddHandler (RowHeadersWidthChangedEvent, value); }
1999 remove { Events.RemoveHandler (RowHeadersWidthChangedEvent, value); }
2002 public event DataGridViewAutoSizeModeEventHandler RowHeadersWidthSizeModeChanged {
2003 add { Events.AddHandler (RowHeadersWidthSizeModeChangedEvent, value); }
2004 remove { Events.RemoveHandler (RowHeadersWidthSizeModeChangedEvent, value); }
2007 public event DataGridViewRowEventHandler RowHeightChanged {
2008 add { Events.AddHandler (RowHeightChangedEvent, value); }
2009 remove { Events.RemoveHandler (RowHeightChangedEvent, value); }
2012 [EditorBrowsable (EditorBrowsableState.Advanced)]
2013 public event DataGridViewRowHeightInfoNeededEventHandler RowHeightInfoNeeded {
2014 add { Events.AddHandler (RowHeightInfoNeededEvent, value); }
2015 remove { Events.RemoveHandler (RowHeightInfoNeededEvent, value); }
2018 [EditorBrowsable (EditorBrowsableState.Advanced)]
2019 public event DataGridViewRowHeightInfoPushedEventHandler RowHeightInfoPushed {
2020 add { Events.AddHandler (RowHeightInfoPushedEvent, value); }
2021 remove { Events.RemoveHandler (RowHeightInfoPushedEvent, value); }
2024 public event DataGridViewCellEventHandler RowLeave {
2025 add { Events.AddHandler (RowLeaveEvent, value); }
2026 remove { Events.RemoveHandler (RowLeaveEvent, value); }
2029 public event DataGridViewRowEventHandler RowMinimumHeightChanged {
2030 add { Events.AddHandler (RowMinimumHeightChangedEvent, value); }
2031 remove { Events.RemoveHandler (RowMinimumHeightChangedEvent, value); }
2034 public event DataGridViewRowPostPaintEventHandler RowPostPaint {
2035 add { Events.AddHandler (RowPostPaintEvent, value); }
2036 remove { Events.RemoveHandler (RowPostPaintEvent, value); }
2039 public event DataGridViewRowPrePaintEventHandler RowPrePaint {
2040 add { Events.AddHandler (RowPrePaintEvent, value); }
2041 remove { Events.RemoveHandler (RowPrePaintEvent, value); }
2044 public event DataGridViewRowsAddedEventHandler RowsAdded {
2045 add { Events.AddHandler (RowsAddedEvent, value); }
2046 remove { Events.RemoveHandler (RowsAddedEvent, value); }
2049 public event EventHandler RowsDefaultCellStyleChanged {
2050 add { Events.AddHandler (RowsDefaultCellStyleChangedEvent, value); }
2051 remove { Events.RemoveHandler (RowsDefaultCellStyleChangedEvent, value); }
2054 public event DataGridViewRowsRemovedEventHandler RowsRemoved {
2055 add { Events.AddHandler (RowsRemovedEvent, value); }
2056 remove { Events.RemoveHandler (RowsRemovedEvent, value); }
2059 public event DataGridViewRowStateChangedEventHandler RowStateChanged {
2060 add { Events.AddHandler (RowStateChangedEvent, value); }
2061 remove { Events.RemoveHandler (RowStateChangedEvent, value); }
2064 [EditorBrowsable (EditorBrowsableState.Advanced)]
2065 public event DataGridViewRowEventHandler RowUnshared {
2066 add { Events.AddHandler (RowUnsharedEvent, value); }
2067 remove { Events.RemoveHandler (RowUnsharedEvent, value); }
2070 public event DataGridViewCellEventHandler RowValidated {
2071 add { Events.AddHandler (RowValidatedEvent, value); }
2072 remove { Events.RemoveHandler (RowValidatedEvent, value); }
2075 public event DataGridViewCellCancelEventHandler RowValidating {
2076 add { Events.AddHandler (RowValidatingEvent, value); }
2077 remove { Events.RemoveHandler (RowValidatingEvent, value); }
2080 public event ScrollEventHandler Scroll {
2081 add { Events.AddHandler (ScrollEvent, value); }
2082 remove { Events.RemoveHandler (ScrollEvent, value); }
2085 public event EventHandler SelectionChanged {
2086 add { Events.AddHandler (SelectionChangedEvent, value); }
2087 remove { Events.RemoveHandler (SelectionChangedEvent, value); }
2090 [EditorBrowsable (EditorBrowsableState.Advanced)]
2091 public event DataGridViewSortCompareEventHandler SortCompare {
2092 add { Events.AddHandler (SortCompareEvent, value); }
2093 remove { Events.RemoveHandler (SortCompareEvent, value); }
2096 public event EventHandler Sorted {
2097 add { Events.AddHandler (SortedEvent, value); }
2098 remove { Events.RemoveHandler (SortedEvent, value); }
2101 public event DataGridViewRowEventHandler UserAddedRow {
2102 add { Events.AddHandler (UserAddedRowEvent, value); }
2103 remove { Events.RemoveHandler (UserAddedRowEvent, value); }
2106 public event DataGridViewRowEventHandler UserDeletedRow {
2107 add { Events.AddHandler (UserDeletedRowEvent, value); }
2108 remove { Events.RemoveHandler (UserDeletedRowEvent, value); }
2111 public event DataGridViewRowCancelEventHandler UserDeletingRow {
2112 add { Events.AddHandler (UserDeletingRowEvent, value); }
2113 remove { Events.RemoveHandler (UserDeletingRowEvent, value); }
2117 [EditorBrowsable (EditorBrowsableState.Never)]
2118 public new event EventHandler StyleChanged {
2119 add { base.StyleChanged += value; }
2120 remove { base.StyleChanged -= value; }
2124 [EditorBrowsable (EditorBrowsableState.Never)]
2125 public new event EventHandler TextChanged {
2126 add { base.TextChanged += value; }
2127 remove { base.TextChanged -= value; }
2130 [EditorBrowsable (EditorBrowsableState.Advanced)]
2131 public virtual DataGridViewAdvancedBorderStyle AdjustColumnHeaderBorderStyle (DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStyleInput, DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStylePlaceholder, bool isFirstDisplayedColumn, bool isLastVisibleColumn) {
2132 return (DataGridViewAdvancedBorderStyle) ((ICloneable)dataGridViewAdvancedBorderStyleInput).Clone();
2135 public bool AreAllCellsSelected (bool includeInvisibleCells) {
2136 foreach (DataGridViewRow row in rows) {
2137 foreach (DataGridViewCell cell in row.Cells) {
2138 if (includeInvisibleCells == false && cell.Visible == false) {
2141 if (!cell.Selected) {
2149 public void AutoResizeColumn (int columnIndex) {
2150 AutoResizeColumn (columnIndex, DataGridViewAutoSizeColumnMode.AllCells);
2153 public void AutoResizeColumn (int columnIndex, DataGridViewAutoSizeColumnMode autoSizeColumnMode)
2155 AutoResizeColumnInternal (columnIndex, autoSizeColumnMode);
2158 public void AutoResizeColumnHeadersHeight ()
2162 foreach (DataGridViewColumn col in Columns)
2163 new_height = Math.Max (new_height, col.HeaderCell.PreferredSize.Height);
2165 if (ColumnHeadersHeight != new_height)
2166 ColumnHeadersHeight = new_height;
2169 [MonoTODO ("columnIndex parameter is not used")]
2170 public void AutoResizeColumnHeadersHeight (int columnIndex)
2172 AutoResizeColumnHeadersHeight ();
2175 public void AutoResizeColumns () {
2176 AutoResizeColumns (DataGridViewAutoSizeColumnsMode.AllCells);
2179 public void AutoResizeColumns (DataGridViewAutoSizeColumnsMode autoSizeColumnsMode) {
2180 AutoResizeColumns (autoSizeColumnsMode, true);
2183 public void AutoResizeRow (int rowIndex)
2185 AutoResizeRow (rowIndex, DataGridViewAutoSizeRowMode.AllCells, true);
2188 public void AutoResizeRow (int rowIndex, DataGridViewAutoSizeRowMode autoSizeRowMode)
2190 AutoResizeRow (rowIndex, autoSizeRowMode, true);
2193 public void AutoResizeRowHeadersWidth (DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode)
2195 if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToFirstHeader) {
2196 RowHeadersWidth = GetRowInternal (0).HeaderCell.PreferredSize.Width;
2202 if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders) {
2203 foreach (DataGridViewRow row in Rows)
2205 new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
2207 if (RowHeadersWidth != new_width)
2208 RowHeadersWidth = new_width;
2213 if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders) {
2214 foreach (DataGridViewRow row in Rows)
2215 new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
2217 if (RowHeadersWidth != new_width)
2218 RowHeadersWidth = new_width;
2224 [MonoTODO ("Does not use rowIndex parameter.")]
2225 public void AutoResizeRowHeadersWidth (int rowIndex, DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode)
2227 AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
2230 public void AutoResizeRows ()
2232 AutoResizeRows (0, Rows.Count, DataGridViewAutoSizeRowMode.AllCells, false);
2235 public void AutoResizeRows (DataGridViewAutoSizeRowsMode autoSizeRowsMode)
2237 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeRowsMode), autoSizeRowsMode))
2238 throw new InvalidEnumArgumentException ("Parameter autoSizeRowsMode is not a valid DataGridViewRowsMode.");
2239 if ((autoSizeRowsMode == DataGridViewAutoSizeRowsMode.AllHeaders || autoSizeRowsMode == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && rowHeadersVisible == false)
2240 throw new InvalidOperationException ("Parameter autoSizeRowsMode cannot be AllHeaders or DisplayedHeaders in this DataGridView.");
2241 if (autoSizeRowsMode == DataGridViewAutoSizeRowsMode.None)
2242 throw new ArgumentException ("Parameter autoSizeRowsMode cannot be None.");
2244 AutoResizeRows (autoSizeRowsMode, false);
2247 public virtual bool BeginEdit (bool selectAll) {
2248 if (currentCell == null || currentCell.IsInEditMode)
2251 if (currentCell.RowIndex >= 0) {
2252 if ((currentCell.InheritedState & DataGridViewElementStates.ReadOnly) == DataGridViewElementStates.ReadOnly) {
2257 DataGridViewCell cell = currentCell;
2258 Type editType = cell.EditType;
2260 if (editType == null && !(cell is IDataGridViewEditingCell))
2263 // Give user a chance to cancel the edit
2264 DataGridViewCellCancelEventArgs e = new DataGridViewCellCancelEventArgs (cell.ColumnIndex, cell.RowIndex);
2265 OnCellBeginEdit (e);
2270 // If the user begins an edit in the NewRow, add a new row
2271 if (CurrentCell.RowIndex == NewRowIndex) {
2272 new_row_commited = false;
2273 OnUserAddedRow (new DataGridViewRowEventArgs (Rows[NewRowIndex]));
2276 cell.SetIsInEditMode (true);
2278 // The cell has an editing control we need to setup
2279 if (editType != null) {
2280 Control ctrl = EditingControlInternal;
2282 // Check if we can reuse the one we already have
2283 bool isCorrectType = ctrl != null && ctrl.GetType () == editType;
2288 // We couldn't use the existing one, create a new one
2290 ctrl = (Control) Activator.CreateInstance (editType);
2291 EditingControlInternal = ctrl;
2294 // Call some functions that allows the editing control to get setup
2295 DataGridViewCellStyle style = cell.RowIndex == -1 ? DefaultCellStyle : cell.InheritedStyle;
2297 cell.InitializeEditingControl (cell.RowIndex, cell.FormattedValue, style);
2298 cell.PositionEditingControl (true, true, this.GetCellDisplayRectangle (cell.ColumnIndex, cell.RowIndex, false), bounds, style, false, false, (columns [cell.ColumnIndex].DisplayIndex == 0), (cell.RowIndex == 0));
2300 // Show the editing control
2301 EditingControlInternal.Visible = true;
2303 IDataGridViewEditingControl dgvEditingControl = (IDataGridViewEditingControl) EditingControlInternal;
2304 if (dgvEditingControl != null) {
2305 dgvEditingControl.EditingControlDataGridView = this;
2306 dgvEditingControl.EditingControlRowIndex = currentCell.OwningRow.Index;
2307 dgvEditingControl.ApplyCellStyleToEditingControl (style);
2308 dgvEditingControl.PrepareEditingControlForEdit (selectAll);
2309 dgvEditingControl.EditingControlFormattedValue = currentCell.EditedFormattedValue;
2314 // If we are here, it means we have a cell that does not have an editing control
2315 // and simply implements IDataGridViewEditingCell itself.
2316 (cell as IDataGridViewEditingCell).PrepareEditingCellForEdit (selectAll);
2321 public bool CancelEdit ()
2323 if (currentCell != null && currentCell.IsInEditMode) {
2324 // The user's typing caused a new row to be created, but
2325 // now they are canceling that typing, we have to remove
2326 // the new row we added.
2327 if (!new_row_commited) {
2328 DataGridViewRow delete_row = EditingRow;
2329 Rows.RemoveInternal (delete_row);
2330 editing_row = Rows[currentCell.RowIndex];
2331 OnUserDeletedRow (new DataGridViewRowEventArgs (delete_row));
2332 new_row_commited = true;
2335 currentCell.SetIsInEditMode (false);
2336 currentCell.DetachEditingControl ();
2337 OnCellEndEdit (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
2343 public void ClearSelection ()
2345 foreach (DataGridViewColumn col in SelectedColumns)
2346 col.Selected = false;
2347 foreach (DataGridViewRow row in SelectedRows)
2348 row.Selected = false;
2349 foreach (DataGridViewCell cell in SelectedCells)
2350 cell.Selected = false;
2353 public bool CommitEdit (DataGridViewDataErrorContexts context)
2355 if (currentCell != null && currentCell.OwningRow.DataBoundItem != null) {
2356 Object ob = currentCell.OwningRow.DataBoundItem;
2357 PropertyDescriptor property = TypeDescriptor.GetProperties (ob)[currentCell.OwningColumn.DataPropertyName];
2358 if (property != null && !property.IsReadOnly) {
2360 object value = currentCell.Value;
2361 if (property.Converter != null &&
2362 property.Converter.CanConvertFrom (value.GetType()))
2363 value = property.Converter.ConvertFrom (value);
2364 property.SetValue (ob, value);
2366 } catch (Exception exc) {
2367 DataGridViewDataErrorEventArgs args = new DataGridViewDataErrorEventArgs (exc, currentCell.ColumnIndex,
2368 currentCell.RowIndex, context);
2369 InternalOnDataError (args);
2370 if (args.ThrowException)
2380 [MonoTODO ("Always includes partial columns")]
2381 public int DisplayedColumnCount (bool includePartialColumns)
2385 for (int i = first_col_index; i < Columns.Count; i++)
2386 if (Columns.ColumnDisplayIndexSortedArrayList[i].Displayed)
2394 public int DisplayedRowCount (bool includePartialRow)
2399 if (ColumnHeadersVisible)
2400 rowTop += ColumnHeadersHeight;
2402 for (int index = first_row_index; index < Rows.Count; index++) {
2403 DataGridViewRow row = GetRowInternal (index);
2404 if (rowTop + row.Height < ClientSize.Height) {
2406 rowTop += row.Height;
2408 if (includePartialRow)
2417 public bool EndEdit ()
2419 return EndEdit (DataGridViewDataErrorContexts.Commit);
2422 [MonoTODO ("Does not use context parameter")]
2423 public bool EndEdit (DataGridViewDataErrorContexts context)
2425 if (currentCell == null || !currentCell.IsInEditMode)
2428 if (EditingControl != null) {
2429 IDataGridViewEditingControl ctrl = EditingControl as IDataGridViewEditingControl;
2430 currentCell.Value = ctrl.GetEditingControlFormattedValue (DataGridViewDataErrorContexts.Commit);
2431 if (!CommitEdit (context)) {
2432 EditingControl.Focus ();
2435 currentCell.DetachEditingControl ();
2436 } else if (currentCell is IDataGridViewEditingCell) {
2437 currentCell.Value = (currentCell as IDataGridViewEditingCell).EditingCellFormattedValue;
2438 if (!CommitEdit (context))
2442 currentCell.SetIsInEditMode (false);
2443 new_row_commited = true;
2444 OnCellEndEdit (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
2449 public int GetCellCount (DataGridViewElementStates includeFilter) {
2451 foreach (DataGridViewRow row in rows) {
2452 foreach (DataGridViewCell cell in row.Cells) {
2453 if ((cell.State & includeFilter) != 0) {
2461 internal DataGridViewRow GetRowInternal (int rowIndex)
2463 return Rows.SharedRow (rowIndex);
2466 internal DataGridViewCell GetCellInternal (int colIndex, int rowIndex)
2468 return GetRowInternal (rowIndex).Cells.GetCellInternal (colIndex);
2471 public Rectangle GetCellDisplayRectangle (int columnIndex, int rowIndex, bool cutOverflow) {
2472 if (columnIndex < 0 || columnIndex >= columns.Count) {
2473 throw new ArgumentOutOfRangeException("Column index is out of range.");
2476 int x = 0, y = 0, w = 0, h = 0;
2481 if (ColumnHeadersVisible)
2482 y += ColumnHeadersHeight;
2484 if (RowHeadersVisible)
2485 x += RowHeadersWidth;
2487 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2489 for (int i = first_col_index; i < cols.Count; i++) {
2490 if (!cols[i].Visible)
2493 if (cols[i].Index == columnIndex) {
2501 for (int i = first_row_index; i < Rows.Count; i++) {
2502 if (i == rowIndex) {
2503 h = rows [i].Height;
2507 y += rows [i].Height;
2510 return new Rectangle (x, y, w, h);
2513 public virtual DataObject GetClipboardContent () {
2515 if (clipboardCopyMode == DataGridViewClipboardCopyMode.Disable)
2516 throw new InvalidOperationException ("Generating Clipboard content is not supported when the ClipboardCopyMode property is Disable.");
2518 int start_row = int.MaxValue, end_row = int.MinValue;
2519 int start_col = int.MaxValue, end_col = int.MinValue;
2521 bool include_row_headers = false;
2522 bool include_col_headers = false;
2523 bool only_included_headers = false;
2524 bool headers_includable = false;
2526 switch (ClipboardCopyMode) {
2527 case DataGridViewClipboardCopyMode.EnableWithoutHeaderText:
2529 case DataGridViewClipboardCopyMode.EnableWithAutoHeaderText:
2530 // Headers are included if not selection mode is CellSelect, and any header is selected.
2531 headers_includable = selectionMode != DataGridViewSelectionMode.CellSelect;
2533 case DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText:
2534 include_col_headers = include_row_headers = true;
2538 BitArray included_rows = new BitArray (RowCount);
2539 BitArray included_cols = new BitArray (ColumnCount);
2541 // If there are any selected columns,
2542 // include the column headers (if headers are to be shown).
2543 if (headers_includable && !include_col_headers) {
2544 for (int c = 0; c < ColumnCount; c++) {
2545 if (Columns [c].Selected) {
2546 include_col_headers = true;
2552 // Find the smallest rectangle that encompasses all selected cells.
2553 for (int r = 0; r < RowCount; r++) {
2554 DataGridViewRow row = Rows [r];
2556 if (headers_includable && !include_row_headers && row.Selected) {
2557 include_row_headers = true;
2560 for (int c = 0; c < ColumnCount; c++) {
2561 DataGridViewCell cell = row.Cells [c];
2563 if (cell == null || !cell.Selected)
2566 included_cols [c] = true;
2567 included_rows [r] = true;
2569 start_row = Math.Min (start_row, r);
2570 start_col = Math.Min (start_col, c);
2571 end_row = Math.Max (end_row, r);
2572 end_col = Math.Max (end_col, c);
2576 // Mark rows/columns in between selected cells as included if the selection mode isn't FullHeaderSelect.
2577 switch (selectionMode){
2578 case DataGridViewSelectionMode.CellSelect:
2579 case DataGridViewSelectionMode.ColumnHeaderSelect:
2580 case DataGridViewSelectionMode.RowHeaderSelect:
2581 if (selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect) {
2582 for (int r = start_row; r <= end_row; r++) {
2583 included_rows.Set (r, true);
2585 } else if (start_row <= end_row) {
2586 included_rows.SetAll (true);
2588 if (selectionMode != DataGridViewSelectionMode.RowHeaderSelect) {
2589 for (int c = start_col; c <= end_col; c++) {
2590 included_cols.Set (c, true);
2594 case DataGridViewSelectionMode.FullColumnSelect:
2595 case DataGridViewSelectionMode.FullRowSelect:
2596 only_included_headers = true;
2600 if (start_row > end_row)
2603 if (start_col > end_col)
2606 DataObject result = new DataObject ();
2608 System.Text.StringBuilder text_builder = new System.Text.StringBuilder ();
2609 System.Text.StringBuilder utext_builder = new System.Text.StringBuilder ();
2610 System.Text.StringBuilder html_builder = new System.Text.StringBuilder ();
2611 System.Text.StringBuilder csv_builder = new System.Text.StringBuilder ();
2613 // Loop through all rows and columns to create the content.
2614 // -1 is the header row/column.
2615 int first_row = start_row;
2616 int first_col = start_col;
2617 if (include_col_headers) {
2620 for (int r = first_row; r <= end_row; r++) {
2621 DataGridViewRow row = null;
2624 if (!included_rows [r])
2630 if (include_row_headers) {
2634 for (int c = first_col; c <= end_col; c++) {
2635 DataGridViewCell cell = null;
2637 if (c >= 0 && only_included_headers && !included_cols [c])
2642 cell = TopLeftHeaderCell;
2644 cell = Columns [c].HeaderCell;
2648 cell = row.HeaderCell;
2650 cell = row.Cells [c];
2654 string text, utext, html, csv;
2655 bool is_first_cell = (c == first_col);
2656 bool is_last_cell = (c == end_col);
2657 bool is_first_row = (r == first_row);
2658 bool is_last_row = (r == end_row);
2661 text = string.Empty;
2662 utext = string.Empty;
2663 html = string.Empty;
2666 text = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.Text) as string;
2667 utext = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.UnicodeText) as string;
2668 html = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.Html) as string;
2669 csv = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.CommaSeparatedValue) as string;
2672 text_builder.Append (text);
2673 utext_builder.Append (utext);
2674 html_builder.Append (html);
2675 csv_builder.Append (csv);
2677 if (c == -1) { // If we just did the row header, jump to the first column.
2682 if (r == -1) {// If we just did the column header, jump to the first row.
2688 // Html content always get the \r\n newline
2689 // It's valid html anyway, and it eases testing quite a bit
2690 // (since otherwise we'd have to change the start indices
2691 // in the added prologue/epilogue text)
2693 int fragment_end = 135 + html_builder.Length;
2694 int html_end = fragment_end + 36;
2697 "StartHTML:00000097{0}" +
2698 "EndHTML:{1:00000000}{0}" +
2699 "StartFragment:00000133{0}" +
2700 "EndFragment:{2:00000000}{0}" +
2703 "<!--StartFragment-->";
2705 html_start = string.Format (html_start, "\r\n", html_end, fragment_end);
2706 html_builder.Insert (0, html_start);
2707 html_builder.AppendFormat ("{0}<!--EndFragment-->{0}</BODY>{0}</HTML>", "\r\n");
2709 result.SetData (DataFormats.CommaSeparatedValue, false, csv_builder.ToString ());
2710 result.SetData (DataFormats.Html, false, html_builder.ToString ());
2711 result.SetData (DataFormats.UnicodeText, false, utext_builder.ToString ());
2712 result.SetData (DataFormats.Text, false, text_builder.ToString ());
2717 [MonoTODO ("Does not use cutOverflow parameter")]
2718 public Rectangle GetColumnDisplayRectangle (int columnIndex, bool cutOverflow)
2720 if (columnIndex < 0 || columnIndex > Columns.Count - 1)
2721 throw new ArgumentOutOfRangeException ("columnIndex");
2728 if (RowHeadersVisible)
2729 x += RowHeadersWidth;
2731 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2733 for (int i = first_col_index; i < cols.Count; i++) {
2734 if (!cols[i].Visible)
2737 if (cols[i].Index == columnIndex) {
2745 return new Rectangle (x, 0, w, Height);
2748 [MonoTODO ("Does not use cutOverflow parameter")]
2749 public Rectangle GetRowDisplayRectangle (int rowIndex, bool cutOverflow)
2751 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
2752 throw new ArgumentOutOfRangeException ("rowIndex");
2759 if (ColumnHeadersVisible)
2760 y += ColumnHeadersHeight;
2762 for (int i = first_row_index; i < Rows.Count; i++) {
2763 if (i == rowIndex) {
2768 y += rows[i].Height;
2771 return new Rectangle (0, y, Width, h);
2774 public HitTestInfo HitTest (int x, int y) {
2775 ///////////////////////////////////////////////////////
2776 //Console.WriteLine ("HitTest ({0}, {1})", x, y);
2777 bool isInColHeader = columnHeadersVisible && y >= 0 && y <= ColumnHeadersHeight;
2778 bool isInRowHeader = rowHeadersVisible && x >= 0 && x <= RowHeadersWidth;
2781 if (isInColHeader && isInRowHeader)
2782 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.TopLeftHeader);
2784 // HorizontalScrollBar
2785 if (horizontalScrollBar.Visible && horizontalScrollBar.Bounds.Contains (x, y))
2786 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.HorizontalScrollBar);
2788 // VerticalScrollBar
2789 if (verticalScrollBar.Visible && verticalScrollBar.Bounds.Contains (x, y))
2790 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.VerticalScrollBar);
2792 // The little box in the bottom right if both scrollbars are shown is None
2793 if (verticalScrollBar.Visible && horizontalScrollBar.Visible)
2794 if (new Rectangle (verticalScrollBar.Left, horizontalScrollBar.Top, verticalScrollBar.Width, horizontalScrollBar.Height).Contains (x, y))
2795 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.None);
2800 int top = columnHeadersVisible ? columnHeadersHeight : 0;
2802 for (int i = first_row_index; i < Rows.Count; i++) {
2803 DataGridViewRow row = Rows[i];
2805 if (y > top && y <= (top + row.Height)) {
2813 int left = rowHeadersVisible ? RowHeadersWidth : 0;
2815 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2817 for (int i = first_col_index; i < cols.Count; i++) {
2818 if (!cols[i].Visible)
2821 if (x > left && x <= (left + cols[i].Width)) {
2822 colindex = cols[i].Index;
2826 left += cols[i].Width;
2829 if (colindex >= 0 && rowindex >= 0)
2830 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.Cell);
2832 if (isInColHeader && colindex > -1)
2833 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.ColumnHeader);
2835 if (isInRowHeader && rowindex > -1)
2836 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.RowHeader);
2838 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.None);
2841 [MonoTODO ("Invalidates whole grid")]
2842 public void InvalidateCell (DataGridViewCell dataGridViewCell)
2844 if (dataGridViewCell == null)
2845 throw new ArgumentNullException ("Cell is null");
2847 if (dataGridViewCell.DataGridView != this)
2848 throw new ArgumentException ("The specified cell does not belong to this DataGridView.");
2850 InvalidateCell (dataGridViewCell.ColumnIndex, dataGridViewCell.RowIndex);
2853 [MonoTODO ("Invalidates whole grid")]
2854 public void InvalidateCell (int columnIndex, int rowIndex)
2856 if (columnIndex < 0 || columnIndex >= columns.Count)
2857 throw new ArgumentOutOfRangeException ("Column index is out of range.");
2859 if (rowIndex < 0 || rowIndex >= rows.Count)
2860 throw new ArgumentOutOfRangeException ("Row index is out of range.");
2862 Invalidate (GetCellDisplayRectangle (columnIndex, rowIndex, true));
2865 [MonoTODO ("Invalidates whole grid")]
2866 public void InvalidateColumn (int columnIndex)
2868 if (columnIndex < 0 || columnIndex >= columns.Count)
2869 throw new ArgumentOutOfRangeException ("Column index is out of range.");
2871 Invalidate (GetColumnDisplayRectangle (columnIndex, true));
2874 [MonoTODO ("Invalidates whole grid")]
2875 public void InvalidateRow (int rowIndex)
2877 if (rowIndex < 0 || rowIndex >= rows.Count)
2878 throw new ArgumentOutOfRangeException ("Row index is out of range.");
2880 Invalidate (GetRowDisplayRectangle (rowIndex, true));
2883 public virtual void NotifyCurrentCellDirty (bool dirty) {
2884 if (currentCell != null)
2885 InvalidateCell (currentCell);
2888 public bool RefreshEdit ()
2890 if (IsCurrentCellInEditMode) {
2891 currentCell.InitializeEditingControl (currentCell.RowIndex, currentCell.FormattedValue, currentCell.InheritedStyle);
2898 [EditorBrowsable (EditorBrowsableState.Never)]
2899 public override void ResetText ()
2901 Text = string.Empty;
2904 public void SelectAll () {
2905 switch (selectionMode) {
2906 case DataGridViewSelectionMode.FullRowSelect:
2907 foreach (DataGridViewRow row in rows) {
2908 (row as DataGridViewBand).Selected = true;
2911 case DataGridViewSelectionMode.FullColumnSelect:
2912 foreach (DataGridViewColumn col in columns) {
2913 (col as DataGridViewBand).Selected = true;
2917 foreach (DataGridViewRow row in rows) {
2918 foreach (DataGridViewCell cell in row.Cells) {
2919 cell.Selected = true;
2928 public virtual void Sort (IComparer comparer)
2930 if (comparer == null)
2931 throw new ArgumentNullException ("comparer");
2932 if (VirtualMode || DataSource != null)
2933 throw new InvalidOperationException ();
2935 if (SortedColumn != null)
2936 SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
2940 Rows.Sort (comparer);
2942 sortedColumn = null;
2943 sortOrder = SortOrder.None;
2949 OnSorted (EventArgs.Empty);
2952 public virtual void Sort (DataGridViewColumn dataGridViewColumn, ListSortDirection direction)
2954 if (dataGridViewColumn == null)
2955 throw new ArgumentNullException ("dataGridViewColumn");
2956 if (dataGridViewColumn.DataGridView != this)
2957 throw new ArgumentException ("dataGridViewColumn");
2962 if (SortedColumn != null)
2963 SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
2965 sortedColumn = dataGridViewColumn;
2966 sortOrder = direction == ListSortDirection.Ascending ? SortOrder.Ascending : SortOrder.Descending;
2968 if (Rows.Count == 0)
2971 IBindingList bindingList = DataSource as IBindingList;
2972 if (dataGridViewColumn.IsDataBound) {
2973 if (bindingList != null && bindingList.SupportsSorting) {
2974 bindingList.ApplySort (DataManager.GetItemProperties()[dataGridViewColumn.DataPropertyName], direction);
2975 dataGridViewColumn.HeaderCell.SortGlyphDirection = sortOrder;
2978 // Figure out if this is a numeric sort or text sort
2979 bool is_numeric = true;
2982 foreach (DataGridViewRow row in Rows) {
2983 object val = row.Cells[dataGridViewColumn.Index].Value;
2985 if (val != null && !double.TryParse (val.ToString (), out n)) {
2991 ColumnSorter sorter = new ColumnSorter (dataGridViewColumn, direction, is_numeric);
2993 dataGridViewColumn.HeaderCell.SortGlyphDirection = sortOrder;
2997 OnSorted (EventArgs.Empty);
3000 public void UpdateCellErrorText (int columnIndex, int rowIndex)
3002 if (columnIndex < 0 || columnIndex > Columns.Count - 1)
3003 throw new ArgumentOutOfRangeException ("columnIndex");
3004 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3005 throw new ArgumentOutOfRangeException ("rowIndex");
3007 InvalidateCell (columnIndex, rowIndex);
3010 public void UpdateCellValue (int columnIndex, int rowIndex)
3012 if (columnIndex < 0 || columnIndex > Columns.Count - 1)
3013 throw new ArgumentOutOfRangeException ("columnIndex");
3014 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3015 throw new ArgumentOutOfRangeException ("rowIndex");
3017 InvalidateCell (columnIndex, rowIndex);
3020 public void UpdateRowErrorText (int rowIndex)
3022 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3023 throw new ArgumentOutOfRangeException ("rowIndex");
3025 InvalidateRow (rowIndex);
3028 public void UpdateRowErrorText (int rowIndexStart, int rowIndexEnd)
3030 if (rowIndexStart < 0 || rowIndexStart > Rows.Count - 1)
3031 throw new ArgumentOutOfRangeException ("rowIndexStart");
3032 if (rowIndexEnd < 0 || rowIndexEnd > Rows.Count - 1)
3033 throw new ArgumentOutOfRangeException ("rowIndexEnd");
3034 if (rowIndexEnd < rowIndexStart)
3035 throw new ArgumentOutOfRangeException ("rowIndexEnd", "rowIndexEnd must be greater than rowIndexStart");
3037 for (int i = rowIndexStart; i <= rowIndexEnd; i++)
3041 public void UpdateRowHeightInfo (int rowIndex, bool updateToEnd) {
3042 throw new NotImplementedException();
3045 protected override bool CanEnableIme {
3047 if (CurrentCell != null && CurrentCell.EditType != null)
3054 protected override Size DefaultSize {
3055 get { return new Size (240, 150); }
3058 protected ScrollBar HorizontalScrollBar {
3059 get { return horizontalScrollBar; }
3062 protected ScrollBar VerticalScrollBar {
3063 get { return verticalScrollBar; }
3066 protected virtual void AccessibilityNotifyCurrentCellChanged (Point cellAddress)
3068 throw new NotImplementedException ();
3071 [MonoTODO ("Does not use fixedHeight parameter")]
3072 protected void AutoResizeColumn (int columnIndex, DataGridViewAutoSizeColumnMode autoSizeColumnMode, bool fixedHeight)
3074 AutoResizeColumn (columnIndex, autoSizeColumnMode);
3077 [MonoTODO ("Does not use fixedRowHeadersWidth or fixedColumnsWidth parameters")]
3078 protected void AutoResizeColumnHeadersHeight (bool fixedRowHeadersWidth, bool fixedColumnsWidth)
3080 AutoResizeColumnHeadersHeight ();
3083 [MonoTODO ("Does not use columnIndex or fixedRowHeadersWidth or fixedColumnsWidth parameters")]
3084 protected void AutoResizeColumnHeadersHeight (int columnIndex, bool fixedRowHeadersWidth, bool fixedColumnWidth)
3086 AutoResizeColumnHeadersHeight (columnIndex);
3089 protected void AutoResizeColumns (DataGridViewAutoSizeColumnsMode autoSizeColumnsMode, bool fixedHeight) {
3090 for (int i = 0; i < Columns.Count; i++) {
3091 AutoResizeColumn (i, (DataGridViewAutoSizeColumnMode) autoSizeColumnsMode, fixedHeight);
3095 [MonoTODO ("Does not use fixedWidth parameter")]
3096 protected void AutoResizeRow (int rowIndex, DataGridViewAutoSizeRowMode autoSizeRowMode, bool fixedWidth)
3098 if (autoSizeRowMode == DataGridViewAutoSizeRowMode.RowHeader && !rowHeadersVisible)
3099 throw new InvalidOperationException ("row headers are not visible");
3100 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3101 throw new ArgumentOutOfRangeException ("rowIndex");
3103 DataGridViewRow row = GetRowInternal (rowIndex);
3105 int new_height = row.GetPreferredHeight (rowIndex, autoSizeRowMode, true);
3107 if (row.Height != new_height)
3108 row.SetAutoSizeHeight (new_height);
3111 [MonoTODO ("Does not use fixedColumnHeadersHeight or fixedRowsHeight parameter")]
3112 protected void AutoResizeRowHeadersWidth (DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode, bool fixedColumnHeadersHeight, bool fixedRowsHeight)
3114 AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
3117 [MonoTODO ("Does not use rowIndex or fixedColumnHeadersHeight or fixedRowsHeight parameter")]
3118 protected void AutoResizeRowHeadersWidth (int rowIndex, DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode, bool fixedColumnHeadersHeight, bool fixedRowHeight)
3120 AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
3123 [MonoTODO ("Does not use fixedWidth parameter")]
3124 protected void AutoResizeRows (DataGridViewAutoSizeRowsMode autoSizeRowsMode, bool fixedWidth)
3126 if (autoSizeRowsMode == DataGridViewAutoSizeRowsMode.None)
3129 bool displayed_only = false;
3130 DataGridViewAutoSizeRowMode mode = DataGridViewAutoSizeRowMode.AllCells;
3132 switch (autoSizeRowsMode) {
3133 case DataGridViewAutoSizeRowsMode.AllHeaders:
3134 mode = DataGridViewAutoSizeRowMode.RowHeader;
3136 case DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders:
3137 mode = DataGridViewAutoSizeRowMode.AllCellsExceptHeader;
3139 case DataGridViewAutoSizeRowsMode.AllCells:
3140 mode = DataGridViewAutoSizeRowMode.AllCells;
3142 case DataGridViewAutoSizeRowsMode.DisplayedHeaders:
3143 mode = DataGridViewAutoSizeRowMode.RowHeader;
3144 displayed_only = true;
3146 case DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders:
3147 mode = DataGridViewAutoSizeRowMode.AllCellsExceptHeader;
3148 displayed_only = true;
3150 case DataGridViewAutoSizeRowsMode.DisplayedCells:
3151 mode = DataGridViewAutoSizeRowMode.AllCells;
3152 displayed_only = true;
3156 foreach (DataGridViewRow row in Rows) {
3157 if (!displayed_only || row.Displayed) {
3158 int new_height = row.GetPreferredHeight (row.Index, mode, fixedWidth);
3160 if (row.Height != new_height)
3161 row.SetAutoSizeHeight (new_height);
3166 [MonoTODO ("Does not use fixedMode parameter")]
3167 protected void AutoResizeRows (int rowIndexStart, int rowsCount, DataGridViewAutoSizeRowMode autoSizeRowMode, bool fixedWidth)
3169 for (int i = rowIndexStart; i < rowIndexStart + rowsCount; i++)
3170 AutoResizeRow (i, autoSizeRowMode, fixedWidth);
3173 protected void ClearSelection (int columnIndexException, int rowIndexException, bool selectExceptionElement) {
3174 if (columnIndexException >= columns.Count) {
3175 throw new ArgumentOutOfRangeException("ColumnIndexException is greater than the highest column index.");
3177 if (selectionMode == DataGridViewSelectionMode.FullRowSelect) {
3178 if (columnIndexException < -1) {
3179 throw new ArgumentOutOfRangeException("ColumnIndexException is less than -1.");
3183 if (columnIndexException < 0) {
3184 throw new ArgumentOutOfRangeException("ColumnIndexException is less than 0.");
3187 if (rowIndexException >= rows.Count) {
3188 throw new ArgumentOutOfRangeException("RowIndexException is greater than the highest row index.");
3190 if (selectionMode == DataGridViewSelectionMode.FullColumnSelect) {
3191 if (rowIndexException < -1) {
3192 throw new ArgumentOutOfRangeException("RowIndexException is less than -1.");
3196 if (rowIndexException < 0) {
3197 throw new ArgumentOutOfRangeException("RowIndexException is less than 0.");
3200 switch (selectionMode) {
3201 case DataGridViewSelectionMode.FullRowSelect:
3202 foreach (DataGridViewRow row in rows) {
3203 if (selectExceptionElement && row.Index == rowIndexException) {
3206 SetSelectedRowCore (row.Index, false);
3209 case DataGridViewSelectionMode.FullColumnSelect:
3210 foreach (DataGridViewColumn col in columns) {
3211 if (selectExceptionElement && col.Index == columnIndexException) {
3214 SetSelectedColumnCore (col.Index, false);
3218 foreach (DataGridViewCell cell in SelectedCells) {
3219 if (selectExceptionElement && cell.RowIndex == rowIndexException && cell.ColumnIndex == columnIndexException) {
3222 SetSelectedCellCore (cell.ColumnIndex, cell.RowIndex, false);
3228 protected override AccessibleObject CreateAccessibilityInstance ()
3230 return new DataGridViewAccessibleObject(this);
3233 [EditorBrowsable (EditorBrowsableState.Advanced)]
3234 protected virtual DataGridViewColumnCollection CreateColumnsInstance ()
3236 return new DataGridViewColumnCollection(this);
3239 protected override Control.ControlCollection CreateControlsInstance ()
3241 return new DataGridViewControlCollection (this);
3244 [EditorBrowsable (EditorBrowsableState.Advanced)]
3245 protected virtual DataGridViewRowCollection CreateRowsInstance ()
3247 return new DataGridViewRowCollection(this);
3250 protected override void Dispose (bool disposing) {
3253 protected override AccessibleObject GetAccessibilityObjectById (int objectId)
3255 throw new NotImplementedException();
3258 protected override bool IsInputChar (char charCode)
3263 protected override bool IsInputKey (Keys keyData)
3265 // Don't look at the modifiers
3266 keyData = keyData & ~Keys.Modifiers;
3288 protected virtual void OnAllowUserToAddRowsChanged (EventArgs e)
3290 EventHandler eh = (EventHandler)(Events [AllowUserToAddRowsChangedEvent]);
3295 protected virtual void OnAllowUserToDeleteRowsChanged (EventArgs e)
3297 EventHandler eh = (EventHandler)(Events [AllowUserToDeleteRowsChangedEvent]);
3302 protected virtual void OnAllowUserToOrderColumnsChanged (EventArgs e)
3304 EventHandler eh = (EventHandler)(Events [AllowUserToOrderColumnsChangedEvent]);
3309 protected virtual void OnAllowUserToResizeColumnsChanged (EventArgs e)
3311 EventHandler eh = (EventHandler)(Events [AllowUserToResizeColumnsChangedEvent]);
3316 protected virtual void OnAllowUserToResizeRowsChanged (EventArgs e)
3318 EventHandler eh = (EventHandler)(Events [AllowUserToResizeRowsChangedEvent]);
3323 protected virtual void OnAlternatingRowsDefaultCellStyleChanged (EventArgs e)
3325 EventHandler eh = (EventHandler)(Events [AlternatingRowsDefaultCellStyleChangedEvent]);
3330 protected virtual void OnAutoGenerateColumnsChanged (EventArgs e)
3332 EventHandler eh = (EventHandler)(Events [AutoGenerateColumnsChangedEvent]);
3337 protected internal virtual void OnAutoSizeColumnModeChanged (DataGridViewAutoSizeColumnModeEventArgs e)
3339 DataGridViewAutoSizeColumnModeEventHandler eh = (DataGridViewAutoSizeColumnModeEventHandler)(Events [AutoSizeColumnModeChangedEvent]);
3344 protected virtual void OnAutoSizeColumnsModeChanged (DataGridViewAutoSizeColumnsModeEventArgs e)
3346 DataGridViewAutoSizeColumnsModeEventHandler eh = (DataGridViewAutoSizeColumnsModeEventHandler)(Events [AutoSizeColumnsModeChangedEvent]);
3351 protected virtual void OnAutoSizeRowsModeChanged (DataGridViewAutoSizeModeEventArgs e)
3353 DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [AutoSizeRowsModeChangedEvent]);
3358 protected virtual void OnBackgroundColorChanged (EventArgs e)
3360 EventHandler eh = (EventHandler)(Events [BackgroundColorChangedEvent]);
3365 protected override void OnBindingContextChanged (EventArgs e)
3367 base.OnBindingContextChanged(e);
3368 if (!in_binding_context_changed) {
3369 in_binding_context_changed = true;
3371 in_binding_context_changed = true;
3375 protected virtual void OnBorderStyleChanged (EventArgs e)
3377 EventHandler eh = (EventHandler)(Events [BorderStyleChangedEvent]);
3382 protected virtual void OnCancelRowEdit (QuestionEventArgs e) {
3383 QuestionEventHandler eh = (QuestionEventHandler)(Events [CancelRowEditEvent]);
3388 protected virtual void OnCellBeginEdit (DataGridViewCellCancelEventArgs e)
3390 DataGridViewCellCancelEventHandler eh = (DataGridViewCellCancelEventHandler)(Events [CellBeginEditEvent]);
3395 protected virtual void OnCellBorderStyleChanged (EventArgs e)
3397 EventHandler eh = (EventHandler)(Events [CellBorderStyleChangedEvent]);
3402 protected virtual void OnCellClick (DataGridViewCellEventArgs e)
3404 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3406 cell.OnClickInternal (e);
3408 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellClickEvent]);
3413 protected virtual void OnCellContentClick (DataGridViewCellEventArgs e)
3415 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3417 cell.OnContentClickInternal (e);
3419 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContentClickEvent]);
3424 protected virtual void OnCellContentDoubleClick (DataGridViewCellEventArgs e)
3426 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3428 cell.OnContentDoubleClickInternal (e);
3430 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContentDoubleClickEvent]);
3435 protected virtual void OnCellContextMenuStripChanged (DataGridViewCellEventArgs e)
3437 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContextMenuStripChangedEvent]);
3442 protected virtual void OnCellContextMenuStripNeeded (DataGridViewCellContextMenuStripNeededEventArgs e)
3444 DataGridViewCellContextMenuStripNeededEventHandler eh = (DataGridViewCellContextMenuStripNeededEventHandler)(Events [CellContextMenuStripNeededEvent]);
3449 protected virtual void OnCellDoubleClick (DataGridViewCellEventArgs e)
3451 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3453 cell.OnDoubleClickInternal (e);
3454 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellDoubleClickEvent]);
3459 protected virtual void OnCellEndEdit (DataGridViewCellEventArgs e)
3461 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellEndEditEvent]);
3466 protected virtual void OnCellEnter (DataGridViewCellEventArgs e)
3468 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellEnterEvent]);
3473 protected internal virtual void OnCellErrorTextChanged (DataGridViewCellEventArgs e)
3475 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellErrorTextChangedEvent]);
3480 protected virtual void OnCellErrorTextNeeded (DataGridViewCellErrorTextNeededEventArgs e)
3482 DataGridViewCellErrorTextNeededEventHandler eh = (DataGridViewCellErrorTextNeededEventHandler)(Events [CellErrorTextNeededEvent]);
3487 internal void OnCellFormattingInternal (DataGridViewCellFormattingEventArgs e)
3489 OnCellFormatting (e);
3492 protected virtual void OnCellFormatting (DataGridViewCellFormattingEventArgs e)
3494 DataGridViewCellFormattingEventHandler eh = (DataGridViewCellFormattingEventHandler)(Events [CellFormattingEvent]);
3499 protected virtual void OnCellLeave (DataGridViewCellEventArgs e)
3501 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellLeaveEvent]);
3506 protected virtual void OnCellMouseClick (DataGridViewCellMouseEventArgs e)
3508 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3510 cell.OnMouseClickInternal (e);
3512 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseClickEvent]);
3517 protected virtual void OnCellMouseDoubleClick (DataGridViewCellMouseEventArgs e)
3519 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3521 cell.OnMouseDoubleClickInternal (e);
3523 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseDoubleClickEvent]);
3528 protected virtual void OnCellMouseDown (DataGridViewCellMouseEventArgs e)
3531 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3533 cell.OnMouseDownInternal (e);
3535 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseDownEvent]);
3540 protected virtual void OnCellMouseEnter (DataGridViewCellEventArgs e)
3542 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3544 cell.OnMouseEnterInternal (e.RowIndex);
3546 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellMouseEnterEvent]);
3551 protected virtual void OnCellMouseLeave (DataGridViewCellEventArgs e)
3553 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3555 cell.OnMouseLeaveInternal (e.RowIndex);
3557 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellMouseLeaveEvent]);
3562 protected virtual void OnCellMouseMove (DataGridViewCellMouseEventArgs e)
3564 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3566 cell.OnMouseMoveInternal (e);
3568 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseMoveEvent]);
3573 protected virtual void OnCellMouseUp (DataGridViewCellMouseEventArgs e)
3575 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3577 cell.OnMouseUpInternal (e);
3579 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseUpEvent]);
3584 internal void OnCellPaintingInternal (DataGridViewCellPaintingEventArgs e)
3589 protected virtual void OnCellPainting (DataGridViewCellPaintingEventArgs e)
3591 DataGridViewCellPaintingEventHandler eh = (DataGridViewCellPaintingEventHandler)(Events [CellPaintingEvent]);
3596 protected internal virtual void OnCellParsing (DataGridViewCellParsingEventArgs e)
3598 DataGridViewCellParsingEventHandler eh = (DataGridViewCellParsingEventHandler)(Events [CellParsingEvent]);
3603 internal void OnCellStateChangedInternal (DataGridViewCellStateChangedEventArgs e) {
3604 this.OnCellStateChanged (e);
3607 protected virtual void OnCellStateChanged (DataGridViewCellStateChangedEventArgs e)
3609 DataGridViewCellStateChangedEventHandler eh = (DataGridViewCellStateChangedEventHandler)(Events [CellStateChangedEvent]);
3614 protected virtual void OnCellStyleChanged (DataGridViewCellEventArgs e)
3616 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellStyleChangedEvent]);
3621 protected virtual void OnCellStyleContentChanged (DataGridViewCellStyleContentChangedEventArgs e) {
3622 DataGridViewCellStyleContentChangedEventHandler eh = (DataGridViewCellStyleContentChangedEventHandler)(Events [CellStyleContentChangedEvent]);
3627 protected virtual void OnCellToolTipTextChanged (DataGridViewCellEventArgs e) {
3628 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellToolTipTextChangedEvent]);
3633 protected virtual void OnCellToolTipTextNeeded (DataGridViewCellToolTipTextNeededEventArgs e)
3635 DataGridViewCellToolTipTextNeededEventHandler eh = (DataGridViewCellToolTipTextNeededEventHandler)(Events [CellToolTipTextNeededEvent]);
3640 protected virtual void OnCellValidated (DataGridViewCellEventArgs e)
3642 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellValidatedEvent]);
3647 protected virtual void OnCellValidating (DataGridViewCellValidatingEventArgs e)
3649 DataGridViewCellValidatingEventHandler eh = (DataGridViewCellValidatingEventHandler)(Events [CellValidatingEvent]);
3654 protected virtual void OnCellValueChanged (DataGridViewCellEventArgs e)
3656 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellValueChangedEvent]);
3661 protected internal virtual void OnCellValueNeeded (DataGridViewCellValueEventArgs e)
3663 DataGridViewCellValueEventHandler eh = (DataGridViewCellValueEventHandler)(Events [CellValueNeededEvent]);
3668 protected virtual void OnCellValuePushed (DataGridViewCellValueEventArgs e)
3670 DataGridViewCellValueEventHandler eh = (DataGridViewCellValueEventHandler)(Events [CellValuePushedEvent]);
3675 internal void OnColumnAddedInternal (DataGridViewColumnEventArgs e)
3677 if (e.Column.CellTemplate != null) {
3678 // The first column has just been added programatically instead of
3679 // autogenerated so we need to create the rows for the first time.
3681 if (!is_autogenerating_columns && columns.Count == 1)
3684 foreach (DataGridViewRow row in Rows)
3685 row.Cells.Add ((DataGridViewCell)e.Column.CellTemplate.Clone ());
3688 AutoResizeColumnsInternal ();
3690 PrepareEditingRow (false, true);
3693 protected virtual void OnColumnAdded (DataGridViewColumnEventArgs e)
3695 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnAddedEvent]);
3700 protected internal virtual void OnColumnContextMenuStripChanged (DataGridViewColumnEventArgs e)
3702 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnContextMenuStripChangedEvent]);
3707 protected internal virtual void OnColumnDataPropertyNameChanged (DataGridViewColumnEventArgs e)
3709 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDataPropertyNameChangedEvent]);
3714 protected internal virtual void OnColumnDefaultCellStyleChanged (DataGridViewColumnEventArgs e)
3716 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDefaultCellStyleChangedEvent]);
3721 protected internal virtual void OnColumnDisplayIndexChanged (DataGridViewColumnEventArgs e)
3723 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDisplayIndexChangedEvent]);
3728 protected virtual void OnColumnDividerDoubleClick (DataGridViewColumnDividerDoubleClickEventArgs e)
3730 DataGridViewColumnDividerDoubleClickEventHandler eh = (DataGridViewColumnDividerDoubleClickEventHandler)(Events [ColumnDividerDoubleClickEvent]);
3735 protected internal virtual void OnColumnDividerWidthChanged (DataGridViewColumnEventArgs e)
3737 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDividerWidthChangedEvent]);
3742 protected internal virtual void OnColumnHeaderCellChanged (DataGridViewColumnEventArgs e)
3744 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnHeaderCellChangedEvent]);
3749 protected virtual void OnColumnHeaderMouseClick (DataGridViewCellMouseEventArgs e)
3751 DataGridViewColumn col = Columns[e.ColumnIndex];
3753 if (col.SortMode == DataGridViewColumnSortMode.Automatic) {
3754 ListSortDirection new_order;
3756 // Always use ascending unless we are clicking on a
3757 // column that is already sorted ascending.
3758 if (SortedColumn != col || sortOrder != SortOrder.Ascending)
3759 new_order = ListSortDirection.Ascending;
3761 new_order = ListSortDirection.Descending;
3763 Sort (col, new_order);
3766 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [ColumnHeaderMouseClickEvent]);
3771 protected virtual void OnColumnHeaderMouseDoubleClick (DataGridViewCellMouseEventArgs e)
3773 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [ColumnHeaderMouseDoubleClickEvent]);
3778 protected virtual void OnColumnHeadersBorderStyleChanged (EventArgs e)
3780 EventHandler eh = (EventHandler)(Events [ColumnHeadersBorderStyleChangedEvent]);
3785 protected virtual void OnColumnHeadersDefaultCellStyleChanged (EventArgs e)
3787 EventHandler eh = (EventHandler)(Events [ColumnHeadersDefaultCellStyleChangedEvent]);
3792 protected virtual void OnColumnHeadersHeightChanged (EventArgs e)
3794 EventHandler eh = (EventHandler)(Events [ColumnHeadersHeightChangedEvent]);
3799 protected virtual void OnColumnHeadersHeightSizeModeChanged (DataGridViewAutoSizeModeEventArgs e)
3801 DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [ColumnHeadersHeightSizeModeChangedEvent]);
3806 protected internal virtual void OnColumnMinimumWidthChanged (DataGridViewColumnEventArgs e)
3808 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnMinimumWidthChangedEvent]);
3813 protected internal virtual void OnColumnNameChanged (DataGridViewColumnEventArgs e)
3815 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnNameChangedEvent]);
3820 internal void OnColumnRemovedInternal (DataGridViewColumnEventArgs e)
3822 if (e.Column.CellTemplate != null) {
3823 int index = e.Column.Index;
3825 foreach (DataGridViewRow row in Rows)
3826 row.Cells.RemoveAt (index);
3829 AutoResizeColumnsInternal ();
3830 OnColumnRemoved (e);
3831 PrepareEditingRow (false, true);
3834 protected virtual void OnColumnRemoved (DataGridViewColumnEventArgs e)
3836 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnRemovedEvent]);
3841 protected internal virtual void OnColumnSortModeChanged (DataGridViewColumnEventArgs e)
3843 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnSortModeChangedEvent]);
3848 protected internal virtual void OnColumnStateChanged (DataGridViewColumnStateChangedEventArgs e)
3850 DataGridViewColumnStateChangedEventHandler eh = (DataGridViewColumnStateChangedEventHandler)(Events [ColumnStateChangedEvent]);
3855 protected internal virtual void OnColumnToolTipTextChanged (DataGridViewColumnEventArgs e)
3857 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnToolTipTextChangedEvent]);
3862 protected internal virtual void OnColumnWidthChanged (DataGridViewColumnEventArgs e)
3864 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnWidthChangedEvent]);
3869 protected virtual void OnCurrentCellChanged (EventArgs e)
3871 EventHandler eh = (EventHandler)(Events [CurrentCellChangedEvent]);
3876 protected virtual void OnCurrentCellDirtyStateChanged (EventArgs e)
3878 EventHandler eh = (EventHandler)(Events [CurrentCellDirtyStateChangedEvent]);
3883 protected override void OnCursorChanged (EventArgs e)
3885 base.OnCursorChanged (e);
3888 protected virtual void OnDataBindingComplete (DataGridViewBindingCompleteEventArgs e)
3890 DataGridViewBindingCompleteEventHandler eh = (DataGridViewBindingCompleteEventHandler)(Events [DataBindingCompleteEvent]);
3895 protected virtual void OnDataError (bool displayErrorDialogIfNoHandler, DataGridViewDataErrorEventArgs e)
3897 DataGridViewDataErrorEventHandler eh = (DataGridViewDataErrorEventHandler)(Events [DataErrorEvent]);
3901 else if (displayErrorDialogIfNoHandler)
3902 MessageBox.Show (e.ToString ());
3904 protected virtual void OnDataMemberChanged (EventArgs e) {
3905 EventHandler eh = (EventHandler)(Events [DataMemberChangedEvent]);
3910 protected virtual void OnDataSourceChanged (EventArgs e) {
3911 EventHandler eh = (EventHandler)(Events [DataSourceChangedEvent]);
3916 protected virtual void OnDefaultCellStyleChanged (EventArgs e) {
3917 EventHandler eh = (EventHandler)(Events [DefaultCellStyleChangedEvent]);
3922 protected virtual void OnDefaultValuesNeeded (DataGridViewRowEventArgs e) {
3923 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [DefaultValuesNeededEvent]);
3928 protected override void OnDoubleClick (EventArgs e) {
3929 base.OnDoubleClick(e);
3932 protected virtual void OnEditingControlShowing (DataGridViewEditingControlShowingEventArgs e) {
3933 DataGridViewEditingControlShowingEventHandler eh = (DataGridViewEditingControlShowingEventHandler)(Events [EditingControlShowingEvent]);
3938 protected virtual void OnEditModeChanged (EventArgs e)
3940 EventHandler eh = (EventHandler)(Events [EditModeChangedEvent]);
3945 protected override void OnEnabledChanged (EventArgs e)
3947 base.OnEnabledChanged(e);
3950 protected override void OnEnter (EventArgs e )
3955 protected override void OnGotFocus(EventArgs e)
3957 base.OnGotFocus (e);
3959 // To add focus rectangle if needed
3960 if (currentCell != null && ShowFocusCues)
3961 InvalidateCell (currentCell);
3964 protected override void OnFontChanged (EventArgs e)
3966 base.OnFontChanged(e);
3969 protected override void OnForeColorChanged (EventArgs e)
3971 base.OnForeColorChanged(e);
3974 protected virtual void OnGridColorChanged (EventArgs e)
3976 EventHandler eh = (EventHandler)(Events [GridColorChangedEvent]);
3981 protected override void OnHandleCreated (EventArgs e)
3983 base.OnHandleCreated(e);
3985 if (CurrentCell == null && Rows.Count > 0 && Columns.Count > 0)
3986 MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, false, false, false);
3989 protected override void OnHandleDestroyed(EventArgs e)
3991 base.OnHandleDestroyed (e);
3994 [EditorBrowsable (EditorBrowsableState.Advanced)]
3995 protected override void OnKeyDown (KeyEventArgs e)
3999 e.Handled = ProcessDataGridViewKey (e);
4002 [EditorBrowsable (EditorBrowsableState.Advanced)]
4003 protected override void OnKeyPress (KeyPressEventArgs e)
4008 [EditorBrowsable (EditorBrowsableState.Advanced)]
4009 protected override void OnKeyUp (KeyEventArgs e)
4014 protected override void OnLayout (LayoutEventArgs e)
4016 if (horizontalScrollBar.Visible && verticalScrollBar.Visible) {
4017 horizontalScrollBar.Bounds = new Rectangle (BorderWidth, Height - BorderWidth - horizontalScrollBar.Height, Width - (2 * BorderWidth) - verticalScrollBar.Width, horizontalScrollBar.Height);
4018 verticalScrollBar.Bounds = new Rectangle (Width - BorderWidth - verticalScrollBar.Width, BorderWidth, verticalScrollBar.Width, Height - (2 * BorderWidth) - horizontalScrollBar.Height);
4019 } else if (horizontalScrollBar.Visible)
4020 horizontalScrollBar.Bounds = new Rectangle (BorderWidth, Height - BorderWidth - horizontalScrollBar.Height, Width - (2 * BorderWidth), horizontalScrollBar.Height);
4021 else if (verticalScrollBar.Visible)
4022 verticalScrollBar.Bounds = new Rectangle (Width - BorderWidth - verticalScrollBar.Width, BorderWidth, verticalScrollBar.Width, Height - (2 * BorderWidth));
4024 AutoResizeColumnsInternal ();
4028 protected override void OnLeave (EventArgs e)
4033 protected override void OnLostFocus(EventArgs e)
4035 base.OnLostFocus (e);
4037 // To remove focus rectangle if needed
4038 if (currentCell != null && ShowFocusCues)
4039 InvalidateCell (currentCell);
4042 protected override void OnMouseClick (MouseEventArgs e)
4044 base.OnMouseClick(e);
4046 if (column_resize_active || row_resize_active)
4049 //Console.WriteLine("Mouse: Clicks: {0}; Delta: {1}; X: {2}; Y: {3};", e.Clicks, e.Delta, e.X, e.Y);
4050 HitTestInfo hit = HitTest (e.X, e.Y);
4053 case DataGridViewHitTestType.Cell:
4054 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4055 Point cellpoint = new Point (e.X - display.X, e.Y - display.Y);
4057 OnCellMouseClick (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, cellpoint.X, cellpoint.Y, e));
4059 DataGridViewCell cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex);
4061 if (cell.GetContentBounds (hit.RowIndex).Contains (cellpoint)) {
4062 DataGridViewCellEventArgs dgvcea = new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex);
4063 OnCellContentClick (dgvcea);
4067 case DataGridViewHitTestType.ColumnHeader:
4068 Rectangle display2 = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4069 Point cellpoint2 = new Point (e.X - display2.X, e.Y - display2.Y);
4071 OnColumnHeaderMouseClick (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, cellpoint2.X, cellpoint2.Y, e));
4076 protected override void OnMouseDoubleClick (MouseEventArgs e)
4078 base.OnMouseDoubleClick(e);
4081 private void DoSelectionOnMouseDown (HitTestInfo hitTest)
4083 Keys modifiers = Control.ModifierKeys;
4084 bool isControl = (modifiers & Keys.Control) != 0;
4085 bool isShift = (modifiers & Keys.Shift) != 0;
4086 //bool isRowHeader = hitTest.Type == DataGridViewHitTestType.RowHeader;
4087 //bool isColHeader = hitTest.Type == DataGridViewHitTestType.ColumnHeader;
4088 DataGridViewSelectionMode mode;
4090 switch (hitTest.Type) {
4091 case DataGridViewHitTestType.Cell:
4092 mode = selectionMode;
4094 case DataGridViewHitTestType.ColumnHeader:
4095 mode = selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect ? DataGridViewSelectionMode.FullColumnSelect : selectionMode;
4097 if (mode != DataGridViewSelectionMode.FullColumnSelect)
4100 case DataGridViewHitTestType.RowHeader:
4101 mode = selectionMode == DataGridViewSelectionMode.RowHeaderSelect ? DataGridViewSelectionMode.FullRowSelect : selectionMode;
4103 if (mode != DataGridViewSelectionMode.FullRowSelect)
4105 break; // Handled below
4111 // If SHIFT is pressed:
4112 // Select all from selected_row/column/cell to current row/column/cell, unselect everything else
4114 // Unselect all rows/columns/cells, select the clicked one
4115 int min_row, max_row;
4116 int min_col, max_col;
4118 selected_row = hitTest.RowIndex;
4119 selected_column = hitTest.ColumnIndex;
4122 if (selected_row != -1)
4123 selected_row = hitTest.RowIndex;
4124 if (selected_column != -1)
4125 selected_column = hitTest.ColumnIndex;
4127 if (selected_row >= hitTest.RowIndex) {
4128 min_row = hitTest.RowIndex;
4129 max_row = isShift ? selected_row : min_row;
4131 max_row = hitTest.RowIndex;
4132 min_row = isShift ? selected_row : max_row;
4134 if (selected_column >= hitTest.ColumnIndex) {
4135 min_col = hitTest.ColumnIndex;
4136 max_col = isShift ? selected_column : min_col;
4138 max_col = hitTest.ColumnIndex;
4139 min_col = isShift ? selected_column : max_col;
4143 case DataGridViewSelectionMode.FullRowSelect:
4144 for (int i = 0; i < RowCount; i++) {
4145 bool select = i >= min_row && i <= max_row;
4147 for (int c = 0; c < ColumnCount; c++) {
4148 if (Rows [i].Cells [c].Selected) {
4149 SetSelectedCellCore (c, i, false);
4153 if (select != Rows [i].Selected) {
4154 SetSelectedRowCore (i, select);
4158 case DataGridViewSelectionMode.FullColumnSelect:
4159 for (int i = 0; i < ColumnCount; i++) {
4160 bool select = i >= min_col && i <= max_col;
4162 for (int r = 0; r < RowCount; r++) {
4163 if (Rows [r].Cells [i].Selected) {
4164 SetSelectedCellCore (i, r, false);
4168 if (select != Columns [i].Selected) {
4169 SetSelectedColumnCore (i, select);
4173 case DataGridViewSelectionMode.ColumnHeaderSelect:
4174 case DataGridViewSelectionMode.RowHeaderSelect:
4176 case DataGridViewSelectionMode.CellSelect:
4178 for (int c = 0; c < ColumnCount; c++) {
4179 if (columns [c].Selected)
4180 SetSelectedColumnCore (c, false);
4183 for (int r = 0; r < RowCount; r++) {
4184 if (rows [r].Selected)
4185 SetSelectedRowCore (r, false);
4188 for (int r = 0; r < RowCount; r++) {
4189 for (int c = 0; c < ColumnCount; c++) {
4190 bool select = (r >= min_row && r <= max_row) && (c >= min_col && c <= max_col);
4191 if (select != Rows [r].Cells [c].Selected)
4192 SetSelectedCellCore (c, r, select);
4198 } else if (isControl) {
4199 // Switch the selected state of the row.
4201 case DataGridViewSelectionMode.FullRowSelect:
4202 SetSelectedRowCore (hitTest.RowIndex, !rows [hitTest.RowIndex].Selected);
4204 case DataGridViewSelectionMode.FullColumnSelect:
4205 SetSelectedColumnCore (hitTest.ColumnIndex, !columns [hitTest.ColumnIndex].Selected);
4207 case DataGridViewSelectionMode.ColumnHeaderSelect:
4208 case DataGridViewSelectionMode.RowHeaderSelect:
4210 case DataGridViewSelectionMode.CellSelect:
4211 if (hitTest.ColumnIndex >= 0 && hitTest.RowIndex >= 0) {
4212 SetSelectedCellCore (hitTest.ColumnIndex, hitTest.RowIndex, !Rows [hitTest.RowIndex].Cells [hitTest.ColumnIndex].Selected);
4220 protected override void OnMouseDown (MouseEventArgs e)
4222 base.OnMouseDown(e);
4227 HitTestInfo hitTest = HitTest(e.X, e.Y);
4229 DataGridViewCell cell = null;
4230 DataGridViewRow row = null;
4231 Rectangle cellBounds;
4233 if (hitTest.Type == DataGridViewHitTestType.ColumnHeader && MouseOverColumnResize (hitTest.ColumnIndex, e.X)) {
4234 if (e.Clicks == 2) {
4235 AutoResizeColumn (hitTest.ColumnIndex);
4239 resize_band = hitTest.ColumnIndex;
4240 column_resize_active = true;
4241 resize_band_start = e.X;
4242 resize_band_delta = 0;
4243 DrawVerticalResizeLine (resize_band_start);
4247 if (hitTest.Type == DataGridViewHitTestType.RowHeader && MouseOverRowResize (hitTest.RowIndex, e.Y)) {
4248 if (e.Clicks == 2) {
4249 AutoResizeRow (hitTest.RowIndex);
4253 resize_band = hitTest.RowIndex;
4254 row_resize_active = true;
4255 resize_band_start = e.Y;
4256 resize_band_delta = 0;
4257 DrawHorizontalResizeLine (resize_band_start);
4261 if (hitTest.Type == DataGridViewHitTestType.Cell) {
4262 row = rows [hitTest.RowIndex];
4263 cell = row.Cells [hitTest.ColumnIndex];
4264 SetCurrentCellAddressCore (cell.ColumnIndex, cell.RowIndex, false, true, true);
4265 cellBounds = GetCellDisplayRectangle (hitTest.ColumnIndex, hitTest.RowIndex, false);
4266 OnCellMouseDown (new DataGridViewCellMouseEventArgs (hitTest.ColumnIndex, hitTest.RowIndex, e.X - cellBounds.X, e.Y - cellBounds.Y, e));
4267 OnCellClick (new DataGridViewCellEventArgs (hitTest.ColumnIndex, hitTest.RowIndex));
4270 DoSelectionOnMouseDown (hitTest);
4272 if (hitTest.Type != DataGridViewHitTestType.Cell) {
4273 if (hitTest.Type == DataGridViewHitTestType.ColumnHeader)
4274 pressed_header_cell = columns [hitTest.ColumnIndex].HeaderCell;
4275 else if (hitTest.Type == DataGridViewHitTestType.RowHeader)
4276 pressed_header_cell = rows [hitTest.RowIndex].HeaderCell;
4285 private void UpdateBindingPosition (int position)
4287 if (DataManager != null)
4288 DataManager.Position = position;
4291 protected override void OnMouseEnter (EventArgs e)
4293 base.OnMouseEnter(e);
4296 protected override void OnMouseLeave (EventArgs e)
4298 base.OnMouseLeave (e);
4300 if (hover_cell != null) {
4301 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4305 EnteredHeaderCell = null;
4308 protected override void OnMouseMove (MouseEventArgs e)
4310 base.OnMouseMove (e);
4312 if (column_resize_active) {
4313 // Erase the old line
4314 DrawVerticalResizeLine (resize_band_start + resize_band_delta);
4316 resize_band_delta = e.X - resize_band_start;
4318 // Draw the new line
4319 DrawVerticalResizeLine (resize_band_start + resize_band_delta);
4323 if (row_resize_active) {
4324 // Erase the old line
4325 DrawHorizontalResizeLine (resize_band_start + resize_band_delta);
4327 resize_band_delta = e.Y - resize_band_start;
4329 // Draw the new line
4330 DrawHorizontalResizeLine (resize_band_start + resize_band_delta);
4334 Cursor new_cursor = Cursors.Default;
4335 HitTestInfo hit = this.HitTest (e.X, e.Y);
4337 if (hit.Type == DataGridViewHitTestType.Cell) {
4338 EnteredHeaderCell = null;
4340 DataGridViewCell new_cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex);
4342 // Check if we have moved into an error icon area
4343 Rectangle icon = new_cell.ErrorIconBounds;
4345 if (!icon.IsEmpty) {
4346 Point loc = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false).Location;
4351 if (icon.Contains (e.X, e.Y)) {
4352 if (tooltip_currently_showing != new_cell)
4353 MouseEnteredErrorIcon (new_cell);
4355 MouseLeftErrorIcon (new_cell);
4358 // We have never been in a cell before
4359 if (hover_cell == null) {
4360 hover_cell = new_cell;
4361 OnCellMouseEnter (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex));
4363 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4364 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4369 // Were we already in this cell?
4370 if (hover_cell.RowIndex == hit.RowIndex && hover_cell.ColumnIndex == hit.ColumnIndex) {
4371 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4372 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4377 // We are changing cells
4378 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4380 hover_cell = new_cell;
4382 OnCellMouseEnter (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex));
4384 Rectangle display2 = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4385 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display2.X, e.Y - display2.Y, e));
4388 } else if (hit.Type == DataGridViewHitTestType.RowHeader) {
4389 DataGridViewRowHeaderCell new_cell = Rows[hit.RowIndex].HeaderCell;
4391 EnteredHeaderCell = new_cell;
4393 if (MouseOverRowResize (hit.RowIndex, e.Y))
4394 new_cursor = Cursors.HSplit;
4396 // Check if we have moved into an error icon area
4397 Rectangle icon = new_cell.InternalErrorIconsBounds;
4399 if (!icon.IsEmpty) {
4400 Point loc = GetCellDisplayRectangle (0, hit.RowIndex, false).Location;
4402 icon.X += BorderWidth;
4405 if (icon.Contains (e.X, e.Y)) {
4406 if (tooltip_currently_showing != new_cell)
4407 MouseEnteredErrorIcon (new_cell);
4409 MouseLeftErrorIcon (new_cell);
4411 } else if (hit.Type == DataGridViewHitTestType.TopLeftHeader) {
4412 EnteredHeaderCell = null;
4414 DataGridViewTopLeftHeaderCell new_cell = (DataGridViewTopLeftHeaderCell)TopLeftHeaderCell;
4416 // Check if we have moved into an error icon area
4417 Rectangle icon = new_cell.InternalErrorIconsBounds;
4419 if (!icon.IsEmpty) {
4420 Point loc = Point.Empty;
4422 icon.X += BorderWidth;
4425 if (icon.Contains (e.X, e.Y)) {
4426 if (tooltip_currently_showing != new_cell)
4427 MouseEnteredErrorIcon (new_cell);
4429 MouseLeftErrorIcon (new_cell);
4433 if (hit.Type == DataGridViewHitTestType.ColumnHeader) {
4434 EnteredHeaderCell = Columns [hit.ColumnIndex].HeaderCell;
4436 if (MouseOverColumnResize (hit.ColumnIndex, e.X))
4437 new_cursor = Cursors.VSplit;
4439 EnteredHeaderCell = null;
4441 // We have left the cell area
4442 if (hover_cell != null) {
4443 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4448 Cursor = new_cursor;
4451 protected override void OnMouseUp (MouseEventArgs e)
4455 if (column_resize_active) {
4456 column_resize_active = false;
4458 if (resize_band_delta + Columns[resize_band].Width < 0)
4459 resize_band_delta = -Columns[resize_band].Width;
4461 Columns[resize_band].Width = Math.Max (resize_band_delta + Columns[resize_band].Width, Columns[resize_band].MinimumWidth);
4466 if (row_resize_active) {
4467 row_resize_active = false;
4469 if (resize_band_delta + Rows[resize_band].Height < 0)
4470 resize_band_delta = -Rows[resize_band].Height;
4472 Rows[resize_band].Height = Math.Max (resize_band_delta + Rows[resize_band].Height, Rows[resize_band].MinimumHeight);
4477 HitTestInfo hit = this.HitTest (e.X, e.Y);
4479 if (hit.Type == DataGridViewHitTestType.Cell) {
4480 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4481 OnCellMouseUp (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4484 if (pressed_header_cell != null) {
4485 DataGridViewHeaderCell cell = pressed_header_cell;
4486 pressed_header_cell = null;
4487 if (ThemeEngine.Current.DataGridViewHeaderCellHasPressedStyle (this))
4488 Invalidate (GetHeaderCellBounds (cell));
4492 protected override void OnMouseWheel (MouseEventArgs e)
4494 base.OnMouseWheel(e);
4497 protected virtual void OnMultiSelectChanged (EventArgs e)
4499 EventHandler eh = (EventHandler)(Events [MultiSelectChangedEvent]);
4500 if (eh != null) eh (this, e);
4503 protected virtual void OnNewRowNeeded (DataGridViewRowEventArgs e) {
4504 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [NewRowNeededEvent]);
4505 if (eh != null) eh (this, e);
4508 int first_row_index = 0;
4509 internal int first_col_index = 0;
4511 protected override void OnPaint (PaintEventArgs e)
4515 Graphics g = e.Graphics;
4516 Rectangle bounds = ClientRectangle;
4518 // Paint the background
4519 PaintBackground (g, e.ClipRectangle, bounds);
4521 List<DataGridViewColumn> sortedColumns = columns.ColumnDisplayIndexSortedArrayList;
4523 // Take borders into account
4524 bounds.Inflate (-BorderWidth, -BorderWidth);
4526 // Paint the top left cell
4527 if (rowHeadersVisible && columnHeadersVisible && ColumnCount > 0) {
4528 Rectangle topleftbounds = new Rectangle (bounds.X, bounds.Y, rowHeadersWidth, columnHeadersHeight);
4530 TopLeftHeaderCell.PaintWork (g, e.ClipRectangle, topleftbounds, -1, TopLeftHeaderCell.State, ColumnHeadersDefaultCellStyle, AdvancedColumnHeadersBorderStyle, DataGridViewPaintParts.All);
4533 // Paint the column headers
4534 if (columnHeadersVisible) {
4535 Rectangle headerBounds = bounds;
4536 headerBounds.Height = columnHeadersHeight;
4538 if (rowHeadersVisible)
4539 headerBounds.X += rowHeadersWidth;
4541 for (int index = first_col_index; index < sortedColumns.Count; index++) {
4542 DataGridViewColumn col = sortedColumns[index];
4547 headerBounds.Width = col.Width;
4548 DataGridViewCell cell = col.HeaderCell;
4550 DataGridViewAdvancedBorderStyle intermediateBorderStyle = (DataGridViewAdvancedBorderStyle)((ICloneable)this.AdvancedColumnHeadersBorderStyle).Clone ();
4551 DataGridViewAdvancedBorderStyle borderStyle = AdjustColumnHeaderBorderStyle (this.AdvancedColumnHeadersBorderStyle, intermediateBorderStyle, cell.ColumnIndex == 0, cell.ColumnIndex == columns.Count - 1);
4553 cell.PaintWork (g, e.ClipRectangle, headerBounds, -1, cell.State, cell.InheritedStyle, borderStyle, DataGridViewPaintParts.All);
4555 headerBounds.X += col.Width;
4558 bounds.Y += columnHeadersHeight;
4561 gridWidth = rowHeadersVisible ? rowHeadersWidth : 0;
4564 int first_row_height = Rows.Count > 0 ? Rows[Math.Min (Rows.Count - 1, first_row_index)].Height : 0;
4565 // int room_left = this.Height;
4567 // Reset all columns to !Displayed
4568 for (int i = 0; i < Columns.Count; i++)
4569 Columns[i].DisplayedInternal = false;
4571 // Set Displayed columns
4572 for (int i = first_col_index; i < Columns.Count; i++) {
4573 DataGridViewColumn col = Columns.ColumnDisplayIndexSortedArrayList[i];
4578 col.DisplayedInternal = true;
4579 gridWidth += col.Width;
4581 if (gridWidth >= Width)
4585 // Reset all rows to !Displayed
4586 for (int i = 0; i < Rows.Count; i++)
4587 GetRowInternal (i).DisplayedInternal = false;
4590 for (int index = first_row_index; index < Rows.Count; index++) {
4591 DataGridViewRow row = Rows[index];
4592 GetRowInternal (index).DisplayedInternal = true;
4594 bounds.Height = row.Height;
4595 bool is_first = row.Index == 0;
4596 bool is_last = row.Index == rows.Count - 1;
4598 row.Paint (g, e.ClipRectangle, bounds, row.Index, row.GetState (row.Index), is_first, is_last);
4600 bounds.Y += bounds.Height;
4601 bounds.X = BorderWidth;
4603 if (bounds.Y >= ClientSize.Height - (horizontalScrollBar.Visible ? horizontalScrollBar.Height : 0))
4606 gridHeight += row.Height;
4611 foreach (DataGridViewColumn col in sortedColumns)
4613 gridWidth += col.Width;
4617 foreach (DataGridViewRow row in Rows)
4618 gridHeight += row.Height;
4620 if (rowHeadersVisible)
4621 gridWidth += rowHeadersWidth;
4623 if (columnHeadersVisible)
4624 gridHeight += columnHeadersHeight;
4626 bool horizontalVisible = false;
4627 bool verticalVisible = false;
4630 if (gridWidth > Size.Width || gridHeight > Size.Height) {
4631 Size = new Size(gridWidth, gridHeight);
4635 if (gridWidth > Size.Width) {
4636 horizontalVisible = true;
4638 if (gridHeight > Size.Height) {
4639 verticalVisible = true;
4641 if (horizontalScrollBar.Visible && (gridHeight + horizontalScrollBar.Height) > Size.Height) {
4642 verticalVisible = true;
4644 if (verticalScrollBar.Visible && (gridWidth + verticalScrollBar.Width) > Size.Width) {
4645 horizontalVisible = true;
4647 if (horizontalVisible) {
4648 horizontalScrollBar.Minimum = 0;
4649 horizontalScrollBar.Maximum = gridWidth;
4650 horizontalScrollBar.SmallChange = Columns[first_col_index].Width;
4651 horizontalScrollBar.LargeChange = ClientSize.Width - rowHeadersWidth;
4653 if (verticalVisible) {
4654 verticalScrollBar.Minimum = 0;
4655 verticalScrollBar.Maximum = gridHeight;
4656 verticalScrollBar.SmallChange = first_row_height + 1;
4657 verticalScrollBar.LargeChange = ClientSize.Height - columnHeadersHeight;
4661 horizontalScrollBar.Visible = horizontalVisible;
4662 verticalScrollBar.Visible = verticalVisible;
4664 // Paint the bottom right square if both scrollbars are displayed
4665 if (horizontalScrollBar.Visible && verticalScrollBar.Visible)
4666 g.FillRectangle (SystemBrushes.Control, new Rectangle (horizontalScrollBar.Right, verticalScrollBar.Bottom, verticalScrollBar.Width, horizontalScrollBar.Height));
4669 bounds = ClientRectangle;
4671 switch (BorderStyle) {
4672 case BorderStyle.FixedSingle:
4673 g.DrawRectangle (Pens.Black, new Rectangle (bounds.Left, bounds.Top, bounds.Width - 1, bounds.Height - 1));
4675 case BorderStyle.Fixed3D:
4676 ControlPaint.DrawBorder3D (g, bounds, Border3DStyle.Sunken);
4681 protected virtual void OnReadOnlyChanged (EventArgs e) {
4682 EventHandler eh = (EventHandler)(Events [ReadOnlyChangedEvent]);
4687 protected override void OnResize (EventArgs e) {
4689 AutoResizeColumnsInternal ();
4691 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
4692 OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
4695 protected override void OnRightToLeftChanged (EventArgs e) {
4696 base.OnRightToLeftChanged(e);
4699 // In MSDN2 documentation there's no internal here
4700 protected internal virtual void OnRowContextMenuStripChanged (DataGridViewRowEventArgs e)
4702 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowContextMenuStripChangedEvent]);
4703 if (eh != null) eh (this, e);
4706 protected virtual void OnRowContextMenuStripNeeded (DataGridViewRowContextMenuStripNeededEventArgs e)
4708 DataGridViewRowContextMenuStripNeededEventHandler eh = (DataGridViewRowContextMenuStripNeededEventHandler)(Events [RowContextMenuStripNeededEvent]);
4709 if (eh != null) eh (this, e);
4712 protected internal virtual void OnRowDefaultCellStyleChanged (DataGridViewRowEventArgs e)
4714 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowDefaultCellStyleChangedEvent]);
4715 if (eh != null) eh (this, e);
4718 protected virtual void OnRowDirtyStateNeeded (QuestionEventArgs e)
4720 QuestionEventHandler eh = (QuestionEventHandler)(Events [RowDirtyStateNeededEvent]);
4721 if (eh != null) eh (this, e);
4724 protected virtual void OnRowDividerDoubleClick (DataGridViewRowDividerDoubleClickEventArgs e)
4726 DataGridViewRowDividerDoubleClickEventHandler eh = (DataGridViewRowDividerDoubleClickEventHandler)(Events [RowDividerDoubleClickEvent]);
4727 if (eh != null) eh (this, e);
4730 protected virtual void OnRowDividerHeightChanged (DataGridViewRowEventArgs e)
4732 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowDividerHeightChangedEvent]);
4733 if (eh != null) eh (this, e);
4736 protected virtual void OnRowEnter (DataGridViewCellEventArgs e)
4738 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowEnterEvent]);
4739 if (eh != null) eh (this, e);
4742 protected internal virtual void OnRowErrorTextChanged (DataGridViewRowEventArgs e)
4744 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowErrorTextChangedEvent]);
4745 if (eh != null) eh (this, e);
4748 protected virtual void OnRowErrorTextNeeded (DataGridViewRowErrorTextNeededEventArgs e)
4750 DataGridViewRowErrorTextNeededEventHandler eh = (DataGridViewRowErrorTextNeededEventHandler)(Events [RowErrorTextNeededEvent]);
4751 if (eh != null) eh (this, e);
4754 protected internal virtual void OnRowHeaderCellChanged (DataGridViewRowEventArgs e)
4756 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowHeaderCellChangedEvent]);
4757 if (eh != null) eh (this, e);
4760 protected virtual void OnRowHeaderMouseClick (DataGridViewCellMouseEventArgs e)
4762 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [RowHeaderMouseClickEvent]);
4763 if (eh != null) eh (this, e);
4766 protected virtual void OnRowHeaderMouseDoubleClick (DataGridViewCellMouseEventArgs e)
4768 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [RowHeaderMouseDoubleClickEvent]);
4769 if (eh != null) eh (this, e);
4772 protected virtual void OnRowHeadersBorderStyleChanged (EventArgs e)
4774 EventHandler eh = (EventHandler)(Events [RowHeadersBorderStyleChangedEvent]);
4775 if (eh != null) eh (this, e);
4778 protected virtual void OnRowHeadersDefaultCellStyleChanged (EventArgs e)
4780 EventHandler eh = (EventHandler)(Events [RowHeadersDefaultCellStyleChangedEvent]);
4781 if (eh != null) eh (this, e);
4784 protected virtual void OnRowHeadersWidthChanged (EventArgs e)
4786 EventHandler eh = (EventHandler)(Events [RowHeadersWidthChangedEvent]);
4787 if (eh != null) eh (this, e);
4790 protected virtual void OnRowHeadersWidthSizeModeChanged (DataGridViewAutoSizeModeEventArgs e)
4792 DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [RowHeadersWidthSizeModeChangedEvent]);
4793 if (eh != null) eh (this, e);
4796 protected internal virtual void OnRowHeightChanged (DataGridViewRowEventArgs e)
4798 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowHeightChangedEvent]);
4799 if (eh != null) eh (this, e);
4802 protected virtual void OnRowHeightInfoNeeded (DataGridViewRowHeightInfoNeededEventArgs e)
4804 DataGridViewRowHeightInfoNeededEventHandler eh = (DataGridViewRowHeightInfoNeededEventHandler)(Events [RowHeightInfoNeededEvent]);
4805 if (eh != null) eh (this, e);
4808 protected virtual void OnRowHeightInfoPushed (DataGridViewRowHeightInfoPushedEventArgs e)
4810 DataGridViewRowHeightInfoPushedEventHandler eh = (DataGridViewRowHeightInfoPushedEventHandler)(Events [RowHeightInfoPushedEvent]);
4811 if (eh != null) eh (this, e);
4814 protected virtual void OnRowLeave (DataGridViewCellEventArgs e)
4816 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowLeaveEvent]);
4817 if (eh != null) eh (this, e);
4820 protected internal virtual void OnRowMinimumHeightChanged (DataGridViewRowEventArgs e)
4822 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowMinimumHeightChangedEvent]);
4823 if (eh != null) eh (this, e);
4826 protected internal virtual void OnRowPostPaint (DataGridViewRowPostPaintEventArgs e)
4828 DataGridViewRowPostPaintEventHandler eh = (DataGridViewRowPostPaintEventHandler)(Events [RowPostPaintEvent]);
4829 if (eh != null) eh (this, e);
4832 protected internal virtual void OnRowPrePaint (DataGridViewRowPrePaintEventArgs e)
4834 DataGridViewRowPrePaintEventHandler eh = (DataGridViewRowPrePaintEventHandler)(Events [RowPrePaintEvent]);
4835 if (eh != null) eh (this, e);
4838 internal void OnRowsAddedInternal (DataGridViewRowsAddedEventArgs e)
4840 AutoResizeColumnsInternal ();
4845 protected internal virtual void OnRowsAdded (DataGridViewRowsAddedEventArgs e)
4847 DataGridViewRowsAddedEventHandler eh = (DataGridViewRowsAddedEventHandler)(Events [RowsAddedEvent]);
4848 if (eh != null) eh (this, e);
4851 protected virtual void OnRowsDefaultCellStyleChanged (EventArgs e)
4853 EventHandler eh = (EventHandler)(Events [RowsDefaultCellStyleChangedEvent]);
4854 if (eh != null) eh (this, e);
4857 internal void OnRowsRemovedInternal (DataGridViewRowsRemovedEventArgs e)
4859 if (selected_rows != null)
4860 selected_rows.InternalClear ();
4861 if (selected_columns != null)
4862 selected_columns.InternalClear ();
4864 if (Rows.Count > 0 && Columns.Count > 0 && currentCell != null &&
4865 currentCell.RowIndex >= e.RowIndex)
4866 MoveCurrentCell (0, Math.Min (e.RowIndex, Rows.Count - 2), true, false, false, true);
4871 protected virtual void OnRowsRemoved (DataGridViewRowsRemovedEventArgs e)
4873 DataGridViewRowsRemovedEventHandler eh = (DataGridViewRowsRemovedEventHandler)(Events [RowsRemovedEvent]);
4874 if (eh != null) eh (this, e);
4877 protected internal virtual void OnRowStateChanged (int rowIndex, DataGridViewRowStateChangedEventArgs e)
4879 DataGridViewRowStateChangedEventHandler eh = (DataGridViewRowStateChangedEventHandler)(Events [RowStateChangedEvent]);
4880 if (eh != null) eh (this, e);
4883 protected virtual void OnRowUnshared (DataGridViewRowEventArgs e)
4885 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowUnsharedEvent]);
4886 if (eh != null) eh (this, e);
4889 protected virtual void OnRowValidated (DataGridViewCellEventArgs e)
4891 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowValidatedEvent]);
4892 if (eh != null) eh (this, e);
4895 protected virtual void OnRowValidating (DataGridViewCellCancelEventArgs e)
4897 DataGridViewCellCancelEventHandler eh = (DataGridViewCellCancelEventHandler)(Events [RowValidatingEvent]);
4898 if (eh != null) eh (this, e);
4901 protected virtual void OnScroll (ScrollEventArgs e)
4903 ScrollEventHandler eh = (ScrollEventHandler)(Events [ScrollEvent]);
4904 if (eh != null) eh (this, e);
4907 protected virtual void OnSelectionChanged (EventArgs e)
4909 EventHandler eh = (EventHandler)(Events [SelectionChangedEvent]);
4910 if (eh != null) eh (this, e);
4913 protected virtual void OnSortCompare (DataGridViewSortCompareEventArgs e) {
4914 DataGridViewSortCompareEventHandler eh = (DataGridViewSortCompareEventHandler)(Events [SortCompareEvent]);
4915 if (eh != null) eh (this, e);
4918 protected virtual void OnSorted (EventArgs e)
4920 EventHandler eh = (EventHandler)(Events [SortedEvent]);
4921 if (eh != null) eh (this, e);
4924 protected virtual void OnUserAddedRow (DataGridViewRowEventArgs e)
4927 PrepareEditingRow (false, false);
4929 e = new DataGridViewRowEventArgs (editing_row);
4931 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [UserAddedRowEvent]);
4932 if (eh != null) eh (this, e);
4935 protected virtual void OnUserDeletedRow (DataGridViewRowEventArgs e)
4937 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [UserDeletedRowEvent]);
4938 if (eh != null) eh (this, e);
4942 protected virtual void OnUserDeletingRow (DataGridViewRowCancelEventArgs e)
4944 DataGridViewRowCancelEventHandler eh = (DataGridViewRowCancelEventHandler)(Events [UserDeletingRowEvent]);
4945 if (eh != null) eh (this, e);
4948 protected override void OnValidating (CancelEventArgs e)
4950 base.OnValidating(e);
4953 protected override void OnVisibleChanged (EventArgs e)
4955 base.OnVisibleChanged(e);
4958 protected virtual void PaintBackground (Graphics graphics, Rectangle clipBounds, Rectangle gridBounds)
4960 graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (backgroundColor), gridBounds);
4963 protected bool ProcessAKey (Keys keyData)
4968 if ((keyData & Keys.Control) == Keys.Control) {
4976 protected virtual bool ProcessDataGridViewKey (KeyEventArgs e)
4978 switch (e.KeyData & ~Keys.Modifiers) {
4980 return ProcessAKey (e.KeyData);
4982 return ProcessDeleteKey (e.KeyData);
4984 return ProcessDownKey (e.KeyData);
4986 return ProcessEscapeKey (e.KeyData);
4988 return ProcessEndKey (e.KeyData);
4990 return ProcessEnterKey (e.KeyData);
4992 return ProcessF2Key (e.KeyData);
4994 return ProcessHomeKey (e.KeyData);
4996 return ProcessLeftKey (e.KeyData);
4998 return ProcessNextKey (e.KeyData);
5000 return ProcessPriorKey (e.KeyData);
5002 return ProcessRightKey (e.KeyData);
5004 return ProcessSpaceKey (e.KeyData);
5006 return ProcessTabKey (e.KeyData);
5008 return ProcessUpKey (e.KeyData);
5011 return ProcessZeroKey (e.KeyData);
5017 protected bool ProcessDeleteKey (Keys keyData)
5019 if (!allowUserToDeleteRows || SelectedRows.Count == 0)
5022 int index = Math.Max (selected_row - SelectedRows.Count + 1, 0);
5024 for (int i = SelectedRows.Count - 1; i >= 0; i--) {
5025 DataGridViewRow row = SelectedRows[i];
5030 if (hover_cell != null && hover_cell.OwningRow == row)
5033 if (DataSource != null && DataSource is DataSet)
5034 (DataSource as DataSet).Tables[dataMember].Rows.RemoveAt (row.Index);
5036 Rows.RemoveAt (row.Index);
5042 protected override bool ProcessDialogKey (Keys keyData)
5046 case Keys.Shift | Keys.Tab:
5048 return base.ProcessDialogKey (keyData & ~Keys.Control);
5050 if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
5054 case Keys.Control | Keys.Tab:
5055 case Keys.Control | Keys.Shift | Keys.Tab:
5057 return base.ProcessDialogKey (keyData & ~Keys.Control);
5059 if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
5065 if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
5071 return base.ProcessDialogKey(keyData);
5074 protected bool ProcessDownKey (Keys keyData)
5076 int current_row = CurrentCellAddress.Y;
5078 if (current_row < Rows.Count - 1) {
5079 // Move to the last cell in the column
5080 if ((keyData & Keys.Control) == Keys.Control)
5081 MoveCurrentCell (CurrentCellAddress.X, Rows.Count - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5082 // Move one cell down
5084 MoveCurrentCell (CurrentCellAddress.X, current_row + 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5092 protected bool ProcessEndKey (Keys keyData)
5094 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5096 // Move to the last cell in the control
5097 if ((keyData & Keys.Control) == Keys.Control) {
5098 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), Rows.Count - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5102 // Move to the last cell in the row
5103 if (disp_index < Columns.Count - 1) {
5104 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5111 protected bool ProcessEnterKey (Keys keyData)
5113 if (ProcessDownKey (keyData))
5116 // ProcessDown may fail if we are on the last row,
5117 // but Enter should still EndEdit if this is the last row
5122 protected bool ProcessEscapeKey (Keys keyData)
5124 if (!IsCurrentCellInEditMode)
5131 protected bool ProcessF2Key (Keys keyData)
5133 if (editMode == DataGridViewEditMode.EditOnF2 || editMode == DataGridViewEditMode.EditOnKeystrokeOrF2) {
5141 protected bool ProcessHomeKey (Keys keyData)
5143 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5145 // Move to the first cell in the control
5146 if ((keyData & Keys.Control) == Keys.Control) {
5147 MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5151 // Move to the first cell in the row
5152 if (disp_index > 0) {
5153 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5160 [MonoTODO ("What does insert do?")]
5161 protected bool ProcessInsertKey (Keys keyData)
5166 protected override bool ProcessKeyEventArgs (ref Message m)
5168 DataGridViewCell cell = CurrentCell;
5171 if (cell.KeyEntersEditMode (new KeyEventArgs ((Keys)m.WParam.ToInt32 ())))
5174 return base.ProcessKeyEventArgs (ref m);
5177 protected override bool ProcessKeyPreview (ref Message m)
5179 if ((Msg)m.Msg == Msg.WM_KEYDOWN && (IsCurrentCellInEditMode || m.HWnd == horizontalScrollBar.Handle || m.HWnd == verticalScrollBar.Handle)) {
5180 KeyEventArgs e = new KeyEventArgs ((Keys)m.WParam.ToInt32 ());
5182 IDataGridViewEditingControl ctrl = (IDataGridViewEditingControl)EditingControlInternal;
5185 if (ctrl.EditingControlWantsInputKey (e.KeyData, false))
5188 switch (e.KeyData) {
5197 return ProcessDataGridViewKey (e);
5201 return base.ProcessKeyPreview (ref m);
5204 protected bool ProcessLeftKey (Keys keyData)
5206 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5208 if (disp_index > 0) {
5209 // Move to the first cell in the row
5210 if ((keyData & Keys.Control) == Keys.Control)
5211 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5212 // Move one cell to the left
5214 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5223 protected bool ProcessNextKey (Keys keyData)
5225 int current_row = CurrentCellAddress.Y;
5227 if (current_row < Rows.Count - 1) {
5228 // Move one "page" of cells down
5229 int new_row = Math.Min (Rows.Count - 1, current_row + DisplayedRowCount (false));
5231 MoveCurrentCell (CurrentCellAddress.X, new_row, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5240 protected bool ProcessPriorKey (Keys keyData)
5242 int current_row = CurrentCellAddress.Y;
5244 if (current_row > 0) {
5245 // Move one "page" of cells up
5246 int new_row = Math.Max (0, current_row - DisplayedRowCount (false));
5248 MoveCurrentCell (CurrentCellAddress.X, new_row, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5256 protected bool ProcessRightKey (Keys keyData)
5258 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5260 if (disp_index < Columns.Count - 1) {
5261 // Move to the last cell in the row
5262 if ((keyData & Keys.Control) == Keys.Control)
5263 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5264 // Move one cell to the right
5266 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index + 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5274 protected bool ProcessSpaceKey (Keys keyData)
5276 if ((keyData & Keys.Shift) == Keys.Shift) {
5277 if (selectionMode == DataGridViewSelectionMode.RowHeaderSelect) {
5278 SetSelectedRowCore (CurrentCellAddress.Y, true);
5279 InvalidateRow (CurrentCellAddress.Y);
5282 if (selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect) {
5283 SetSelectedColumnCore (CurrentCellAddress.X, true);
5284 InvalidateColumn (CurrentCellAddress.X);
5289 if (CurrentCell is DataGridViewButtonCell || CurrentCell is DataGridViewLinkCell || CurrentCell is DataGridViewCheckBoxCell) {
5290 DataGridViewCellEventArgs e = new DataGridViewCellEventArgs (CurrentCell.ColumnIndex, CurrentCell.RowIndex);
5293 OnCellContentClick (e);
5295 if (CurrentCell is DataGridViewButtonCell)
5296 (CurrentCell as DataGridViewButtonCell).OnClickInternal (e);
5297 if (CurrentCell is DataGridViewCheckBoxCell)
5298 (CurrentCell as DataGridViewCheckBoxCell).OnClickInternal (e);
5306 protected bool ProcessTabKey (Keys keyData)
5308 Form f = FindForm ();
5311 f.ActivateFocusCues ();
5313 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5316 // Shift-tab goes backwards
5317 if ((keyData & Keys.Shift) == Keys.Shift) {
5318 if (disp_index > 0) {
5319 // Move one cell to the left
5320 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, false, true);
5322 } else if (currentCellAddress.Y > 0) {
5323 // Move to the last cell in the previous row
5324 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y - 1, true, false, false, true);
5329 if (disp_index < Columns.Count - 1) {
5330 // Move one cell to the right
5331 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index + 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, false, true);
5334 } else if (currentCellAddress.Y < Rows.Count - 1) {
5335 // Move to the first cell in the next row
5336 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y + 1, true, false, false, true);
5346 protected bool ProcessUpKey (Keys keyData)
5348 int current_row = CurrentCellAddress.Y;
5350 if (current_row > 0) {
5351 // Move to the first cell in the column
5352 if ((keyData & Keys.Control) == Keys.Control)
5353 MoveCurrentCell (CurrentCellAddress.X, 0, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5356 MoveCurrentCell (CurrentCellAddress.X, current_row - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5364 protected bool ProcessZeroKey (Keys keyData)
5366 if ((keyData & Keys.Control) == Keys.Control && CurrentCell.EditType != null) {
5367 CurrentCell.Value = DBNull.Value;
5368 InvalidateCell (CurrentCell);
5375 protected override void SetBoundsCore (int x, int y, int width, int height, BoundsSpecified specified) {
5376 base.SetBoundsCore(x, y, width, height, specified);
5379 [MonoTODO ("Does not use validateCurrentCell")]
5380 protected virtual bool SetCurrentCellAddressCore (int columnIndex, int rowIndex, bool setAnchorCellAddress, bool validateCurrentCell, bool throughMouseClick)
5382 if ((columnIndex < 0 || columnIndex > Columns.Count - 1) && rowIndex != -1)
5383 throw new ArgumentOutOfRangeException ("columnIndex");
5384 if ((rowIndex < 0 || rowIndex > Rows.Count - 1) && columnIndex != -1)
5385 throw new ArgumentOutOfRangeException ("rowIndex");
5387 DataGridViewCell cell;
5389 if (columnIndex == -1 && rowIndex == -1)
5392 cell = Rows.SharedRow (rowIndex).Cells[columnIndex];
5394 if (cell != null && !cell.Visible)
5395 throw new InvalidOperationException ("cell is not visible");
5397 if (cell != currentCell) {
5398 if (currentCell != null) {
5399 if (currentCell.IsInEditMode && !EndEdit ())
5401 OnCellLeave (new DataGridViewCellEventArgs(currentCell.ColumnIndex, currentCell.RowIndex));
5402 OnRowLeave (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
5406 if (setAnchorCellAddress)
5407 anchor_cell = new Point (columnIndex, rowIndex);
5408 currentCellAddress = new Point (columnIndex, rowIndex);
5410 UpdateBindingPosition (currentCell.RowIndex);
5411 OnRowEnter (new DataGridViewCellEventArgs (cell.ColumnIndex, cell.RowIndex));
5412 OnCellEnter (new DataGridViewCellEventArgs(cell.ColumnIndex, cell.RowIndex));
5413 OnCurrentCellChanged (EventArgs.Empty);
5414 if (editMode == DataGridViewEditMode.EditOnEnter)
5417 if (throughMouseClick)
5424 protected virtual void SetSelectedCellCore (int columnIndex, int rowIndex, bool selected) {
5425 rows [rowIndex].Cells [columnIndex].Selected = selected;
5427 OnSelectionChanged (EventArgs.Empty);
5430 internal void SetSelectedColumnCoreInternal (int columnIndex, bool selected) {
5431 SetSelectedColumnCore (columnIndex, selected);
5434 protected virtual void SetSelectedColumnCore (int columnIndex, bool selected) {
5435 if (selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect && selectionMode != DataGridViewSelectionMode.FullColumnSelect)
5438 DataGridViewColumn col = columns [columnIndex];
5440 col.SelectedInternal = selected;
5442 if (selected_columns == null)
5443 selected_columns = new DataGridViewSelectedColumnCollection ();
5445 if (!selected && selected_columns.Contains (col)) {
5446 selected_columns.InternalRemove (col);
5447 } else if (selected && !selected_columns.Contains (col)) {
5448 selected_columns.InternalAdd (col);
5454 internal void SetSelectedRowCoreInternal (int rowIndex, bool selected) {
5455 SetSelectedRowCore (rowIndex, selected);
5458 protected virtual void SetSelectedRowCore (int rowIndex, bool selected) {
5459 DataGridViewRow row = rows [rowIndex];
5461 row.SelectedInternal = selected;
5463 if (selected_rows == null)
5464 selected_rows = new DataGridViewSelectedRowCollection (this);
5466 if (!selected && selected_rows.Contains (row)) {
5467 selected_rows.InternalRemove (row);
5468 } else if (selected && !selected_rows.Contains (row)) {
5469 selected_rows.InternalAdd (row);
5475 protected override void WndProc (ref Message m)
5477 base.WndProc (ref m);
5480 internal void InternalOnCellClick (DataGridViewCellEventArgs e)
5485 internal void InternalOnCellContentClick (DataGridViewCellEventArgs e)
5487 OnCellContentClick (e);
5490 internal void InternalOnCellContentDoubleClick (DataGridViewCellEventArgs e)
5492 OnCellContentDoubleClick (e);
5495 internal void InternalOnCellValueChanged (DataGridViewCellEventArgs e)
5497 OnCellValueChanged (e);
5500 internal void InternalOnDataError (DataGridViewDataErrorEventArgs e)
5502 /////////////// false? ////////////
5503 OnDataError (false, e);
5506 internal void InternalOnMouseWheel (MouseEventArgs e)
5511 internal void OnHScrollBarScroll (object sender, ScrollEventArgs e)
5513 horizontalScrollingOffset = e.NewValue;
5516 for (int index = 0; index < Columns.Count; index++) {
5517 DataGridViewColumn col = Columns[index];
5519 if (e.NewValue < left + col.Width) {
5520 if (first_col_index != index) {
5521 first_col_index = index;
5533 internal void OnVScrollBarScroll (object sender, ScrollEventArgs e)
5535 verticalScrollingOffset = e.NewValue;
5536 if (Rows.Count == 0)
5541 for (int index = 0; index < Rows.Count; index++) {
5542 DataGridViewRow row = Rows[index];
5543 if (e.NewValue < top + row.Height) {
5544 if (first_row_index != index) {
5545 first_row_index = index;
5556 first_row_index = Rows.Count - DisplayedRowCount (false);
5561 internal void RaiseCellStyleChanged (DataGridViewCellEventArgs e) {
5562 OnCellStyleChanged(e);
5565 internal void OnColumnCollectionChanged (object sender, CollectionChangeEventArgs e) {
5567 case CollectionChangeAction.Add:
5568 OnColumnAddedInternal(new DataGridViewColumnEventArgs(e.Element as DataGridViewColumn));
5570 case CollectionChangeAction.Remove:
5571 OnColumnRemovedInternal(new DataGridViewColumnEventArgs(e.Element as DataGridViewColumn));
5573 case CollectionChangeAction.Refresh:
5578 // Resizes all columns according to their AutoResizeMode property.
5579 // First all the columns that aren't Filled are resized, then we resize all the Filled columns.
5580 internal void AutoResizeColumnsInternal ()
5582 for (int i = 0; i < Columns.Count; i++)
5583 AutoResizeColumnInternal (i, Columns [i].InheritedAutoSizeMode);
5585 AutoFillColumnsInternal ();
5588 internal void AutoFillColumnsInternal ()
5590 float totalFillWeight = 0;
5591 int FillCount = 0; // The number of columns that has AutoSizeMode.Fill set
5592 int spaceLeft = ClientSize.Width - (verticalScrollBar.VisibleInternal ? verticalScrollBar.Width : 0);
5594 if (RowHeadersVisible) {
5595 spaceLeft -= RowHeadersWidth;
5597 spaceLeft -= BorderWidth * 2;
5599 int [] fixed_widths = new int [Columns.Count];
5600 int [] new_widths = new int [Columns.Count];
5601 bool fixed_any = false;
5603 for (int i = 0; i < Columns.Count; i++) {
5604 DataGridViewColumn col = Columns [i];
5606 switch (col.InheritedAutoSizeMode) {
5607 case DataGridViewAutoSizeColumnMode.Fill:
5609 totalFillWeight += col.FillWeight;
5611 case DataGridViewAutoSizeColumnMode.AllCellsExceptHeader:
5612 case DataGridViewAutoSizeColumnMode.AllCells:
5613 case DataGridViewAutoSizeColumnMode.DisplayedCells:
5614 case DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader:
5615 case DataGridViewAutoSizeColumnMode.None:
5616 case DataGridViewAutoSizeColumnMode.NotSet:
5617 spaceLeft -= Columns [i].Width;
5622 spaceLeft = Math.Max (0, spaceLeft);
5626 for (int i = 0; i < columns.Count; i++) {
5627 DataGridViewColumn col = Columns [i];
5630 if (col.InheritedAutoSizeMode != DataGridViewAutoSizeColumnMode.Fill)
5633 if (fixed_widths [i] != 0)
5636 width = (totalFillWeight == 0) ? 0 : (int) Math.Round (spaceLeft * (col.FillWeight / totalFillWeight), 0);
5641 if (width < col.MinimumWidth) {
5642 width = col.MinimumWidth;
5643 fixed_widths [i] = width;
5646 totalFillWeight -= col.FillWeight;
5649 new_widths [i] = width;
5651 } while (fixed_any);
5653 for (int i = 0; i < columns.Count; i++) {
5654 if (Columns [i].InheritedAutoSizeMode != DataGridViewAutoSizeColumnMode.Fill)
5657 Columns [i].Width = new_widths [i];
5661 internal void AutoResizeColumnInternal (int columnIndex, DataGridViewAutoSizeColumnMode mode)
5663 // http://msdn2.microsoft.com/en-us/library/ms171605.aspx
5666 DataGridViewColumn col = Columns [columnIndex];
5669 case DataGridViewAutoSizeColumnMode.Fill:
5671 case DataGridViewAutoSizeColumnMode.AllCellsExceptHeader:
5672 case DataGridViewAutoSizeColumnMode.AllCells:
5673 case DataGridViewAutoSizeColumnMode.DisplayedCells:
5674 case DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader:
5675 size = Math.Max (CalculateColumnCellWidth (columnIndex, col.InheritedAutoSizeMode),
5676 col.HeaderCell.ContentBounds.Width);
5678 case DataGridViewAutoSizeColumnMode.ColumnHeader:
5679 size = col.HeaderCell.ContentBounds.Width;
5688 if (size < col.MinimumWidth)
5689 size = col.MinimumWidth;
5694 internal int CalculateColumnCellWidth (int index, DataGridViewAutoSizeColumnMode mode)
5698 bool only_visible = false;
5700 if (mode == DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader ||
5701 mode == DataGridViewAutoSizeColumnMode.AllCellsExceptHeader)
5704 only_visible = (mode == DataGridViewAutoSizeColumnMode.DisplayedCells || mode == DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader);
5706 for (int i = first_row; i < Rows.Count; i++) {
5708 Rectangle row_rect = this.GetRowDisplayRectangle (i, false);
5709 if (!ClientRectangle.IntersectsWith (row_rect))
5713 int cell_width = Rows[i].Cells[index].PreferredSize.Width;
5715 result = Math.Max (result, cell_width);
5721 Rectangle GetHeaderCellBounds (DataGridViewHeaderCell cell)
5723 Rectangle bounds = new Rectangle (ClientRectangle.Location, cell.Size);
5724 if (cell is DataGridViewColumnHeaderCell) {
5725 if (RowHeadersVisible)
5726 bounds.X += RowHeadersWidth;
5727 List<DataGridViewColumn> sortedColumns = columns.ColumnDisplayIndexSortedArrayList;
5728 for (int index = first_col_index; index < sortedColumns.Count; index++) {
5729 DataGridViewColumn column = sortedColumns [index];
5730 if (column.Index == cell.ColumnIndex)
5732 bounds.X += column.Width;
5735 if (ColumnHeadersVisible)
5736 bounds.Y += ColumnHeadersHeight;
5737 for (int index = first_row_index; index < Rows.Count; index++) {
5738 DataGridViewRow row = GetRowInternal (index);
5739 if (row.HeaderCell == cell)
5741 bounds.Y += row.Height;
5747 internal void PrepareEditingRow (bool cell_changed, bool column_changed)
5751 show = ColumnCount > 0 && AllowUserToAddRows;
5753 if (!show && editing_row != null) {
5754 Rows.RemoveInternal (editing_row);
5757 if (editing_row != null) {
5759 // The row changed, it's no longer an editing row.
5761 } else if (column_changed) {
5762 // The number of columns has changed, we need a new editing row.
5763 Rows.RemoveInternal (editing_row);
5767 if (editing_row == null) {
5768 editing_row = RowTemplateFull;
5769 Rows.AddInternal (editing_row, false);
5776 internal DataGridViewRow EditingRow {
5777 get { return editing_row; }
5780 private void AddBoundRow (object element)
5782 // Don't add rows if there are no columns
5783 if (ColumnCount == 0)
5786 DataGridViewRow row = (DataGridViewRow)RowTemplateFull;
5787 rows.InternalAdd (row);
5789 PropertyDescriptorCollection properties = TypeDescriptor.GetProperties (element);
5791 foreach (PropertyDescriptor property in properties) {
5792 if (property.PropertyType == typeof (IBindingList))
5795 // We do it this way because there may not be a column
5796 // for every cell, ignore cells with no column
5797 DataGridViewCell cell = row.Cells.GetBoundCell (property.Name);
5802 cell.valuex = property.GetValue (element);
5803 cell.valueType = property.PropertyType;
5807 private bool IsColumnAlreadyBound (string name)
5809 foreach (DataGridViewColumn col in Columns)
5810 if (col.DataPropertyName == name)
5816 private DataGridViewColumn CreateColumnByType (Type type)
5818 if (type == typeof (bool))
5819 return new DataGridViewCheckBoxColumn ();
5821 return new DataGridViewTextBoxColumn ();
5824 private void ClearBinding ()
5826 columns.ClearAutoGeneratedColumns ();
5828 PrepareEditingRow (false, true);
5829 if (DataManager != null)
5830 DataManager.ListChanged -= OnListChanged;
5833 private void DoBinding ()
5835 /* The System.Windows.Forms.DataGridView class supports the standard Windows Forms data-binding model. This means the data source can be of any type that implements:
5836 - the System.Collections.IList interface, including one-dimensional arrays.
5837 - the System.ComponentModel.IListSource interface, such as the System.Data.DataTable and System.Data.DataSet classes.
5838 - the System.ComponentModel.IBindingList interface, such as the System.ComponentModel.Collections.BindingList<> class.
5839 - the System.ComponentModel.IBindingListView interface, such as the System.Windows.Forms.BindingSource class.
5842 if (dataSource != null && DataManager != null) {
5843 if (autoGenerateColumns) {
5844 is_autogenerating_columns = true;
5846 foreach (PropertyDescriptor property in DataManager.GetItemProperties()) {
5847 // This keeps out things like arrays
5848 if ((typeof(ICollection).IsAssignableFrom (property.PropertyType)))
5851 if (IsColumnAlreadyBound (property.DisplayName))
5854 DataGridViewColumn col = CreateColumnByType (property.PropertyType);
5855 col.Name = property.DisplayName;
5856 col.DataPropertyName = property.DisplayName;
5857 col.ReadOnly = property.IsReadOnly;
5858 col.SetIsDataBound (true);
5859 col.ValueType = property.PropertyType;
5860 col.AutoGenerated = true;
5864 is_autogenerating_columns = false;
5867 foreach (object element in DataManager.List)
5868 AddBoundRow (element);
5870 DataManager.ListChanged += OnListChanged;
5871 OnDataBindingComplete (new DataGridViewBindingCompleteEventArgs (ListChangedType.Reset));
5873 if (Rows.Count > 0 && Columns.Count > 0)
5874 MoveCurrentCell (0, 0, true, false, false, false);
5879 private void MoveCurrentCell (int x, int y, bool select, bool isControl, bool isShift, bool scroll)
5881 if (!SetCurrentCellAddressCore (x, y, true, false, false))
5884 bool full_row_selected = Rows.SharedRow(CurrentCellAddress.Y).Selected;
5885 bool full_col_selected = Columns[CurrentCellAddress.X].Selected;
5888 DataGridViewSelectionMode mode = selectionMode;
5890 // If we are row header select and we clicked a row header, use full row
5891 if (mode == DataGridViewSelectionMode.RowHeaderSelect && (x == -1 || (full_row_selected && CurrentCellAddress.X == x)))
5892 mode = DataGridViewSelectionMode.FullRowSelect;
5893 else if (mode == DataGridViewSelectionMode.RowHeaderSelect)
5894 mode = DataGridViewSelectionMode.CellSelect;
5896 // If we are col header select and we clicked a col header, use full col
5897 if (mode == DataGridViewSelectionMode.ColumnHeaderSelect && (y == -1 || (full_col_selected && CurrentCellAddress.Y == y)))
5898 mode = DataGridViewSelectionMode.FullColumnSelect;
5899 else if (mode == DataGridViewSelectionMode.ColumnHeaderSelect)
5900 mode = DataGridViewSelectionMode.CellSelect;
5902 // If the current cell isn't visible, scroll to it
5904 int disp_x = ColumnIndexToDisplayIndex (x);
5906 if (disp_x < first_col_index) {
5910 delta_x = horizontalScrollBar.Value;
5912 for (int i = disp_x; i < first_col_index; i++)
5913 delta_x += Columns[ColumnDisplayIndexToIndex (i)].Width;
5915 horizontalScrollBar.SafeValueSet (horizontalScrollBar.Value - delta_x);
5916 OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
5920 int displayedRowsCount = DisplayedRowCount (false);
5923 if (disp_y < first_row_index) {
5925 delta_y = verticalScrollBar.Value;
5927 for (int i = disp_y; i < first_row_index; i++)
5928 delta_y += GetRowInternal (i).Height;
5930 verticalScrollBar.SafeValueSet (verticalScrollBar.Value - delta_y);
5931 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
5932 } else if (disp_y > first_row_index + displayedRowsCount - 1) {
5933 if (disp_y == Rows.Count - 1)
5934 delta_y = verticalScrollBar.Maximum - verticalScrollBar.Value;
5936 for (int i = first_row_index + displayedRowsCount - 1; i < disp_y; i++)
5937 delta_y += GetRowInternal (i).Height;
5939 verticalScrollBar.SafeValueSet (verticalScrollBar.Value + delta_y);
5940 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
5947 // Clear old selection unless multi-selecting
5952 case DataGridViewSelectionMode.CellSelect:
5953 SetSelectedCellCore (x, y, true);
5955 case DataGridViewSelectionMode.FullRowSelect:
5956 SetSelectedRowCore (y, true);
5958 case DataGridViewSelectionMode.FullColumnSelect:
5959 SetSelectedColumnCore (x, true);
5966 private int ColumnIndexToDisplayIndex (int index)
5968 return Columns[index].DisplayIndex;
5971 private int ColumnDisplayIndexToIndex (int index)
5973 return Columns.ColumnDisplayIndexSortedArrayList[index].Index;
5976 private void OnListChanged (object sender, ListChangedEventArgs args)
5978 switch (args.ListChangedType) {
5979 case ListChangedType.ItemAdded:
5980 AddBoundRow (DataManager[args.NewIndex]);
5982 case ListChangedType.ItemDeleted:
5983 Rows.RemoveAt (args.NewIndex);
5985 case ListChangedType.ItemChanged:
5996 private void ReBind ()
6002 private bool MouseOverColumnResize (int col, int mousex)
6004 if (!allowUserToResizeColumns)
6007 Rectangle col_bounds = GetCellDisplayRectangle (col, 0, false);
6009 if (mousex >= col_bounds.Right - 4 && mousex <= col_bounds.Right)
6015 private bool MouseOverRowResize (int row, int mousey)
6017 if (!allowUserToResizeRows)
6020 Rectangle row_bounds = GetCellDisplayRectangle (0, row, false);
6022 if (mousey >= row_bounds.Bottom - 4 && mousey <= row_bounds.Bottom)
6028 private void DrawVerticalResizeLine (int x)
6030 Rectangle splitter = new Rectangle (x, Bounds.Y + 3 + (ColumnHeadersVisible ? ColumnHeadersHeight : 0), 1, Bounds.Height - 3 - (ColumnHeadersVisible ? ColumnHeadersHeight : 0));
6031 XplatUI.DrawReversibleRectangle (Handle, splitter, 2);
6034 private void DrawHorizontalResizeLine (int y)
6036 Rectangle splitter = new Rectangle (Bounds.X + 3 + (RowHeadersVisible ? RowHeadersWidth : 0), y, Bounds.Width - 3 + (RowHeadersVisible ? RowHeadersWidth : 0), 1);
6037 XplatUI.DrawReversibleRectangle (Handle, splitter, 2);
6040 #region Stuff for ToolTips
6041 private void MouseEnteredErrorIcon (DataGridViewCell item)
6043 tooltip_currently_showing = item;
6044 ToolTipTimer.Start ();
6047 private void MouseLeftErrorIcon (DataGridViewCell item)
6049 ToolTipTimer.Stop ();
6050 ToolTipWindow.Hide (this);
6051 tooltip_currently_showing = null;
6054 private Timer ToolTipTimer {
6056 if (tooltip_timer == null) {
6057 tooltip_timer = new Timer ();
6058 tooltip_timer.Enabled = false;
6059 tooltip_timer.Interval = 500;
6060 tooltip_timer.Tick += new EventHandler (ToolTipTimer_Tick);
6063 return tooltip_timer;
6067 private ToolTip ToolTipWindow {
6069 if (tooltip_window == null)
6070 tooltip_window = new ToolTip ();
6072 return tooltip_window;
6076 private void ToolTipTimer_Tick (object o, EventArgs args)
6078 string tooltip = tooltip_currently_showing.ErrorText;
6080 if (!string.IsNullOrEmpty (tooltip))
6081 ToolTipWindow.Present (this, tooltip);
6083 ToolTipTimer.Stop ();
6087 private class ColumnSorter : IComparer
6093 public ColumnSorter (DataGridViewColumn column, ListSortDirection direction, bool numeric)
6095 this.column = column.Index;
6096 this.numeric_sort = numeric;
6098 if (direction == ListSortDirection.Descending)
6099 this.direction = -1;
6102 #region IComparer Members
6103 public int Compare (object x, object y)
6105 DataGridViewRow row1 = (DataGridViewRow)x;
6106 DataGridViewRow row2 = (DataGridViewRow)y;
6108 if (row1.Cells[column].ValueType == typeof (DateTime) && row2.Cells[column].ValueType == typeof (DateTime))
6109 return DateTime.Compare ((DateTime)row1.Cells[column].valuex, (DateTime)row2.Cells[column].valuex) * direction;
6111 object val1 = row1.Cells[column].FormattedValue;
6112 object val2 = row2.Cells[column].FormattedValue;
6114 if (val1 == null && val2 == null)
6119 return -1 * direction;
6122 return (int)(double.Parse (val1.ToString ()) - double.Parse (val2.ToString ())) * direction;
6124 return string.Compare (val1.ToString (), val2.ToString ()) * direction;
6129 public sealed class HitTestInfo {
6131 public static readonly HitTestInfo Nowhere = new HitTestInfo(-1, -1, -1, -1, DataGridViewHitTestType.None);
6133 private int columnIndex;
6134 private int columnX;
6135 private int rowIndex;
6137 private DataGridViewHitTestType type;
6139 internal HitTestInfo (int columnIndex, int columnX, int rowIndex, int rowY, DataGridViewHitTestType type) {
6140 this.columnIndex = columnIndex;
6141 this.columnX = columnX;
6142 this.rowIndex = rowIndex;
6147 public int ColumnIndex {
6148 get { return columnIndex; }
6151 public int ColumnX {
6152 get { return columnX; }
6155 public int RowIndex {
6156 get { return rowIndex; }
6160 get { return rowY; }
6163 public DataGridViewHitTestType Type {
6164 get { return type; }
6167 public override bool Equals (object value) {
6168 if (value is HitTestInfo) {
6169 HitTestInfo aux = (HitTestInfo) value;
6170 if (aux.columnIndex == columnIndex && aux.columnX == columnX && aux.rowIndex == rowIndex && aux.rowY == rowY && aux.type == type) {
6177 public override int GetHashCode () {
6178 return base.GetHashCode();
6181 public override string ToString () {
6182 return string.Format ("Type:{0}, Column:{1}, Row:{2}", type, columnIndex, rowIndex);
6187 [ComVisible (false)]
6188 public class DataGridViewControlCollection : Control.ControlCollection
6190 private DataGridView owner;
6192 public DataGridViewControlCollection (DataGridView owner) : base (owner)
6197 public override void Clear ()
6200 // This is severely buggy, just as MS' implementation is.
6202 for (int i = 0; i < Count; i++) {
6207 public void CopyTo (Control [] array, int index)
6209 base.CopyTo (array, index);
6212 public void Insert (int index, Control value)
6214 throw new NotSupportedException ();
6217 public override void Remove (Control value)
6219 if (value == owner.horizontalScrollBar)
6222 if (value == owner.verticalScrollBar)
6225 if (value == owner.editingControl)
6228 base.Remove (value);
6231 internal void RemoveInternal (Control value)
6233 base.Remove (value);
6239 [ComVisibleAttribute(true)]
6240 protected class DataGridViewAccessibleObject : ControlAccessibleObject {
6242 public DataGridViewAccessibleObject (DataGridView owner) : base (owner){
6245 public override AccessibleRole Role {
6246 get { return base.Role; }
6249 public override string Name {
6250 get { return base.Name; }
6253 public override AccessibleObject GetChild (int index) {
6254 return base.GetChild(index);
6257 public override int GetChildCount () {
6258 return base.GetChildCount();
6261 public override AccessibleObject GetFocused () {
6262 return base.GetFocused();
6265 public override AccessibleObject GetSelected () {
6266 return base.GetSelected();
6269 public override AccessibleObject HitTest (int x, int y) {
6270 return base.HitTest(x, y);
6273 public override AccessibleObject Navigate( AccessibleNavigation navigationDirection) {
6274 return base.Navigate(navigationDirection);
6280 protected class DataGridViewTopRowAccessibleObject : AccessibleObject
6282 #region Constructors
6283 public DataGridViewTopRowAccessibleObject ()
6287 public DataGridViewTopRowAccessibleObject (DataGridView owner)
6293 #region Public Methods
6294 public override AccessibleObject GetChild (int index)
6296 return base.GetChild (index);
6299 public override int GetChildCount ()
6301 return base.GetChildCount ();
6304 public override AccessibleObject Navigate (AccessibleNavigation navigationDirection)
6306 return base.Navigate (navigationDirection);
6310 #region Public Properties
6311 public override Rectangle Bounds {
6312 get { return base.Bounds; }
6315 public override string Name {
6316 get { return base.Name; }
6319 public DataGridView Owner {
6320 get { return (DataGridView)owner; }
6323 throw new InvalidOperationException ("owner has already been set");
6329 public override AccessibleObject Parent {
6330 get { return base.Parent; }
6333 public override AccessibleRole Role {
6334 get { return base.Role; }
6337 public override string Value {
6338 get { return base.Value; }