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 is_autogenerating_columns = false;
122 private bool is_binding = false;
123 private bool new_row_editing = 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 currentCellAddress = new Point (-1, -1);
194 dataMember = String.Empty;
195 defaultCellStyle = new DataGridViewCellStyle();
196 defaultCellStyle.BackColor = SystemColors.Window;
197 defaultCellStyle.ForeColor = SystemColors.ControlText;
198 defaultCellStyle.SelectionBackColor = SystemColors.Highlight;
199 defaultCellStyle.SelectionForeColor = SystemColors.HighlightText;
200 defaultCellStyle.Font = this.Font;
201 defaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
202 defaultCellStyle.WrapMode = DataGridViewTriState.False;
203 editMode = DataGridViewEditMode.EditOnKeystrokeOrF2;
204 firstDisplayedScrollingColumnHiddenWidth = 0;
205 isCurrentCellDirty = false;
208 rowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
209 rowHeadersDefaultCellStyle = (DataGridViewCellStyle) columnHeadersDefaultCellStyle.Clone ();
210 rowHeadersVisible = true;
211 rowHeadersWidth = 41;
212 rowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing;
213 rows = CreateRowsInstance();
214 rowsDefaultCellStyle = new DataGridViewCellStyle();
215 selectionMode = DataGridViewSelectionMode.RowHeaderSelect;
216 showCellErrors = true;
217 showEditingIcon = true;
218 userSetCursor = Cursor.Current;
221 horizontalScrollBar = new HScrollBar();
222 horizontalScrollBar.Scroll += OnHScrollBarScroll;
223 horizontalScrollBar.Visible = false;
225 verticalScrollBar = new VScrollBar();
226 verticalScrollBar.Scroll += OnVScrollBarScroll;
227 verticalScrollBar.Visible = false;
229 Controls.AddRange (new Control[] {horizontalScrollBar, verticalScrollBar});
232 void ISupportInitialize.BeginInit ()
236 void ISupportInitialize.EndInit ()
243 [EditorBrowsable (EditorBrowsableState.Advanced)]
244 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
245 public virtual DataGridViewAdvancedBorderStyle AdjustedTopLeftHeaderBorderStyle {
246 get { return adjustedTopLeftHeaderBorderStyle; }
250 [EditorBrowsable (EditorBrowsableState.Advanced)]
251 public DataGridViewAdvancedBorderStyle AdvancedCellBorderStyle {
252 get { return advancedCellBorderStyle; }
256 [EditorBrowsable (EditorBrowsableState.Advanced)]
257 public DataGridViewAdvancedBorderStyle AdvancedColumnHeadersBorderStyle {
258 get { return advancedColumnHeadersBorderStyle; }
262 [EditorBrowsable (EditorBrowsableState.Advanced)]
263 public DataGridViewAdvancedBorderStyle AdvancedRowHeadersBorderStyle {
264 get { return advancedRowHeadersBorderStyle; }
267 [DefaultValue (true)]
268 public bool AllowUserToAddRows {
270 if (allowUserToAddRows && DataManager != null)
271 return DataManager.AllowNew;
272 return allowUserToAddRows;
275 if (allowUserToAddRows != value) {
276 allowUserToAddRows = value;
277 OnAllowUserToAddRowsChanged(EventArgs.Empty);
278 PrepareEditingRow (false, false);
284 [DefaultValue (true)]
285 public bool AllowUserToDeleteRows {
287 if (allowUserToDeleteRows && DataManager != null)
288 return DataManager.AllowRemove;
289 return allowUserToDeleteRows;
292 if (allowUserToDeleteRows != value) {
293 allowUserToDeleteRows = value;
294 OnAllowUserToDeleteRowsChanged(EventArgs.Empty);
299 [DefaultValue (false)]
300 public bool AllowUserToOrderColumns {
301 get { return allowUserToOrderColumns; }
303 if (allowUserToOrderColumns != value) {
304 allowUserToOrderColumns = value;
305 OnAllowUserToOrderColumnsChanged(EventArgs.Empty);
310 [DefaultValue (true)]
311 public bool AllowUserToResizeColumns {
312 get { return allowUserToResizeColumns; }
314 if (allowUserToResizeColumns != value) {
315 allowUserToResizeColumns = value;
316 OnAllowUserToResizeColumnsChanged(EventArgs.Empty);
321 [DefaultValue (true)]
322 public bool AllowUserToResizeRows {
323 get { return allowUserToResizeRows; }
325 if (allowUserToResizeRows != value) {
326 allowUserToResizeRows = value;
327 OnAllowUserToResizeRowsChanged(EventArgs.Empty);
332 public DataGridViewCellStyle AlternatingRowsDefaultCellStyle {
333 get { return alternatingRowsDefaultCellStyle; }
335 if (alternatingRowsDefaultCellStyle != value) {
336 alternatingRowsDefaultCellStyle = value;
337 OnAlternatingRowsDefaultCellStyleChanged(EventArgs.Empty);
344 [EditorBrowsable (EditorBrowsableState.Advanced)]
345 [DefaultValue (true)]
346 public bool AutoGenerateColumns {
347 get { return autoGenerateColumns; }
349 if (autoGenerateColumns != value) {
350 autoGenerateColumns = value;
351 OnAutoGenerateColumnsChanged(EventArgs.Empty);
356 public override bool AutoSize {
357 get { return autoSize; }
359 if (autoSize != value) {
361 //OnAutoSizeChanged(EventArgs.Empty);
366 [DefaultValue (DataGridViewAutoSizeColumnsMode.None)]
367 public DataGridViewAutoSizeColumnsMode AutoSizeColumnsMode {
368 get { return autoSizeColumnsMode; }
370 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeColumnsMode), value)) {
371 throw new InvalidEnumArgumentException("Value is not valid DataGridViewAutoSizeColumnsMode.");
373 if (value == DataGridViewAutoSizeColumnsMode.ColumnHeader && columnHeadersVisible == false) {
374 foreach (DataGridViewColumn col in columns) {
375 if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet) {
376 throw new InvalidOperationException("Cant set this property to ColumnHeader in this DataGridView.");
380 if (value == DataGridViewAutoSizeColumnsMode.Fill) {
381 foreach (DataGridViewColumn col in columns) {
382 if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet) {
384 throw new InvalidOperationException("Cant set this property to Fill in this DataGridView.");
390 autoSizeColumnsMode = value;
391 AutoResizeColumns (value);
396 [DefaultValue (DataGridViewAutoSizeRowsMode.None)]
397 public DataGridViewAutoSizeRowsMode AutoSizeRowsMode {
398 get { return autoSizeRowsMode; }
400 if (autoSizeRowsMode != value) {
401 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeRowsMode), value)) {
402 throw new InvalidEnumArgumentException("Value is not valid DataGridViewRowsMode.");
404 if ((value == DataGridViewAutoSizeRowsMode.AllHeaders || value == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && rowHeadersVisible == false) {
405 throw new InvalidOperationException("Cant set this property to AllHeaders or DisplayedHeaders in this DataGridView.");
407 autoSizeRowsMode = value;
409 if (value == DataGridViewAutoSizeRowsMode.None)
410 foreach (DataGridViewRow row in Rows)
411 row.ResetToExplicitHeight ();
413 AutoResizeRows (value);
415 OnAutoSizeRowsModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
417 ////////////////////////////////////////////////////////////////
423 [EditorBrowsable (EditorBrowsableState.Never)]
424 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
425 public override Color BackColor {
426 get { return backColor; }
428 if (backColor != value) {
430 OnBackColorChanged(EventArgs.Empty);
435 public Color BackgroundColor {
436 get { return backgroundColor; }
438 if (backgroundColor != value) {
439 if (value == Color.Empty) {
440 throw new ArgumentException("Cant set an Empty color.");
442 backgroundColor = value;
443 OnBackgroundColorChanged(EventArgs.Empty);
449 [EditorBrowsable (EditorBrowsableState.Never)]
450 public override Image BackgroundImage {
451 get { return backgroundImage; }
453 if (backgroundImage != value) {
454 backgroundImage = value;
455 OnBackgroundImageChanged(EventArgs.Empty);
461 [EditorBrowsable (EditorBrowsableState.Never)]
462 public override ImageLayout BackgroundImageLayout {
463 get { return base.BackgroundImageLayout; }
464 set { base.BackgroundImageLayout = value; }
467 [DefaultValue (BorderStyle.FixedSingle)]
468 public BorderStyle BorderStyle {
469 get { return borderStyle; }
471 if (borderStyle != value) {
472 if (!Enum.IsDefined(typeof(BorderStyle), value)) {
473 throw new InvalidEnumArgumentException("Invalid border style.");
476 OnBorderStyleChanged(EventArgs.Empty);
481 internal int BorderWidth {
483 switch (BorderStyle) {
484 case BorderStyle.Fixed3D:
486 case BorderStyle.FixedSingle:
488 case BorderStyle.None:
496 [DefaultValue (DataGridViewCellBorderStyle.Single)]
497 public DataGridViewCellBorderStyle CellBorderStyle {
498 get { return cellBorderStyle; }
500 if (cellBorderStyle != value) {
501 if (value == DataGridViewCellBorderStyle.Custom)
502 throw new ArgumentException ("CellBorderStyle cannot be set to Custom.");
504 cellBorderStyle = value;
506 DataGridViewAdvancedBorderStyle border = new DataGridViewAdvancedBorderStyle ();
508 switch (cellBorderStyle) {
509 case DataGridViewCellBorderStyle.Single:
510 border.All = DataGridViewAdvancedCellBorderStyle.Single;
512 case DataGridViewCellBorderStyle.Raised:
513 case DataGridViewCellBorderStyle.RaisedVertical:
514 border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
515 border.Top = DataGridViewAdvancedCellBorderStyle.None;
516 border.Left = DataGridViewAdvancedCellBorderStyle.Outset;
517 border.Right = DataGridViewAdvancedCellBorderStyle.Outset;
519 case DataGridViewCellBorderStyle.Sunken:
520 border.All = DataGridViewAdvancedCellBorderStyle.Inset;
522 case DataGridViewCellBorderStyle.None:
523 border.All = DataGridViewAdvancedCellBorderStyle.None;
525 case DataGridViewCellBorderStyle.SingleVertical:
526 border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
527 border.Top = DataGridViewAdvancedCellBorderStyle.None;
528 border.Left = DataGridViewAdvancedCellBorderStyle.None;
529 border.Right = DataGridViewAdvancedCellBorderStyle.Single;
531 case DataGridViewCellBorderStyle.SunkenVertical:
532 border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
533 border.Top = DataGridViewAdvancedCellBorderStyle.None;
534 border.Left = DataGridViewAdvancedCellBorderStyle.Inset;
535 border.Right = DataGridViewAdvancedCellBorderStyle.Inset;
537 case DataGridViewCellBorderStyle.SingleHorizontal:
538 case DataGridViewCellBorderStyle.SunkenHorizontal:
539 border.Bottom = DataGridViewAdvancedCellBorderStyle.Inset;
540 border.Top = DataGridViewAdvancedCellBorderStyle.Inset;
541 border.Left = DataGridViewAdvancedCellBorderStyle.None;
542 border.Right = DataGridViewAdvancedCellBorderStyle.None;
544 case DataGridViewCellBorderStyle.RaisedHorizontal:
545 border.Bottom = DataGridViewAdvancedCellBorderStyle.Outset;
546 border.Top = DataGridViewAdvancedCellBorderStyle.Outset;
547 border.Left = DataGridViewAdvancedCellBorderStyle.None;
548 border.Right = DataGridViewAdvancedCellBorderStyle.None;
552 advancedCellBorderStyle = border;
554 OnCellBorderStyleChanged (EventArgs.Empty);
560 [DefaultValue (DataGridViewClipboardCopyMode.EnableWithAutoHeaderText)]
561 public DataGridViewClipboardCopyMode ClipboardCopyMode {
562 get { return clipboardCopyMode; }
563 set { clipboardCopyMode = value; }
567 [EditorBrowsable (EditorBrowsableState.Advanced)]
568 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
570 public int ColumnCount {
571 get { return columns.Count; }
574 throw new ArgumentOutOfRangeException("ColumnCount",
575 "ColumnCount must be >= 0.");
577 if (dataSource != null) {
578 throw new InvalidOperationException("Cant change column count if DataSource is set.");
580 if (value < columns.Count) {
581 for (int i = value; i < columns.Count; i++) {
585 else if (value > columns.Count) {
586 for (int i = 0; i < value; i++) {
587 DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn ();
595 [DefaultValue (DataGridViewHeaderBorderStyle.Raised)]
596 public DataGridViewHeaderBorderStyle ColumnHeadersBorderStyle {
597 get { return columnHeadersBorderStyle; }
599 if (columnHeadersBorderStyle != value) {
600 columnHeadersBorderStyle = value;
601 OnColumnHeadersBorderStyleChanged(EventArgs.Empty);
606 [AmbientValue (null)]
607 public DataGridViewCellStyle ColumnHeadersDefaultCellStyle {
608 get { return columnHeadersDefaultCellStyle; }
610 if (columnHeadersDefaultCellStyle != value) {
611 columnHeadersDefaultCellStyle = value;
612 OnColumnHeadersDefaultCellStyleChanged(EventArgs.Empty);
618 public int ColumnHeadersHeight {
619 get { return columnHeadersHeight; }
621 if (columnHeadersHeight != value) {
623 throw new ArgumentOutOfRangeException("ColumnHeadersHeight",
624 "Column headers height cant be less than 4.");
626 if (value > 32768 ) {
627 throw new ArgumentOutOfRangeException("ColumnHeadersHeight",
628 "Column headers height cannot be more than 32768.");
630 columnHeadersHeight = value;
631 OnColumnHeadersHeightChanged(EventArgs.Empty);
633 if (columnHeadersVisible)
639 [RefreshProperties (RefreshProperties.All)]
640 [DefaultValue (DataGridViewColumnHeadersHeightSizeMode.EnableResizing)]
641 public DataGridViewColumnHeadersHeightSizeMode ColumnHeadersHeightSizeMode {
642 get { return columnHeadersHeightSizeMode; }
644 if (columnHeadersHeightSizeMode != value) {
645 if (!Enum.IsDefined(typeof(DataGridViewColumnHeadersHeightSizeMode), value)) {
646 throw new InvalidEnumArgumentException("Value is not a valid DataGridViewColumnHeadersHeightSizeMode.");
648 columnHeadersHeightSizeMode = value;
649 OnColumnHeadersHeightSizeModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
654 [DefaultValue (true)]
655 public bool ColumnHeadersVisible {
656 get { return columnHeadersVisible; }
658 if (columnHeadersVisible != value) {
659 columnHeadersVisible = value;
665 [MergableProperty (false)]
666 [Editor ("System.Windows.Forms.Design.DataGridViewColumnCollectionEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
667 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
668 public DataGridViewColumnCollection Columns {
669 get { return columns; }
673 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
674 public DataGridViewCell CurrentCell {
675 get { return currentCell; }
677 /////////////////////////////////////////////////////
678 /// *** InvalidOperationException ***
679 /// Changes to the specified cell cannot be committed
680 /// to the data cache, or the new cell is in a hidden
682 /////////////////////////////////////////////////////
684 MoveCurrentCell (-1, -1, true, false, false, true);
685 else if (value.DataGridView != this)
686 throw new ArgumentException("The cell is not in this DataGridView.");
688 MoveCurrentCell (value.OwningColumn.Index, value.OwningRow.Index, true, false, false, true);
693 public Point CurrentCellAddress {
694 get { return currentCellAddress; }
698 public DataGridViewRow CurrentRow {
700 if (currentCell != null)
701 return currentCell.OwningRow;
707 [Editor ("System.Windows.Forms.Design.DataMemberListEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
708 public string DataMember {
709 get { return dataMember; }
711 if (dataMember != value) {
714 OnDataMemberChanged(EventArgs.Empty);
719 [RefreshProperties (RefreshProperties.Repaint)]
720 [DefaultValue (null)]
721 [AttributeProvider (typeof (IListSource))]
722 public object DataSource {
723 get { return dataSource; }
725 /* 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:
726 - the System.Collections.IList interface, including one-dimensional arrays.
727 - the System.ComponentModel.IListSource interface, such as the System.Data.DataTable and System.Data.DataSet classes.
728 - the System.ComponentModel.IBindingList interface, such as the System.ComponentModel.Collections.BindingList<> class.
729 - the System.ComponentModel.IBindingListView interface, such as the System.Windows.Forms.BindingSource class.
731 if (!(value == null || value is IList || value is IListSource || value is IBindingList || value is IBindingListView))
732 throw new NotSupportedException ("Type cannot be bound.");
736 OnDataSourceChanged (EventArgs.Empty);
740 internal CurrencyManager DataManager {
742 if (DataSource != null && BindingContext != null) {
743 string dataMember = DataMember;
744 if (dataMember == null)
745 dataMember = String.Empty;
746 return (CurrencyManager) this.BindingContext[DataSource, dataMember];
752 [AmbientValue (null)]
753 public DataGridViewCellStyle DefaultCellStyle {
754 get { return defaultCellStyle; }
756 if (defaultCellStyle != value) {
757 defaultCellStyle = value;
758 OnDefaultCellStyleChanged(EventArgs.Empty);
763 public override Rectangle DisplayRectangle {
764 get { return base.DisplayRectangle; }
768 [EditorBrowsable (EditorBrowsableState.Advanced)]
769 public Control EditingControl {
771 return editingControl;
776 [EditorBrowsable (EditorBrowsableState.Advanced)]
777 public Panel EditingPanel {
778 get { throw new NotImplementedException(); }
781 [DefaultValue (DataGridViewEditMode.EditOnKeystrokeOrF2)]
782 public DataGridViewEditMode EditMode {
783 get { return editMode; }
785 if (editMode != value) {
787 OnEditModeChanged(EventArgs.Empty);
792 [DefaultValue (true)]
793 public bool EnableHeadersVisualStyles {
794 get { return enableHeadersVisualStyles; }
795 set { enableHeadersVisualStyles = value; }
798 internal DataGridViewHeaderCell EnteredHeaderCell {
799 get { return entered_header_cell; }
801 if (entered_header_cell == value)
803 if (ThemeEngine.Current.DataGridViewHeaderCellHasHotStyle (this)) {
804 Region area_to_invalidate = new Region ();
805 area_to_invalidate.MakeEmpty ();
806 if (entered_header_cell != null)
807 area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell));
808 entered_header_cell = value;
809 if (entered_header_cell != null)
810 area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell));
811 Invalidate (area_to_invalidate);
812 area_to_invalidate.Dispose ();
814 entered_header_cell = value;
819 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
820 public DataGridViewCell FirstDisplayedCell {
821 get { return firstDisplayedCell; }
823 if (value.DataGridView != this) {
824 throw new ArgumentException("The cell is not in this DataGridView.");
826 firstDisplayedCell = value;
831 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
832 [EditorBrowsable (EditorBrowsableState.Advanced)]
833 public int FirstDisplayedScrollingColumnHiddenWidth {
834 get { return firstDisplayedScrollingColumnHiddenWidth; }
838 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
839 public int FirstDisplayedScrollingColumnIndex {
840 get { return firstDisplayedScrollingColumnIndex; }
841 set { firstDisplayedScrollingColumnIndex = value; }
845 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
846 public int FirstDisplayedScrollingRowIndex {
847 get { return firstDisplayedScrollingRowIndex; }
848 set { firstDisplayedScrollingRowIndex = value; }
852 [EditorBrowsable (EditorBrowsableState.Advanced)]
853 public override Font Font {
854 get { return base.Font; }
855 set { base.Font = value; }
859 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
860 [EditorBrowsable (EditorBrowsableState.Advanced)]
861 public override Color ForeColor {
862 get { return base.ForeColor; }
863 set { base.ForeColor = value; }
866 public Color GridColor {
867 get { return gridColor; }
869 if (gridColor != value) {
870 if (value == Color.Empty) {
871 throw new ArgumentException("Cant set an Empty color.");
874 OnGridColorChanged(EventArgs.Empty);
880 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
881 public int HorizontalScrollingOffset {
882 get { return horizontalScrollingOffset; }
883 set { horizontalScrollingOffset = value; }
887 public bool IsCurrentCellDirty {
888 get { return isCurrentCellDirty; }
892 public bool IsCurrentCellInEditMode {
894 if (currentCell == null) {
897 return currentCell.IsInEditMode;
902 public bool IsCurrentRowDirty {
905 return IsCurrentCellDirty;
908 throw new NotImplementedException();
913 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
914 public DataGridViewCell this [int columnIndex, int rowIndex] {
915 get { return rows[rowIndex].Cells[columnIndex]; }
916 set { rows[rowIndex].Cells[columnIndex] = value; }
920 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
921 public DataGridViewCell this [string columnName, int rowIndex] {
923 int columnIndex = -1;
924 foreach (DataGridViewColumn col in columns) {
925 if (col.Name == columnName) {
926 columnIndex = col.Index;
930 return this[columnIndex, rowIndex];
933 int columnIndex = -1;
934 foreach (DataGridViewColumn col in columns) {
935 if (col.Name == columnName) {
936 columnIndex = col.Index;
940 this[columnIndex, rowIndex] = value;
944 [DefaultValue (true)]
945 public bool MultiSelect {
946 get { return multiSelect; }
948 if (multiSelect != value) {
950 OnMultiSelectChanged(EventArgs.Empty);
956 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
957 public int NewRowIndex {
959 if (!AllowUserToAddRows || ColumnCount == 0) {
962 return rows.Count - 1;
967 [EditorBrowsable (EditorBrowsableState.Never)]
968 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
969 public new Padding Padding {
970 get { return Padding.Empty; }
974 internal DataGridViewHeaderCell PressedHeaderCell {
975 get { return pressed_header_cell; }
979 [DefaultValue (false)]
980 public bool ReadOnly {
981 get { return readOnly; }
983 if (readOnly != value) {
985 OnReadOnlyChanged(EventArgs.Empty);
991 [EditorBrowsable (EditorBrowsableState.Advanced)]
992 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
994 public int RowCount {
995 get { return rows.Count; }
998 throw new ArgumentException("RowCount must be >= 0.");
1000 if (value < 1 && AllowUserToAddRows) {
1001 throw new ArgumentException("RowCount must be >= 1 if AllowUserToAddRows is true.");
1003 if (dataSource != null) {
1004 throw new InvalidOperationException("Cant change row count if DataSource is set.");
1006 if (value < rows.Count) {
1007 for (int i = value; i < rows.Count; i++) {
1011 else if (value > rows.Count) {
1012 // If we need to add rows and don't have any columns,
1013 // we create one column
1014 if (ColumnCount == 0)
1017 for (int i = rows.Count; i < value; i++) {
1018 DataGridViewRow row = (DataGridViewRow) RowTemplateFull;
1019 rows.AddInternal (row, false);
1021 foreach (DataGridViewColumn col in columns)
1022 row.Cells.Add (col.CellTemplate.Clone () as DataGridViewCell);
1029 [DefaultValue (DataGridViewHeaderBorderStyle.Raised)]
1030 public DataGridViewHeaderBorderStyle RowHeadersBorderStyle {
1031 get { return rowHeadersBorderStyle; }
1033 if (rowHeadersBorderStyle != value) {
1034 rowHeadersBorderStyle = value;
1035 OnRowHeadersBorderStyleChanged(EventArgs.Empty);
1040 [AmbientValue (null)]
1041 public DataGridViewCellStyle RowHeadersDefaultCellStyle {
1042 get { return rowHeadersDefaultCellStyle; }
1044 if (rowHeadersDefaultCellStyle != value) {
1045 rowHeadersDefaultCellStyle = value;
1046 OnRowHeadersDefaultCellStyleChanged(EventArgs.Empty);
1051 [DefaultValue (true)]
1052 public bool RowHeadersVisible {
1053 get { return rowHeadersVisible; }
1055 if (rowHeadersVisible != value) {
1056 rowHeadersVisible = value;
1062 [Localizable (true)]
1063 public int RowHeadersWidth {
1064 get { return rowHeadersWidth; }
1066 if (rowHeadersWidth != value) {
1068 throw new ArgumentOutOfRangeException("RowHeadersWidth",
1069 "Row headers width cant be less than 4.");
1071 if (value > 32768 ) {
1072 throw new ArgumentOutOfRangeException("RowHeadersWidth",
1073 "Row headers width cannot be more than 32768.");
1075 rowHeadersWidth = value;
1076 OnRowHeadersWidthChanged(EventArgs.Empty);
1078 if (rowHeadersVisible)
1084 [RefreshProperties (RefreshProperties.All)]
1085 [DefaultValue (DataGridViewRowHeadersWidthSizeMode.EnableResizing)]
1086 public DataGridViewRowHeadersWidthSizeMode RowHeadersWidthSizeMode {
1087 get { return rowHeadersWidthSizeMode; }
1089 if (rowHeadersWidthSizeMode != value) {
1090 if (!Enum.IsDefined(typeof(DataGridViewRowHeadersWidthSizeMode), value)) {
1091 throw new InvalidEnumArgumentException("Value is not valid DataGridViewRowHeadersWidthSizeMode.");
1093 rowHeadersWidthSizeMode = value;
1094 OnRowHeadersWidthSizeModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
1100 public DataGridViewRowCollection Rows {
1101 get { return rows; }
1104 public DataGridViewCellStyle RowsDefaultCellStyle {
1105 get { return rowsDefaultCellStyle; }
1107 if (rowsDefaultCellStyle != value) {
1108 rowsDefaultCellStyle = value;
1109 OnRowsDefaultCellStyleChanged(EventArgs.Empty);
1114 // RowTemplate is just the row, it does not contain Cells
1116 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
1117 public DataGridViewRow RowTemplate {
1119 if (rowTemplate == null)
1120 rowTemplate = new DataGridViewRow ();
1125 rowTemplate = value;
1126 rowTemplate.SetDataGridView(this);
1130 // Take the RowTemplate, clone it, and add Cells
1131 // Note this is not stored, so you don't need to Clone it
1132 internal DataGridViewRow RowTemplateFull {
1134 DataGridViewRow row = (DataGridViewRow) RowTemplate.Clone ();
1136 for (int i = row.Cells.Count; i < Columns.Count; i++) {
1137 DataGridViewCell template = columns [i].CellTemplate;
1139 if (template == null)
1140 throw new InvalidOperationException ("At least one of the DataGridView control's columns has no cell template.");
1142 row.Cells.Add ((DataGridViewCell) template.Clone ());
1149 internal override bool ScaleChildrenInternal {
1150 get { return false; }
1153 [DefaultValue (ScrollBars.Both)]
1154 [Localizable (true)]
1155 public ScrollBars ScrollBars {
1156 get { return scrollBars; }
1158 if (!Enum.IsDefined(typeof(ScrollBars), value)) {
1159 throw new InvalidEnumArgumentException("Invalid ScrollBars value.");
1161 ////////////////////////////////////////////////////////////
1162 /// *** InvalidOperationException ***
1163 /// The System.Windows.Forms.DataGridView is unable to
1164 /// scroll due to a cell change that cannot be committed
1166 ///////////////////////////////////////////////////////////
1172 public DataGridViewSelectedCellCollection SelectedCells {
1174 DataGridViewSelectedCellCollection selectedCells = new DataGridViewSelectedCellCollection();
1175 foreach (DataGridViewRow row in rows) {
1176 foreach (DataGridViewCell cell in row.Cells) {
1177 if (cell.Selected) {
1178 selectedCells.InternalAdd(cell);
1182 return selectedCells;
1187 public DataGridViewSelectedColumnCollection SelectedColumns {
1190 DataGridViewSelectedColumnCollection result = new DataGridViewSelectedColumnCollection ();
1192 if (selectionMode != DataGridViewSelectionMode.FullColumnSelect && selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect)
1195 result.InternalAddRange (selected_columns);
1202 public DataGridViewSelectedRowCollection SelectedRows {
1204 DataGridViewSelectedRowCollection result = new DataGridViewSelectedRowCollection (this);
1206 if (selectionMode != DataGridViewSelectionMode.FullRowSelect && selectionMode != DataGridViewSelectionMode.RowHeaderSelect)
1209 result.InternalAddRange (selected_rows);
1216 [DefaultValue (DataGridViewSelectionMode.RowHeaderSelect)]
1217 public DataGridViewSelectionMode SelectionMode {
1218 get { return selectionMode; }
1220 if (!Enum.IsDefined (typeof(DataGridViewSelectionMode), value))
1221 throw new InvalidEnumArgumentException ("Value is not valid DataGridViewSelectionMode.");
1223 if (value == DataGridViewSelectionMode.ColumnHeaderSelect || value == DataGridViewSelectionMode.FullColumnSelect)
1224 foreach (DataGridViewColumn col in Columns)
1225 if (col.SortMode == DataGridViewColumnSortMode.Automatic)
1226 throw new InvalidOperationException (string.Format ("Cannot set SelectionMode to {0} because there are Automatic sort columns.", value));
1228 selectionMode = value;
1232 [DefaultValue (true)]
1233 public bool ShowCellErrors {
1234 get { return showCellErrors; }
1235 set { showCellErrors = value; }
1238 [DefaultValue (true)]
1239 public bool ShowCellToolTips {
1240 get { return showCellToolTips; }
1241 set { showCellToolTips = value; }
1244 [DefaultValue (true)]
1245 public bool ShowEditingIcon {
1246 get { return showEditingIcon; }
1247 set { showEditingIcon = value; }
1250 [DefaultValue (true)]
1251 public bool ShowRowErrors {
1252 get { return showRowErrors; }
1253 set { showRowErrors = value; }
1257 public DataGridViewColumn SortedColumn {
1258 get { return sortedColumn; }
1262 public SortOrder SortOrder {
1263 get { return sortOrder; }
1266 [DefaultValue (false)]
1267 [EditorBrowsable (EditorBrowsableState.Advanced)]
1268 public bool StandardTab {
1269 get { return standardTab; }
1270 set { standardTab = value; }
1275 [EditorBrowsable (EditorBrowsableState.Never)]
1276 public override string Text {
1277 get { return base.Text; }
1278 set { base.Text = value; }
1282 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1283 public DataGridViewHeaderCell TopLeftHeaderCell {
1285 if (topLeftHeaderCell == null) {
1286 topLeftHeaderCell = new DataGridViewTopLeftHeaderCell ();
1287 topLeftHeaderCell.SetDataGridView (this);
1289 return topLeftHeaderCell;
1292 topLeftHeaderCell = value;
1293 topLeftHeaderCell.SetDataGridView (this);
1298 [EditorBrowsable (EditorBrowsableState.Advanced)]
1299 public Cursor UserSetCursor {
1300 get { return userSetCursor; }
1304 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1305 public int VerticalScrollingOffset {
1306 get { return verticalScrollingOffset; }
1309 [MonoTODO ("VirtualMode is not supported.")]
1310 [EditorBrowsable (EditorBrowsableState.Advanced)]
1311 [DefaultValue (false)]
1312 public bool VirtualMode {
1313 get { return virtualMode; }
1314 set { virtualMode = value; }
1317 internal Control EditingControlInternal {
1319 return editingControl;
1322 if (value == editingControl)
1325 if (editingControl != null) {
1326 // Can't use Controls.Remove (editingControls), because that method
1327 // is overriden to not remove the editing control.
1328 DataGridView.DataGridViewControlCollection ctrls = Controls as DataGridView.DataGridViewControlCollection;
1329 if (ctrls != null) {
1330 ctrls.RemoveInternal (editingControl);
1332 Controls.Remove (editingControl);
1337 if (value != null) {
1338 value.Visible = false;
1339 Controls.Add (value);
1342 editingControl = value;
1346 static object AllowUserToAddRowsChangedEvent = new object ();
1347 static object AllowUserToDeleteRowsChangedEvent = new object ();
1348 static object AllowUserToOrderColumnsChangedEvent = new object ();
1349 static object AllowUserToResizeColumnsChangedEvent = new object ();
1350 static object AllowUserToResizeRowsChangedEvent = new object ();
1351 static object AlternatingRowsDefaultCellStyleChangedEvent = new object ();
1352 static object AutoGenerateColumnsChangedEvent = new object ();
1353 static object AutoSizeColumnModeChangedEvent = new object ();
1354 static object AutoSizeColumnsModeChangedEvent = new object ();
1355 static object AutoSizeRowsModeChangedEvent = new object ();
1356 static object BackgroundColorChangedEvent = new object ();
1357 static object BorderStyleChangedEvent = new object ();
1358 static object CancelRowEditEvent = new object ();
1359 static object CellBeginEditEvent = new object ();
1360 static object CellBorderStyleChangedEvent = new object ();
1361 static object CellClickEvent = new object ();
1362 static object CellContentClickEvent = new object ();
1363 static object CellContentDoubleClickEvent = new object ();
1364 static object CellContextMenuStripChangedEvent = new object ();
1365 static object CellContextMenuStripNeededEvent = new object ();
1366 static object CellDoubleClickEvent = new object ();
1367 static object CellEndEditEvent = new object ();
1368 static object CellEnterEvent = new object ();
1369 static object CellErrorTextChangedEvent = new object ();
1370 static object CellErrorTextNeededEvent = new object ();
1371 static object CellFormattingEvent = new object ();
1372 static object CellLeaveEvent = new object ();
1373 static object CellMouseClickEvent = new object ();
1374 static object CellMouseDoubleClickEvent = new object ();
1375 static object CellMouseDownEvent = new object ();
1376 static object CellMouseEnterEvent = new object ();
1377 static object CellMouseLeaveEvent = new object ();
1378 static object CellMouseMoveEvent = new object ();
1379 static object CellMouseUpEvent = new object ();
1380 static object CellPaintingEvent = new object ();
1381 static object CellParsingEvent = new object ();
1382 static object CellStateChangedEvent = new object ();
1383 static object CellStyleChangedEvent = new object ();
1384 static object CellStyleContentChangedEvent = new object ();
1385 static object CellToolTipTextChangedEvent = new object ();
1386 static object CellToolTipTextNeededEvent = new object ();
1387 static object CellValidatedEvent = new object ();
1388 static object CellValidatingEvent = new object ();
1389 static object CellValueChangedEvent = new object ();
1390 static object CellValueNeededEvent = new object ();
1391 static object CellValuePushedEvent = new object ();
1392 static object ColumnAddedEvent = new object ();
1393 static object ColumnContextMenuStripChangedEvent = new object ();
1394 static object ColumnDataPropertyNameChangedEvent = new object ();
1395 static object ColumnDefaultCellStyleChangedEvent = new object ();
1396 static object ColumnDisplayIndexChangedEvent = new object ();
1397 static object ColumnDividerDoubleClickEvent = new object ();
1398 static object ColumnDividerWidthChangedEvent = new object ();
1399 static object ColumnHeaderCellChangedEvent = new object ();
1400 static object ColumnHeaderMouseClickEvent = new object ();
1401 static object ColumnHeaderMouseDoubleClickEvent = new object ();
1402 static object ColumnHeadersBorderStyleChangedEvent = new object ();
1403 static object ColumnHeadersDefaultCellStyleChangedEvent = new object ();
1404 static object ColumnHeadersHeightChangedEvent = new object ();
1405 static object ColumnHeadersHeightSizeModeChangedEvent = new object ();
1406 static object ColumnMinimumWidthChangedEvent = new object ();
1407 static object ColumnNameChangedEvent = new object ();
1408 static object ColumnRemovedEvent = new object ();
1409 static object ColumnSortModeChangedEvent = new object ();
1410 static object ColumnStateChangedEvent = new object ();
1411 static object ColumnToolTipTextChangedEvent = new object ();
1412 static object ColumnWidthChangedEvent = new object ();
1413 static object CurrentCellChangedEvent = new object ();
1414 static object CurrentCellDirtyStateChangedEvent = new object ();
1415 static object DataBindingCompleteEvent = new object ();
1416 static object DataErrorEvent = new object ();
1417 static object DataMemberChangedEvent = new object ();
1418 static object DataSourceChangedEvent = new object ();
1419 static object DefaultCellStyleChangedEvent = new object ();
1420 static object DefaultValuesNeededEvent = new object ();
1421 static object EditingControlShowingEvent = new object ();
1422 static object EditModeChangedEvent = new object ();
1423 static object GridColorChangedEvent = new object ();
1424 static object MultiSelectChangedEvent = new object ();
1425 static object NewRowNeededEvent = new object ();
1426 static object ReadOnlyChangedEvent = new object ();
1427 static object RowContextMenuStripChangedEvent = new object ();
1428 static object RowContextMenuStripNeededEvent = new object ();
1429 static object RowDefaultCellStyleChangedEvent = new object ();
1430 static object RowDirtyStateNeededEvent = new object ();
1431 static object RowDividerDoubleClickEvent = new object ();
1432 static object RowDividerHeightChangedEvent = new object ();
1433 static object RowEnterEvent = new object ();
1434 static object RowErrorTextChangedEvent = new object ();
1435 static object RowErrorTextNeededEvent = new object ();
1436 static object RowHeaderCellChangedEvent = new object ();
1437 static object RowHeaderMouseClickEvent = new object ();
1438 static object RowHeaderMouseDoubleClickEvent = new object ();
1439 static object RowHeadersBorderStyleChangedEvent = new object ();
1440 static object RowHeadersDefaultCellStyleChangedEvent = new object ();
1441 static object RowHeadersWidthChangedEvent = new object ();
1442 static object RowHeadersWidthSizeModeChangedEvent = new object ();
1443 static object RowHeightChangedEvent = new object ();
1444 static object RowHeightInfoNeededEvent = new object ();
1445 static object RowHeightInfoPushedEvent = new object ();
1446 static object RowLeaveEvent = new object ();
1447 static object RowMinimumHeightChangedEvent = new object ();
1448 static object RowPostPaintEvent = new object ();
1449 static object RowPrePaintEvent = new object ();
1450 static object RowsAddedEvent = new object ();
1451 static object RowsDefaultCellStyleChangedEvent = new object ();
1452 static object RowsRemovedEvent = new object ();
1453 static object RowStateChangedEvent = new object ();
1454 static object RowUnsharedEvent = new object ();
1455 static object RowValidatedEvent = new object ();
1456 static object RowValidatingEvent = new object ();
1457 static object ScrollEvent = new object ();
1458 static object SelectionChangedEvent = new object ();
1459 static object SortCompareEvent = new object ();
1460 static object SortedEvent = new object ();
1461 static object UserAddedRowEvent = new object ();
1462 static object UserDeletedRowEvent = new object ();
1463 static object UserDeletingRowEvent = new object ();
1468 public event EventHandler AllowUserToAddRowsChanged {
1469 add { Events.AddHandler (AllowUserToAddRowsChangedEvent, value); }
1470 remove { Events.RemoveHandler (AllowUserToAddRowsChangedEvent, value); }
1473 public event EventHandler AllowUserToDeleteRowsChanged {
1474 add { Events.AddHandler (AllowUserToDeleteRowsChangedEvent, value); }
1475 remove { Events.RemoveHandler (AllowUserToDeleteRowsChangedEvent, value); }
1478 public event EventHandler AllowUserToOrderColumnsChanged {
1479 add { Events.AddHandler (AllowUserToOrderColumnsChangedEvent, value); }
1480 remove { Events.RemoveHandler (AllowUserToOrderColumnsChangedEvent, value); }
1483 public event EventHandler AllowUserToResizeColumnsChanged {
1484 add { Events.AddHandler (AllowUserToResizeColumnsChangedEvent, value); }
1485 remove { Events.RemoveHandler (AllowUserToResizeColumnsChangedEvent, value); }
1488 public event EventHandler AllowUserToResizeRowsChanged {
1489 add { Events.AddHandler (AllowUserToResizeRowsChangedEvent, value); }
1490 remove { Events.RemoveHandler (AllowUserToResizeRowsChangedEvent, value); }
1493 public event EventHandler AlternatingRowsDefaultCellStyleChanged {
1494 add { Events.AddHandler (AlternatingRowsDefaultCellStyleChangedEvent, value); }
1495 remove { Events.RemoveHandler (AlternatingRowsDefaultCellStyleChangedEvent, value); }
1499 [EditorBrowsable (EditorBrowsableState.Advanced)]
1500 public event EventHandler AutoGenerateColumnsChanged {
1501 add { Events.AddHandler (AutoGenerateColumnsChangedEvent, value); }
1502 remove { Events.RemoveHandler (AutoGenerateColumnsChangedEvent, value); }
1505 public event DataGridViewAutoSizeColumnModeEventHandler AutoSizeColumnModeChanged {
1506 add { Events.AddHandler (AutoSizeColumnModeChangedEvent, value); }
1507 remove { Events.RemoveHandler (AutoSizeColumnModeChangedEvent, value); }
1510 public event DataGridViewAutoSizeColumnsModeEventHandler AutoSizeColumnsModeChanged {
1511 add { Events.AddHandler (AutoSizeColumnsModeChangedEvent, value); }
1512 remove { Events.RemoveHandler (AutoSizeColumnsModeChangedEvent, value); }
1515 public event DataGridViewAutoSizeModeEventHandler AutoSizeRowsModeChanged {
1516 add { Events.AddHandler (AutoSizeRowsModeChangedEvent, value); }
1517 remove { Events.RemoveHandler (AutoSizeRowsModeChangedEvent, value); }
1521 [EditorBrowsable (EditorBrowsableState.Never)]
1522 public new event EventHandler BackColorChanged {
1523 add { base.BackColorChanged += value; }
1524 remove { base.BackColorChanged -= value; }
1527 public event EventHandler BackgroundColorChanged {
1528 add { Events.AddHandler (BackgroundColorChangedEvent, value); }
1529 remove { Events.RemoveHandler (BackgroundColorChangedEvent, value); }
1533 [EditorBrowsable (EditorBrowsableState.Never)]
1534 public new event EventHandler BackgroundImageChanged {
1535 add { base.BackgroundImageChanged += value; }
1536 remove { base.BackgroundImageChanged -= value; }
1540 [EditorBrowsable (EditorBrowsableState.Never)]
1541 public new event EventHandler BackgroundImageLayoutChanged {
1542 add { base.BackgroundImageLayoutChanged += value; }
1543 remove { base.BackgroundImageLayoutChanged -= value; }
1546 public event EventHandler BorderStyleChanged {
1547 add { Events.AddHandler (BorderStyleChangedEvent, value); }
1548 remove { Events.RemoveHandler (BorderStyleChangedEvent, value); }
1551 public event QuestionEventHandler CancelRowEdit {
1552 add { Events.AddHandler (CancelRowEditEvent, value); }
1553 remove { Events.RemoveHandler (CancelRowEditEvent, value); }
1556 public event DataGridViewCellCancelEventHandler CellBeginEdit {
1557 add { Events.AddHandler (CellBeginEditEvent, value); }
1558 remove { Events.RemoveHandler (CellBeginEditEvent, value); }
1561 public event EventHandler CellBorderStyleChanged {
1562 add { Events.AddHandler (CellBorderStyleChangedEvent, value); }
1563 remove { Events.RemoveHandler (CellBorderStyleChangedEvent, value); }
1566 public event DataGridViewCellEventHandler CellClick {
1567 add { Events.AddHandler (CellClickEvent, value); }
1568 remove { Events.RemoveHandler (CellClickEvent, value); }
1571 public event DataGridViewCellEventHandler CellContentClick {
1572 add { Events.AddHandler (CellContentClickEvent, value); }
1573 remove { Events.RemoveHandler (CellContentClickEvent, value); }
1576 public event DataGridViewCellEventHandler CellContentDoubleClick {
1577 add { Events.AddHandler (CellContentDoubleClickEvent, value); }
1578 remove { Events.RemoveHandler (CellContentDoubleClickEvent, value); }
1581 [EditorBrowsable (EditorBrowsableState.Advanced)]
1582 public event DataGridViewCellEventHandler CellContextMenuStripChanged {
1583 add { Events.AddHandler (CellContextMenuStripChangedEvent, value); }
1584 remove { Events.RemoveHandler (CellContextMenuStripChangedEvent, value); }
1587 [EditorBrowsable (EditorBrowsableState.Advanced)]
1588 public event DataGridViewCellContextMenuStripNeededEventHandler CellContextMenuStripNeeded {
1589 add { Events.AddHandler (CellContextMenuStripNeededEvent, value); }
1590 remove { Events.RemoveHandler (CellContextMenuStripNeededEvent, value); }
1593 public event DataGridViewCellEventHandler CellDoubleClick {
1594 add { Events.AddHandler (CellDoubleClickEvent, value); }
1595 remove { Events.RemoveHandler (CellDoubleClickEvent, value); }
1598 public event DataGridViewCellEventHandler CellEndEdit {
1599 add { Events.AddHandler (CellEndEditEvent, value); }
1600 remove { Events.RemoveHandler (CellEndEditEvent, value); }
1603 public event DataGridViewCellEventHandler CellEnter {
1604 add { Events.AddHandler (CellEnterEvent, value); }
1605 remove { Events.RemoveHandler (CellEnterEvent, value); }
1608 public event DataGridViewCellEventHandler CellErrorTextChanged {
1609 add { Events.AddHandler (CellErrorTextChangedEvent, value); }
1610 remove { Events.RemoveHandler (CellErrorTextChangedEvent, value); }
1613 [EditorBrowsable (EditorBrowsableState.Advanced)]
1614 public event DataGridViewCellErrorTextNeededEventHandler CellErrorTextNeeded {
1615 add { Events.AddHandler (CellErrorTextNeededEvent, value); }
1616 remove { Events.RemoveHandler (CellErrorTextNeededEvent, value); }
1619 public event DataGridViewCellFormattingEventHandler CellFormatting {
1620 add { Events.AddHandler (CellFormattingEvent, value); }
1621 remove { Events.RemoveHandler (CellFormattingEvent, value); }
1624 public event DataGridViewCellEventHandler CellLeave {
1625 add { Events.AddHandler (CellLeaveEvent, value); }
1626 remove { Events.RemoveHandler (CellLeaveEvent, value); }
1629 public event DataGridViewCellMouseEventHandler CellMouseClick {
1630 add { Events.AddHandler (CellMouseClickEvent, value); }
1631 remove { Events.RemoveHandler (CellMouseClickEvent, value); }
1634 public event DataGridViewCellMouseEventHandler CellMouseDoubleClick {
1635 add { Events.AddHandler (CellMouseDoubleClickEvent, value); }
1636 remove { Events.RemoveHandler (CellMouseDoubleClickEvent, value); }
1639 public event DataGridViewCellMouseEventHandler CellMouseDown {
1640 add { Events.AddHandler (CellMouseDownEvent, value); }
1641 remove { Events.RemoveHandler (CellMouseDownEvent, value); }
1644 public event DataGridViewCellEventHandler CellMouseEnter {
1645 add { Events.AddHandler (CellMouseEnterEvent, value); }
1646 remove { Events.RemoveHandler (CellMouseEnterEvent, value); }
1649 public event DataGridViewCellEventHandler CellMouseLeave {
1650 add { Events.AddHandler (CellMouseLeaveEvent, value); }
1651 remove { Events.RemoveHandler (CellMouseLeaveEvent, value); }
1654 public event DataGridViewCellMouseEventHandler CellMouseMove {
1655 add { Events.AddHandler (CellMouseMoveEvent, value); }
1656 remove { Events.RemoveHandler (CellMouseMoveEvent, value); }
1659 public event DataGridViewCellMouseEventHandler CellMouseUp {
1660 add { Events.AddHandler (CellMouseUpEvent, value); }
1661 remove { Events.RemoveHandler (CellMouseUpEvent, value); }
1664 public event DataGridViewCellPaintingEventHandler CellPainting {
1665 add { Events.AddHandler (CellPaintingEvent, value); }
1666 remove { Events.RemoveHandler (CellPaintingEvent, value); }
1669 public event DataGridViewCellParsingEventHandler CellParsing {
1670 add { Events.AddHandler (CellParsingEvent, value); }
1671 remove { Events.RemoveHandler (CellParsingEvent, value); }
1674 public event DataGridViewCellStateChangedEventHandler CellStateChanged {
1675 add { Events.AddHandler (CellStateChangedEvent, value); }
1676 remove { Events.RemoveHandler (CellStateChangedEvent, value); }
1679 public event DataGridViewCellEventHandler CellStyleChanged {
1680 add { Events.AddHandler (CellStyleChangedEvent, value); }
1681 remove { Events.RemoveHandler (CellStyleChangedEvent, value); }
1684 public event DataGridViewCellStyleContentChangedEventHandler CellStyleContentChanged {
1685 add { Events.AddHandler (CellStyleContentChangedEvent, value); }
1686 remove { Events.RemoveHandler (CellStyleContentChangedEvent, value); }
1689 public event DataGridViewCellEventHandler CellToolTipTextChanged {
1690 add { Events.AddHandler (CellToolTipTextChangedEvent, value); }
1691 remove { Events.RemoveHandler (CellToolTipTextChangedEvent, value); }
1694 [EditorBrowsable (EditorBrowsableState.Advanced)]
1695 public event DataGridViewCellToolTipTextNeededEventHandler CellToolTipTextNeeded {
1696 add { Events.AddHandler (CellToolTipTextNeededEvent, value); }
1697 remove { Events.RemoveHandler (CellToolTipTextNeededEvent, value); }
1700 public event DataGridViewCellEventHandler CellValidated {
1701 add { Events.AddHandler (CellValidatedEvent, value); }
1702 remove { Events.RemoveHandler (CellValidatedEvent, value); }
1705 public event DataGridViewCellValidatingEventHandler CellValidating {
1706 add { Events.AddHandler (CellValidatingEvent, value); }
1707 remove { Events.RemoveHandler (CellValidatingEvent, value); }
1710 public event DataGridViewCellEventHandler CellValueChanged {
1711 add { Events.AddHandler (CellValueChangedEvent, value); }
1712 remove { Events.RemoveHandler (CellValueChangedEvent, value); }
1715 [EditorBrowsable (EditorBrowsableState.Advanced)]
1716 public event DataGridViewCellValueEventHandler CellValueNeeded {
1717 add { Events.AddHandler (CellValueNeededEvent, value); }
1718 remove { Events.RemoveHandler (CellValueNeededEvent, value); }
1721 [EditorBrowsable (EditorBrowsableState.Advanced)]
1722 public event DataGridViewCellValueEventHandler CellValuePushed {
1723 add { Events.AddHandler (CellValuePushedEvent, value); }
1724 remove { Events.RemoveHandler (CellValuePushedEvent, value); }
1727 public event DataGridViewColumnEventHandler ColumnAdded {
1728 add { Events.AddHandler (ColumnAddedEvent, value); }
1729 remove { Events.RemoveHandler (ColumnAddedEvent, value); }
1732 public event DataGridViewColumnEventHandler ColumnContextMenuStripChanged {
1733 add { Events.AddHandler (ColumnContextMenuStripChangedEvent, value); }
1734 remove { Events.RemoveHandler (ColumnContextMenuStripChangedEvent, value); }
1737 public event DataGridViewColumnEventHandler ColumnDataPropertyNameChanged {
1738 add { Events.AddHandler (ColumnDataPropertyNameChangedEvent, value); }
1739 remove { Events.RemoveHandler (ColumnDataPropertyNameChangedEvent, value); }
1742 public event DataGridViewColumnEventHandler ColumnDefaultCellStyleChanged {
1743 add { Events.AddHandler (ColumnDefaultCellStyleChangedEvent, value); }
1744 remove { Events.RemoveHandler (ColumnDefaultCellStyleChangedEvent, value); }
1747 public event DataGridViewColumnEventHandler ColumnDisplayIndexChanged {
1748 add { Events.AddHandler (ColumnDisplayIndexChangedEvent, value); }
1749 remove { Events.RemoveHandler (ColumnDisplayIndexChangedEvent, value); }
1752 public event DataGridViewColumnDividerDoubleClickEventHandler ColumnDividerDoubleClick {
1753 add { Events.AddHandler (ColumnDividerDoubleClickEvent, value); }
1754 remove { Events.RemoveHandler (ColumnDividerDoubleClickEvent, value); }
1757 public event DataGridViewColumnEventHandler ColumnDividerWidthChanged {
1758 add { Events.AddHandler (ColumnDividerWidthChangedEvent, value); }
1759 remove { Events.RemoveHandler (ColumnDividerWidthChangedEvent, value); }
1762 public event DataGridViewColumnEventHandler ColumnHeaderCellChanged {
1763 add { Events.AddHandler (ColumnHeaderCellChangedEvent, value); }
1764 remove { Events.RemoveHandler (ColumnHeaderCellChangedEvent, value); }
1767 public event DataGridViewCellMouseEventHandler ColumnHeaderMouseClick {
1768 add { Events.AddHandler (ColumnHeaderMouseClickEvent, value); }
1769 remove { Events.RemoveHandler (ColumnHeaderMouseClickEvent, value); }
1772 public event DataGridViewCellMouseEventHandler ColumnHeaderMouseDoubleClick {
1773 add { Events.AddHandler (ColumnHeaderMouseDoubleClickEvent, value); }
1774 remove { Events.RemoveHandler (ColumnHeaderMouseDoubleClickEvent, value); }
1777 public event EventHandler ColumnHeadersBorderStyleChanged {
1778 add { Events.AddHandler (ColumnHeadersBorderStyleChangedEvent, value); }
1779 remove { Events.RemoveHandler (ColumnHeadersBorderStyleChangedEvent, value); }
1782 public event EventHandler ColumnHeadersDefaultCellStyleChanged {
1783 add { Events.AddHandler (ColumnHeadersDefaultCellStyleChangedEvent, value); }
1784 remove { Events.RemoveHandler (ColumnHeadersDefaultCellStyleChangedEvent, value); }
1787 public event EventHandler ColumnHeadersHeightChanged {
1788 add { Events.AddHandler (ColumnHeadersHeightChangedEvent, value); }
1789 remove { Events.RemoveHandler (ColumnHeadersHeightChangedEvent, value); }
1792 public event DataGridViewAutoSizeModeEventHandler ColumnHeadersHeightSizeModeChanged {
1793 add { Events.AddHandler (ColumnHeadersHeightSizeModeChangedEvent, value); }
1794 remove { Events.RemoveHandler (ColumnHeadersHeightSizeModeChangedEvent, value); }
1797 public event DataGridViewColumnEventHandler ColumnMinimumWidthChanged {
1798 add { Events.AddHandler (ColumnMinimumWidthChangedEvent, value); }
1799 remove { Events.RemoveHandler (ColumnMinimumWidthChangedEvent, value); }
1802 public event DataGridViewColumnEventHandler ColumnNameChanged {
1803 add { Events.AddHandler (ColumnNameChangedEvent, value); }
1804 remove { Events.RemoveHandler (ColumnNameChangedEvent, value); }
1807 public event DataGridViewColumnEventHandler ColumnRemoved {
1808 add { Events.AddHandler (ColumnRemovedEvent, value); }
1809 remove { Events.RemoveHandler (ColumnRemovedEvent, value); }
1812 public event DataGridViewColumnEventHandler ColumnSortModeChanged {
1813 add { Events.AddHandler (ColumnSortModeChangedEvent, value); }
1814 remove { Events.RemoveHandler (ColumnSortModeChangedEvent, value); }
1817 public event DataGridViewColumnStateChangedEventHandler ColumnStateChanged {
1818 add { Events.AddHandler (ColumnStateChangedEvent, value); }
1819 remove { Events.RemoveHandler (ColumnStateChangedEvent, value); }
1822 public event DataGridViewColumnEventHandler ColumnToolTipTextChanged {
1823 add { Events.AddHandler (ColumnToolTipTextChangedEvent, value); }
1824 remove { Events.RemoveHandler (ColumnToolTipTextChangedEvent, value); }
1827 public event DataGridViewColumnEventHandler ColumnWidthChanged {
1828 add { Events.AddHandler (ColumnWidthChangedEvent, value); }
1829 remove { Events.RemoveHandler (ColumnWidthChangedEvent, value); }
1832 public event EventHandler CurrentCellChanged {
1833 add { Events.AddHandler (CurrentCellChangedEvent, value); }
1834 remove { Events.RemoveHandler (CurrentCellChangedEvent, value); }
1837 [EditorBrowsable (EditorBrowsableState.Advanced)]
1838 public event EventHandler CurrentCellDirtyStateChanged {
1839 add { Events.AddHandler (CurrentCellDirtyStateChangedEvent, value); }
1840 remove { Events.RemoveHandler (CurrentCellDirtyStateChangedEvent, value); }
1843 public event DataGridViewBindingCompleteEventHandler DataBindingComplete {
1844 add { Events.AddHandler (DataBindingCompleteEvent, value); }
1845 remove { Events.RemoveHandler (DataBindingCompleteEvent, value); }
1848 public event DataGridViewDataErrorEventHandler DataError {
1849 add { Events.AddHandler (DataErrorEvent, value); }
1850 remove { Events.RemoveHandler (DataErrorEvent, value); }
1853 public event EventHandler DataMemberChanged {
1854 add { Events.AddHandler (DataMemberChangedEvent, value); }
1855 remove { Events.RemoveHandler (DataMemberChangedEvent, value); }
1858 public event EventHandler DataSourceChanged {
1859 add { Events.AddHandler (DataSourceChangedEvent, value); }
1860 remove { Events.RemoveHandler (DataSourceChangedEvent, value); }
1863 public event EventHandler DefaultCellStyleChanged {
1864 add { Events.AddHandler (DefaultCellStyleChangedEvent, value); }
1865 remove { Events.RemoveHandler (DefaultCellStyleChangedEvent, value); }
1868 [EditorBrowsable (EditorBrowsableState.Advanced)]
1869 public event DataGridViewRowEventHandler DefaultValuesNeeded {
1870 add { Events.AddHandler (DefaultValuesNeededEvent, value); }
1871 remove { Events.RemoveHandler (DefaultValuesNeededEvent, value); }
1874 public event DataGridViewEditingControlShowingEventHandler EditingControlShowing {
1875 add { Events.AddHandler (EditingControlShowingEvent, value); }
1876 remove { Events.RemoveHandler (EditingControlShowingEvent, value); }
1879 public event EventHandler EditModeChanged {
1880 add { Events.AddHandler (EditModeChangedEvent, value); }
1881 remove { Events.RemoveHandler (EditModeChangedEvent, value); }
1885 [EditorBrowsable (EditorBrowsableState.Advanced)]
1886 public new event EventHandler FontChanged {
1887 add { base.FontChanged += value; }
1888 remove { base.FontChanged -= value; }
1892 [EditorBrowsable (EditorBrowsableState.Advanced)]
1893 public new event EventHandler ForeColorChanged {
1894 add { base.ForeColorChanged += value; }
1895 remove { base.ForeColorChanged -= value; }
1899 [EditorBrowsable (EditorBrowsableState.Never)]
1900 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1901 public new event EventHandler PaddingChanged {
1902 add { base.PaddingChanged += value; }
1903 remove { base.PaddingChanged -= value; }
1906 public event EventHandler GridColorChanged {
1907 add { Events.AddHandler (GridColorChangedEvent, value); }
1908 remove { Events.RemoveHandler (GridColorChangedEvent, value); }
1911 public event EventHandler MultiSelectChanged {
1912 add { Events.AddHandler (MultiSelectChangedEvent, value); }
1913 remove { Events.RemoveHandler (MultiSelectChangedEvent, value); }
1916 public event DataGridViewRowEventHandler NewRowNeeded {
1917 add { Events.AddHandler (NewRowNeededEvent, value); }
1918 remove { Events.RemoveHandler (NewRowNeededEvent, value); }
1921 public event EventHandler ReadOnlyChanged {
1922 add { Events.AddHandler (ReadOnlyChangedEvent, value); }
1923 remove { Events.RemoveHandler (ReadOnlyChangedEvent, value); }
1926 public event DataGridViewRowEventHandler RowContextMenuStripChanged {
1927 add { Events.AddHandler (RowContextMenuStripChangedEvent, value); }
1928 remove { Events.RemoveHandler (RowContextMenuStripChangedEvent, value); }
1931 [EditorBrowsable (EditorBrowsableState.Advanced)]
1932 public event DataGridViewRowContextMenuStripNeededEventHandler RowContextMenuStripNeeded {
1933 add { Events.AddHandler (RowContextMenuStripNeededEvent, value); }
1934 remove { Events.RemoveHandler (RowContextMenuStripNeededEvent, value); }
1937 public event DataGridViewRowEventHandler RowDefaultCellStyleChanged {
1938 add { Events.AddHandler (RowDefaultCellStyleChangedEvent, value); }
1939 remove { Events.RemoveHandler (RowDefaultCellStyleChangedEvent, value); }
1942 [EditorBrowsable (EditorBrowsableState.Advanced)]
1943 public event QuestionEventHandler RowDirtyStateNeeded {
1944 add { Events.AddHandler (RowDirtyStateNeededEvent, value); }
1945 remove { Events.RemoveHandler (RowDirtyStateNeededEvent, value); }
1948 public event DataGridViewRowDividerDoubleClickEventHandler RowDividerDoubleClick {
1949 add { Events.AddHandler (RowDividerDoubleClickEvent, value); }
1950 remove { Events.RemoveHandler (RowDividerDoubleClickEvent, value); }
1953 public event DataGridViewRowEventHandler RowDividerHeightChanged {
1954 add { Events.AddHandler (RowDividerHeightChangedEvent, value); }
1955 remove { Events.RemoveHandler (RowDividerHeightChangedEvent, value); }
1958 public event DataGridViewCellEventHandler RowEnter {
1959 add { Events.AddHandler (RowEnterEvent, value); }
1960 remove { Events.RemoveHandler (RowEnterEvent, value); }
1963 public event DataGridViewRowEventHandler RowErrorTextChanged {
1964 add { Events.AddHandler (RowErrorTextChangedEvent, value); }
1965 remove { Events.RemoveHandler (RowErrorTextChangedEvent, value); }
1968 [EditorBrowsable (EditorBrowsableState.Advanced)]
1969 public event DataGridViewRowErrorTextNeededEventHandler RowErrorTextNeeded {
1970 add { Events.AddHandler (RowErrorTextNeededEvent, value); }
1971 remove { Events.RemoveHandler (RowErrorTextNeededEvent, value); }
1974 public event DataGridViewRowEventHandler RowHeaderCellChanged {
1975 add { Events.AddHandler (RowHeaderCellChangedEvent, value); }
1976 remove { Events.RemoveHandler (RowHeaderCellChangedEvent, value); }
1979 public event DataGridViewCellMouseEventHandler RowHeaderMouseClick {
1980 add { Events.AddHandler (RowHeaderMouseClickEvent, value); }
1981 remove { Events.RemoveHandler (RowHeaderMouseClickEvent, value); }
1984 public event DataGridViewCellMouseEventHandler RowHeaderMouseDoubleClick {
1985 add { Events.AddHandler (RowHeaderMouseDoubleClickEvent, value); }
1986 remove { Events.RemoveHandler (RowHeaderMouseDoubleClickEvent, value); }
1989 public event EventHandler RowHeadersBorderStyleChanged {
1990 add { Events.AddHandler (RowHeadersBorderStyleChangedEvent, value); }
1991 remove { Events.RemoveHandler (RowHeadersBorderStyleChangedEvent, value); }
1994 public event EventHandler RowHeadersDefaultCellStyleChanged {
1995 add { Events.AddHandler (RowHeadersDefaultCellStyleChangedEvent, value); }
1996 remove { Events.RemoveHandler (RowHeadersDefaultCellStyleChangedEvent, value); }
1999 public event EventHandler RowHeadersWidthChanged {
2000 add { Events.AddHandler (RowHeadersWidthChangedEvent, value); }
2001 remove { Events.RemoveHandler (RowHeadersWidthChangedEvent, value); }
2004 public event DataGridViewAutoSizeModeEventHandler RowHeadersWidthSizeModeChanged {
2005 add { Events.AddHandler (RowHeadersWidthSizeModeChangedEvent, value); }
2006 remove { Events.RemoveHandler (RowHeadersWidthSizeModeChangedEvent, value); }
2009 public event DataGridViewRowEventHandler RowHeightChanged {
2010 add { Events.AddHandler (RowHeightChangedEvent, value); }
2011 remove { Events.RemoveHandler (RowHeightChangedEvent, value); }
2014 [EditorBrowsable (EditorBrowsableState.Advanced)]
2015 public event DataGridViewRowHeightInfoNeededEventHandler RowHeightInfoNeeded {
2016 add { Events.AddHandler (RowHeightInfoNeededEvent, value); }
2017 remove { Events.RemoveHandler (RowHeightInfoNeededEvent, value); }
2020 [EditorBrowsable (EditorBrowsableState.Advanced)]
2021 public event DataGridViewRowHeightInfoPushedEventHandler RowHeightInfoPushed {
2022 add { Events.AddHandler (RowHeightInfoPushedEvent, value); }
2023 remove { Events.RemoveHandler (RowHeightInfoPushedEvent, value); }
2026 public event DataGridViewCellEventHandler RowLeave {
2027 add { Events.AddHandler (RowLeaveEvent, value); }
2028 remove { Events.RemoveHandler (RowLeaveEvent, value); }
2031 public event DataGridViewRowEventHandler RowMinimumHeightChanged {
2032 add { Events.AddHandler (RowMinimumHeightChangedEvent, value); }
2033 remove { Events.RemoveHandler (RowMinimumHeightChangedEvent, value); }
2036 public event DataGridViewRowPostPaintEventHandler RowPostPaint {
2037 add { Events.AddHandler (RowPostPaintEvent, value); }
2038 remove { Events.RemoveHandler (RowPostPaintEvent, value); }
2041 public event DataGridViewRowPrePaintEventHandler RowPrePaint {
2042 add { Events.AddHandler (RowPrePaintEvent, value); }
2043 remove { Events.RemoveHandler (RowPrePaintEvent, value); }
2046 public event DataGridViewRowsAddedEventHandler RowsAdded {
2047 add { Events.AddHandler (RowsAddedEvent, value); }
2048 remove { Events.RemoveHandler (RowsAddedEvent, value); }
2051 public event EventHandler RowsDefaultCellStyleChanged {
2052 add { Events.AddHandler (RowsDefaultCellStyleChangedEvent, value); }
2053 remove { Events.RemoveHandler (RowsDefaultCellStyleChangedEvent, value); }
2056 public event DataGridViewRowsRemovedEventHandler RowsRemoved {
2057 add { Events.AddHandler (RowsRemovedEvent, value); }
2058 remove { Events.RemoveHandler (RowsRemovedEvent, value); }
2061 public event DataGridViewRowStateChangedEventHandler RowStateChanged {
2062 add { Events.AddHandler (RowStateChangedEvent, value); }
2063 remove { Events.RemoveHandler (RowStateChangedEvent, value); }
2066 [EditorBrowsable (EditorBrowsableState.Advanced)]
2067 public event DataGridViewRowEventHandler RowUnshared {
2068 add { Events.AddHandler (RowUnsharedEvent, value); }
2069 remove { Events.RemoveHandler (RowUnsharedEvent, value); }
2072 public event DataGridViewCellEventHandler RowValidated {
2073 add { Events.AddHandler (RowValidatedEvent, value); }
2074 remove { Events.RemoveHandler (RowValidatedEvent, value); }
2077 public event DataGridViewCellCancelEventHandler RowValidating {
2078 add { Events.AddHandler (RowValidatingEvent, value); }
2079 remove { Events.RemoveHandler (RowValidatingEvent, value); }
2082 public event ScrollEventHandler Scroll {
2083 add { Events.AddHandler (ScrollEvent, value); }
2084 remove { Events.RemoveHandler (ScrollEvent, value); }
2087 public event EventHandler SelectionChanged {
2088 add { Events.AddHandler (SelectionChangedEvent, value); }
2089 remove { Events.RemoveHandler (SelectionChangedEvent, value); }
2092 [EditorBrowsable (EditorBrowsableState.Advanced)]
2093 public event DataGridViewSortCompareEventHandler SortCompare {
2094 add { Events.AddHandler (SortCompareEvent, value); }
2095 remove { Events.RemoveHandler (SortCompareEvent, value); }
2098 public event EventHandler Sorted {
2099 add { Events.AddHandler (SortedEvent, value); }
2100 remove { Events.RemoveHandler (SortedEvent, value); }
2103 public event DataGridViewRowEventHandler UserAddedRow {
2104 add { Events.AddHandler (UserAddedRowEvent, value); }
2105 remove { Events.RemoveHandler (UserAddedRowEvent, value); }
2108 public event DataGridViewRowEventHandler UserDeletedRow {
2109 add { Events.AddHandler (UserDeletedRowEvent, value); }
2110 remove { Events.RemoveHandler (UserDeletedRowEvent, value); }
2113 public event DataGridViewRowCancelEventHandler UserDeletingRow {
2114 add { Events.AddHandler (UserDeletingRowEvent, value); }
2115 remove { Events.RemoveHandler (UserDeletingRowEvent, value); }
2119 [EditorBrowsable (EditorBrowsableState.Never)]
2120 public new event EventHandler StyleChanged {
2121 add { base.StyleChanged += value; }
2122 remove { base.StyleChanged -= value; }
2126 [EditorBrowsable (EditorBrowsableState.Never)]
2127 public new event EventHandler TextChanged {
2128 add { base.TextChanged += value; }
2129 remove { base.TextChanged -= value; }
2132 [EditorBrowsable (EditorBrowsableState.Advanced)]
2133 public virtual DataGridViewAdvancedBorderStyle AdjustColumnHeaderBorderStyle (DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStyleInput, DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStylePlaceholder, bool isFirstDisplayedColumn, bool isLastVisibleColumn) {
2134 return (DataGridViewAdvancedBorderStyle) ((ICloneable)dataGridViewAdvancedBorderStyleInput).Clone();
2137 public bool AreAllCellsSelected (bool includeInvisibleCells) {
2138 foreach (DataGridViewRow row in rows) {
2139 foreach (DataGridViewCell cell in row.Cells) {
2140 if (includeInvisibleCells == false && cell.Visible == false) {
2143 if (!cell.Selected) {
2151 public void AutoResizeColumn (int columnIndex) {
2152 AutoResizeColumn (columnIndex, DataGridViewAutoSizeColumnMode.AllCells);
2155 public void AutoResizeColumn (int columnIndex, DataGridViewAutoSizeColumnMode autoSizeColumnMode)
2157 AutoResizeColumnInternal (columnIndex, autoSizeColumnMode);
2160 public void AutoResizeColumnHeadersHeight ()
2164 foreach (DataGridViewColumn col in Columns)
2165 new_height = Math.Max (new_height, col.HeaderCell.PreferredSize.Height);
2167 if (ColumnHeadersHeight != new_height)
2168 ColumnHeadersHeight = new_height;
2171 [MonoTODO ("columnIndex parameter is not used")]
2172 public void AutoResizeColumnHeadersHeight (int columnIndex)
2174 AutoResizeColumnHeadersHeight ();
2177 public void AutoResizeColumns () {
2178 AutoResizeColumns (DataGridViewAutoSizeColumnsMode.AllCells);
2181 public void AutoResizeColumns (DataGridViewAutoSizeColumnsMode autoSizeColumnsMode) {
2182 AutoResizeColumns (autoSizeColumnsMode, true);
2185 public void AutoResizeRow (int rowIndex)
2187 AutoResizeRow (rowIndex, DataGridViewAutoSizeRowMode.AllCells, true);
2190 public void AutoResizeRow (int rowIndex, DataGridViewAutoSizeRowMode autoSizeRowMode)
2192 AutoResizeRow (rowIndex, autoSizeRowMode, true);
2195 public void AutoResizeRowHeadersWidth (DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode)
2197 if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToFirstHeader) {
2198 RowHeadersWidth = GetRowInternal (0).HeaderCell.PreferredSize.Width;
2204 if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders) {
2205 foreach (DataGridViewRow row in Rows)
2207 new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
2209 if (RowHeadersWidth != new_width)
2210 RowHeadersWidth = new_width;
2215 if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders) {
2216 foreach (DataGridViewRow row in Rows)
2217 new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
2219 if (RowHeadersWidth != new_width)
2220 RowHeadersWidth = new_width;
2226 [MonoTODO ("Does not use rowIndex parameter.")]
2227 public void AutoResizeRowHeadersWidth (int rowIndex, DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode)
2229 AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
2232 public void AutoResizeRows ()
2234 AutoResizeRows (0, Rows.Count, DataGridViewAutoSizeRowMode.AllCells, false);
2237 public void AutoResizeRows (DataGridViewAutoSizeRowsMode autoSizeRowsMode)
2239 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeRowsMode), autoSizeRowsMode))
2240 throw new InvalidEnumArgumentException ("Parameter autoSizeRowsMode is not a valid DataGridViewRowsMode.");
2241 if ((autoSizeRowsMode == DataGridViewAutoSizeRowsMode.AllHeaders || autoSizeRowsMode == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && rowHeadersVisible == false)
2242 throw new InvalidOperationException ("Parameter autoSizeRowsMode cannot be AllHeaders or DisplayedHeaders in this DataGridView.");
2243 if (autoSizeRowsMode == DataGridViewAutoSizeRowsMode.None)
2244 throw new ArgumentException ("Parameter autoSizeRowsMode cannot be None.");
2246 AutoResizeRows (autoSizeRowsMode, false);
2249 public virtual bool BeginEdit (bool selectAll) {
2250 if (currentCell == null || currentCell.IsInEditMode)
2253 if (currentCell.RowIndex >= 0) {
2254 if ((currentCell.InheritedState & DataGridViewElementStates.ReadOnly) == DataGridViewElementStates.ReadOnly) {
2259 DataGridViewCell cell = currentCell;
2260 Type editType = cell.EditType;
2262 if (editType == null && !(cell is IDataGridViewEditingCell))
2265 // Give user a chance to cancel the edit
2266 DataGridViewCellCancelEventArgs e = new DataGridViewCellCancelEventArgs (cell.ColumnIndex, cell.RowIndex);
2267 OnCellBeginEdit (e);
2272 cell.SetIsInEditMode (true);
2274 // The cell has an editing control we need to setup
2275 if (editType != null) {
2276 Control ctrl = EditingControlInternal;
2278 // Check if we can reuse the one we already have
2279 bool isCorrectType = ctrl != null && ctrl.GetType () == editType;
2284 // We couldn't use the existing one, create a new one
2286 ctrl = (Control) Activator.CreateInstance (editType);
2287 EditingControlInternal = ctrl;
2290 // Call some functions that allows the editing control to get setup
2291 DataGridViewCellStyle style = cell.RowIndex == -1 ? DefaultCellStyle : cell.InheritedStyle;
2293 cell.InitializeEditingControl (cell.RowIndex, cell.FormattedValue, style);
2294 cell.PositionEditingControl (true, true, this.GetCellDisplayRectangle (cell.ColumnIndex, cell.RowIndex, false), bounds, style, false, false, (columns [cell.ColumnIndex].DisplayIndex == 0), (cell.RowIndex == 0));
2296 // Show the editing control
2297 if (EditingControlInternal != null)
2298 EditingControlInternal.Visible = true;
2300 IDataGridViewEditingControl dgvEditingControl = (IDataGridViewEditingControl) EditingControlInternal;
2301 if (dgvEditingControl != null) {
2302 dgvEditingControl.EditingControlDataGridView = this;
2303 dgvEditingControl.EditingControlRowIndex = currentCell.OwningRow.Index;
2304 dgvEditingControl.ApplyCellStyleToEditingControl (style);
2305 dgvEditingControl.PrepareEditingControlForEdit (selectAll);
2306 dgvEditingControl.EditingControlFormattedValue = currentCell.EditedFormattedValue;
2311 // If we are here, it means we have a cell that does not have an editing control
2312 // and simply implements IDataGridViewEditingCell itself.
2313 (cell as IDataGridViewEditingCell).PrepareEditingCellForEdit (selectAll);
2318 public bool CancelEdit ()
2320 if (currentCell != null) {
2321 if (currentCell.IsInEditMode) {
2322 currentCell.SetIsInEditMode (false);
2323 currentCell.DetachEditingControl ();
2326 if (currentCell.RowIndex == NewRowIndex) {
2327 if (DataManager != null)
2328 DataManager.CancelCurrentEdit ();
2330 new_row_editing = false;
2331 PrepareEditingRow (false, false);
2332 MoveCurrentCell (currentCell.ColumnIndex, NewRowIndex, true, false, false, true);
2333 OnUserDeletedRow (new DataGridViewRowEventArgs (EditingRow));
2340 public void ClearSelection ()
2342 foreach (DataGridViewColumn col in SelectedColumns)
2343 col.Selected = false;
2344 foreach (DataGridViewRow row in SelectedRows)
2345 row.Selected = false;
2346 foreach (DataGridViewCell cell in SelectedCells)
2347 cell.Selected = false;
2350 public bool CommitEdit (DataGridViewDataErrorContexts context)
2352 if (currentCell == null)
2356 currentCell.Value = currentCell.ParseFormattedValue (currentCell.EditedFormattedValue,
2357 currentCell.InheritedStyle, null, null);
2358 } catch (Exception e) {
2359 DataGridViewDataErrorEventArgs args = new DataGridViewDataErrorEventArgs (e, currentCell.ColumnIndex, currentCell.RowIndex,
2360 DataGridViewDataErrorContexts.Commit);
2361 OnDataError (false, args);
2362 if (args.ThrowException)
2369 [MonoTODO ("Always includes partial columns")]
2370 public int DisplayedColumnCount (bool includePartialColumns)
2374 for (int i = first_col_index; i < Columns.Count; i++)
2375 if (Columns.ColumnDisplayIndexSortedArrayList[i].Displayed)
2383 public int DisplayedRowCount (bool includePartialRow)
2388 if (ColumnHeadersVisible)
2389 rowTop += ColumnHeadersHeight;
2391 for (int index = first_row_index; index < Rows.Count; index++) {
2392 DataGridViewRow row = GetRowInternal (index);
2393 if (rowTop + row.Height <= ClientSize.Height) {
2395 rowTop += row.Height;
2397 if (includePartialRow)
2406 public bool EndEdit ()
2408 return EndEdit (DataGridViewDataErrorContexts.Commit);
2411 [MonoTODO ("Does not use context parameter")]
2412 public bool EndEdit (DataGridViewDataErrorContexts context)
2414 if (currentCell == null || !currentCell.IsInEditMode)
2417 if (!CommitEdit (context)) {
2418 if (DataManager != null)
2419 DataManager.EndCurrentEdit ();
2420 if (EditingControl != null)
2421 EditingControl.Focus ();
2425 currentCell.SetIsInEditMode (false);
2426 currentCell.DetachEditingControl ();
2427 OnCellEndEdit (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
2429 if (currentCell.RowIndex == NewRowIndex) {
2430 new_row_editing = false;
2431 editing_row = null; // editing row becomes a real row
2432 PrepareEditingRow (true, false); // add a new editing row
2433 MoveCurrentCell (currentCell.ColumnIndex, NewRowIndex, true, false, false, true);
2438 public int GetCellCount (DataGridViewElementStates includeFilter) {
2440 foreach (DataGridViewRow row in rows) {
2441 foreach (DataGridViewCell cell in row.Cells) {
2442 if ((cell.State & includeFilter) != 0) {
2450 internal DataGridViewRow GetRowInternal (int rowIndex)
2452 return Rows.SharedRow (rowIndex);
2455 internal DataGridViewCell GetCellInternal (int colIndex, int rowIndex)
2457 return GetRowInternal (rowIndex).Cells.GetCellInternal (colIndex);
2460 public Rectangle GetCellDisplayRectangle (int columnIndex, int rowIndex, bool cutOverflow) {
2461 if (columnIndex < 0 || columnIndex >= columns.Count) {
2462 throw new ArgumentOutOfRangeException("Column index is out of range.");
2465 int x = 0, y = 0, w = 0, h = 0;
2470 if (ColumnHeadersVisible)
2471 y += ColumnHeadersHeight;
2473 if (RowHeadersVisible)
2474 x += RowHeadersWidth;
2476 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2478 for (int i = first_col_index; i < cols.Count; i++) {
2479 if (!cols[i].Visible)
2482 if (cols[i].Index == columnIndex) {
2490 for (int i = first_row_index; i < Rows.Count; i++) {
2491 if (i == rowIndex) {
2492 h = rows [i].Height;
2496 y += rows [i].Height;
2499 return new Rectangle (x, y, w, h);
2502 public virtual DataObject GetClipboardContent () {
2504 if (clipboardCopyMode == DataGridViewClipboardCopyMode.Disable)
2505 throw new InvalidOperationException ("Generating Clipboard content is not supported when the ClipboardCopyMode property is Disable.");
2507 int start_row = int.MaxValue, end_row = int.MinValue;
2508 int start_col = int.MaxValue, end_col = int.MinValue;
2510 bool include_row_headers = false;
2511 bool include_col_headers = false;
2512 bool only_included_headers = false;
2513 bool headers_includable = false;
2515 switch (ClipboardCopyMode) {
2516 case DataGridViewClipboardCopyMode.EnableWithoutHeaderText:
2518 case DataGridViewClipboardCopyMode.EnableWithAutoHeaderText:
2519 // Headers are included if not selection mode is CellSelect, and any header is selected.
2520 headers_includable = selectionMode != DataGridViewSelectionMode.CellSelect;
2522 case DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText:
2523 include_col_headers = include_row_headers = true;
2527 BitArray included_rows = new BitArray (RowCount);
2528 BitArray included_cols = new BitArray (ColumnCount);
2530 // If there are any selected columns,
2531 // include the column headers (if headers are to be shown).
2532 if (headers_includable && !include_col_headers) {
2533 for (int c = 0; c < ColumnCount; c++) {
2534 if (Columns [c].Selected) {
2535 include_col_headers = true;
2541 // Find the smallest rectangle that encompasses all selected cells.
2542 for (int r = 0; r < RowCount; r++) {
2543 DataGridViewRow row = Rows [r];
2545 if (headers_includable && !include_row_headers && row.Selected) {
2546 include_row_headers = true;
2549 for (int c = 0; c < ColumnCount; c++) {
2550 DataGridViewCell cell = row.Cells [c];
2552 if (cell == null || !cell.Selected)
2555 included_cols [c] = true;
2556 included_rows [r] = true;
2558 start_row = Math.Min (start_row, r);
2559 start_col = Math.Min (start_col, c);
2560 end_row = Math.Max (end_row, r);
2561 end_col = Math.Max (end_col, c);
2565 // Mark rows/columns in between selected cells as included if the selection mode isn't FullHeaderSelect.
2566 switch (selectionMode){
2567 case DataGridViewSelectionMode.CellSelect:
2568 case DataGridViewSelectionMode.ColumnHeaderSelect:
2569 case DataGridViewSelectionMode.RowHeaderSelect:
2570 if (selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect) {
2571 for (int r = start_row; r <= end_row; r++) {
2572 included_rows.Set (r, true);
2574 } else if (start_row <= end_row) {
2575 included_rows.SetAll (true);
2577 if (selectionMode != DataGridViewSelectionMode.RowHeaderSelect) {
2578 for (int c = start_col; c <= end_col; c++) {
2579 included_cols.Set (c, true);
2583 case DataGridViewSelectionMode.FullColumnSelect:
2584 case DataGridViewSelectionMode.FullRowSelect:
2585 only_included_headers = true;
2589 if (start_row > end_row)
2592 if (start_col > end_col)
2595 DataObject result = new DataObject ();
2597 System.Text.StringBuilder text_builder = new System.Text.StringBuilder ();
2598 System.Text.StringBuilder utext_builder = new System.Text.StringBuilder ();
2599 System.Text.StringBuilder html_builder = new System.Text.StringBuilder ();
2600 System.Text.StringBuilder csv_builder = new System.Text.StringBuilder ();
2602 // Loop through all rows and columns to create the content.
2603 // -1 is the header row/column.
2604 int first_row = start_row;
2605 int first_col = start_col;
2606 if (include_col_headers) {
2609 for (int r = first_row; r <= end_row; r++) {
2610 DataGridViewRow row = null;
2613 if (!included_rows [r])
2619 if (include_row_headers) {
2623 for (int c = first_col; c <= end_col; c++) {
2624 DataGridViewCell cell = null;
2626 if (c >= 0 && only_included_headers && !included_cols [c])
2631 cell = TopLeftHeaderCell;
2633 cell = Columns [c].HeaderCell;
2637 cell = row.HeaderCell;
2639 cell = row.Cells [c];
2643 string text, utext, html, csv;
2644 bool is_first_cell = (c == first_col);
2645 bool is_last_cell = (c == end_col);
2646 bool is_first_row = (r == first_row);
2647 bool is_last_row = (r == end_row);
2650 text = string.Empty;
2651 utext = string.Empty;
2652 html = string.Empty;
2655 text = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.Text) as string;
2656 utext = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.UnicodeText) as string;
2657 html = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.Html) as string;
2658 csv = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.CommaSeparatedValue) as string;
2661 text_builder.Append (text);
2662 utext_builder.Append (utext);
2663 html_builder.Append (html);
2664 csv_builder.Append (csv);
2666 if (c == -1) { // If we just did the row header, jump to the first column.
2671 if (r == -1) {// If we just did the column header, jump to the first row.
2677 // Html content always get the \r\n newline
2678 // It's valid html anyway, and it eases testing quite a bit
2679 // (since otherwise we'd have to change the start indices
2680 // in the added prologue/epilogue text)
2682 int fragment_end = 135 + html_builder.Length;
2683 int html_end = fragment_end + 36;
2686 "StartHTML:00000097{0}" +
2687 "EndHTML:{1:00000000}{0}" +
2688 "StartFragment:00000133{0}" +
2689 "EndFragment:{2:00000000}{0}" +
2692 "<!--StartFragment-->";
2694 html_start = string.Format (html_start, "\r\n", html_end, fragment_end);
2695 html_builder.Insert (0, html_start);
2696 html_builder.AppendFormat ("{0}<!--EndFragment-->{0}</BODY>{0}</HTML>", "\r\n");
2698 result.SetData (DataFormats.CommaSeparatedValue, false, csv_builder.ToString ());
2699 result.SetData (DataFormats.Html, false, html_builder.ToString ());
2700 result.SetData (DataFormats.UnicodeText, false, utext_builder.ToString ());
2701 result.SetData (DataFormats.Text, false, text_builder.ToString ());
2706 [MonoTODO ("Does not use cutOverflow parameter")]
2707 public Rectangle GetColumnDisplayRectangle (int columnIndex, bool cutOverflow)
2709 if (columnIndex < 0 || columnIndex > Columns.Count - 1)
2710 throw new ArgumentOutOfRangeException ("columnIndex");
2717 if (RowHeadersVisible)
2718 x += RowHeadersWidth;
2720 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2722 for (int i = first_col_index; i < cols.Count; i++) {
2723 if (!cols[i].Visible)
2726 if (cols[i].Index == columnIndex) {
2734 return new Rectangle (x, 0, w, Height);
2737 [MonoTODO ("Does not use cutOverflow parameter")]
2738 public Rectangle GetRowDisplayRectangle (int rowIndex, bool cutOverflow)
2740 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
2741 throw new ArgumentOutOfRangeException ("rowIndex");
2748 if (ColumnHeadersVisible)
2749 y += ColumnHeadersHeight;
2751 for (int i = first_row_index; i < Rows.Count; i++) {
2752 if (i == rowIndex) {
2757 y += rows[i].Height;
2760 return new Rectangle (0, y, Width, h);
2763 public HitTestInfo HitTest (int x, int y) {
2764 ///////////////////////////////////////////////////////
2765 //Console.WriteLine ("HitTest ({0}, {1})", x, y);
2766 bool isInColHeader = columnHeadersVisible && y >= 0 && y <= ColumnHeadersHeight;
2767 bool isInRowHeader = rowHeadersVisible && x >= 0 && x <= RowHeadersWidth;
2770 if (isInColHeader && isInRowHeader)
2771 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.TopLeftHeader);
2773 // HorizontalScrollBar
2774 if (horizontalScrollBar.Visible && horizontalScrollBar.Bounds.Contains (x, y))
2775 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.HorizontalScrollBar);
2777 // VerticalScrollBar
2778 if (verticalScrollBar.Visible && verticalScrollBar.Bounds.Contains (x, y))
2779 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.VerticalScrollBar);
2781 // The little box in the bottom right if both scrollbars are shown is None
2782 if (verticalScrollBar.Visible && horizontalScrollBar.Visible)
2783 if (new Rectangle (verticalScrollBar.Left, horizontalScrollBar.Top, verticalScrollBar.Width, horizontalScrollBar.Height).Contains (x, y))
2784 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.None);
2789 int top = columnHeadersVisible ? columnHeadersHeight : 0;
2791 for (int i = first_row_index; i < Rows.Count; i++) {
2792 DataGridViewRow row = Rows[i];
2794 if (y > top && y <= (top + row.Height)) {
2802 int left = rowHeadersVisible ? RowHeadersWidth : 0;
2804 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2806 for (int i = first_col_index; i < cols.Count; i++) {
2807 if (!cols[i].Visible)
2810 if (x > left && x <= (left + cols[i].Width)) {
2811 colindex = cols[i].Index;
2815 left += cols[i].Width;
2818 if (colindex >= 0 && rowindex >= 0)
2819 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.Cell);
2821 if (isInColHeader && colindex > -1)
2822 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.ColumnHeader);
2824 if (isInRowHeader && rowindex > -1)
2825 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.RowHeader);
2827 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.None);
2830 [MonoTODO ("Invalidates whole grid")]
2831 public void InvalidateCell (DataGridViewCell dataGridViewCell)
2833 if (dataGridViewCell == null)
2834 throw new ArgumentNullException ("Cell is null");
2836 if (dataGridViewCell.DataGridView != this)
2837 throw new ArgumentException ("The specified cell does not belong to this DataGridView.");
2839 InvalidateCell (dataGridViewCell.ColumnIndex, dataGridViewCell.RowIndex);
2842 [MonoTODO ("Invalidates whole grid")]
2843 public void InvalidateCell (int columnIndex, int rowIndex)
2845 if (columnIndex < 0 || columnIndex >= columns.Count)
2846 throw new ArgumentOutOfRangeException ("Column index is out of range.");
2848 if (rowIndex < 0 || rowIndex >= rows.Count)
2849 throw new ArgumentOutOfRangeException ("Row index is out of range.");
2851 Invalidate (GetCellDisplayRectangle (columnIndex, rowIndex, true));
2854 [MonoTODO ("Invalidates whole grid")]
2855 public void InvalidateColumn (int columnIndex)
2857 if (columnIndex < 0 || columnIndex >= columns.Count)
2858 throw new ArgumentOutOfRangeException ("Column index is out of range.");
2860 Invalidate (GetColumnDisplayRectangle (columnIndex, true));
2863 [MonoTODO ("Invalidates whole grid")]
2864 public void InvalidateRow (int rowIndex)
2866 if (rowIndex < 0 || rowIndex >= rows.Count)
2867 throw new ArgumentOutOfRangeException ("Row index is out of range.");
2869 Invalidate (GetRowDisplayRectangle (rowIndex, true));
2872 public virtual void NotifyCurrentCellDirty (bool dirty) {
2873 if (currentCell != null)
2874 InvalidateCell (currentCell);
2877 public bool RefreshEdit ()
2879 if (IsCurrentCellInEditMode) {
2880 currentCell.InitializeEditingControl (currentCell.RowIndex, currentCell.FormattedValue, currentCell.InheritedStyle);
2887 [EditorBrowsable (EditorBrowsableState.Never)]
2888 public override void ResetText ()
2890 Text = string.Empty;
2893 public void SelectAll () {
2894 switch (selectionMode) {
2895 case DataGridViewSelectionMode.FullRowSelect:
2896 foreach (DataGridViewRow row in rows) {
2897 (row as DataGridViewBand).Selected = true;
2900 case DataGridViewSelectionMode.FullColumnSelect:
2901 foreach (DataGridViewColumn col in columns) {
2902 (col as DataGridViewBand).Selected = true;
2906 foreach (DataGridViewRow row in rows) {
2907 foreach (DataGridViewCell cell in row.Cells) {
2908 cell.Selected = true;
2917 public virtual void Sort (IComparer comparer)
2919 if (comparer == null)
2920 throw new ArgumentNullException ("comparer");
2921 if (VirtualMode || DataSource != null)
2922 throw new InvalidOperationException ();
2924 if (SortedColumn != null)
2925 SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
2929 Rows.Sort (comparer);
2931 sortedColumn = null;
2932 sortOrder = SortOrder.None;
2938 OnSorted (EventArgs.Empty);
2941 public virtual void Sort (DataGridViewColumn dataGridViewColumn, ListSortDirection direction)
2943 if (dataGridViewColumn == null)
2944 throw new ArgumentNullException ("dataGridViewColumn");
2945 if (dataGridViewColumn.DataGridView != this)
2946 throw new ArgumentException ("dataGridViewColumn");
2951 if (SortedColumn != null)
2952 SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
2954 sortedColumn = dataGridViewColumn;
2955 sortOrder = direction == ListSortDirection.Ascending ? SortOrder.Ascending : SortOrder.Descending;
2957 if (Rows.Count == 0)
2960 if (dataGridViewColumn.IsDataBound) {
2961 IBindingList bindingList = DataManager.List as IBindingList;
2962 if (bindingList != null && bindingList.SupportsSorting) {
2963 bindingList.ApplySort (DataManager.GetItemProperties()[dataGridViewColumn.DataPropertyName], direction);
2964 dataGridViewColumn.HeaderCell.SortGlyphDirection = sortOrder;
2967 // Figure out if this is a numeric sort or text sort
2968 bool is_numeric = true;
2971 foreach (DataGridViewRow row in Rows) {
2972 object val = row.Cells[dataGridViewColumn.Index].Value;
2974 if (val != null && !double.TryParse (val.ToString (), out n)) {
2980 ColumnSorter sorter = new ColumnSorter (dataGridViewColumn, direction, is_numeric);
2982 dataGridViewColumn.HeaderCell.SortGlyphDirection = sortOrder;
2986 OnSorted (EventArgs.Empty);
2989 public void UpdateCellErrorText (int columnIndex, int rowIndex)
2991 if (columnIndex < 0 || columnIndex > Columns.Count - 1)
2992 throw new ArgumentOutOfRangeException ("columnIndex");
2993 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
2994 throw new ArgumentOutOfRangeException ("rowIndex");
2996 InvalidateCell (columnIndex, rowIndex);
2999 public void UpdateCellValue (int columnIndex, int rowIndex)
3001 if (columnIndex < 0 || columnIndex > Columns.Count - 1)
3002 throw new ArgumentOutOfRangeException ("columnIndex");
3003 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3004 throw new ArgumentOutOfRangeException ("rowIndex");
3006 InvalidateCell (columnIndex, rowIndex);
3009 public void UpdateRowErrorText (int rowIndex)
3011 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3012 throw new ArgumentOutOfRangeException ("rowIndex");
3014 InvalidateRow (rowIndex);
3017 public void UpdateRowErrorText (int rowIndexStart, int rowIndexEnd)
3019 if (rowIndexStart < 0 || rowIndexStart > Rows.Count - 1)
3020 throw new ArgumentOutOfRangeException ("rowIndexStart");
3021 if (rowIndexEnd < 0 || rowIndexEnd > Rows.Count - 1)
3022 throw new ArgumentOutOfRangeException ("rowIndexEnd");
3023 if (rowIndexEnd < rowIndexStart)
3024 throw new ArgumentOutOfRangeException ("rowIndexEnd", "rowIndexEnd must be greater than rowIndexStart");
3026 for (int i = rowIndexStart; i <= rowIndexEnd; i++)
3030 public void UpdateRowHeightInfo (int rowIndex, bool updateToEnd) {
3031 throw new NotImplementedException();
3034 protected override bool CanEnableIme {
3036 if (CurrentCell != null && CurrentCell.EditType != null)
3043 protected override Size DefaultSize {
3044 get { return new Size (240, 150); }
3047 protected ScrollBar HorizontalScrollBar {
3048 get { return horizontalScrollBar; }
3051 protected ScrollBar VerticalScrollBar {
3052 get { return verticalScrollBar; }
3055 protected virtual void AccessibilityNotifyCurrentCellChanged (Point cellAddress)
3057 throw new NotImplementedException ();
3060 [MonoTODO ("Does not use fixedHeight parameter")]
3061 protected void AutoResizeColumn (int columnIndex, DataGridViewAutoSizeColumnMode autoSizeColumnMode, bool fixedHeight)
3063 AutoResizeColumn (columnIndex, autoSizeColumnMode);
3066 [MonoTODO ("Does not use fixedRowHeadersWidth or fixedColumnsWidth parameters")]
3067 protected void AutoResizeColumnHeadersHeight (bool fixedRowHeadersWidth, bool fixedColumnsWidth)
3069 AutoResizeColumnHeadersHeight ();
3072 [MonoTODO ("Does not use columnIndex or fixedRowHeadersWidth or fixedColumnsWidth parameters")]
3073 protected void AutoResizeColumnHeadersHeight (int columnIndex, bool fixedRowHeadersWidth, bool fixedColumnWidth)
3075 AutoResizeColumnHeadersHeight (columnIndex);
3078 protected void AutoResizeColumns (DataGridViewAutoSizeColumnsMode autoSizeColumnsMode, bool fixedHeight) {
3079 for (int i = 0; i < Columns.Count; i++) {
3080 AutoResizeColumn (i, (DataGridViewAutoSizeColumnMode) autoSizeColumnsMode, fixedHeight);
3084 [MonoTODO ("Does not use fixedWidth parameter")]
3085 protected void AutoResizeRow (int rowIndex, DataGridViewAutoSizeRowMode autoSizeRowMode, bool fixedWidth)
3087 if (autoSizeRowMode == DataGridViewAutoSizeRowMode.RowHeader && !rowHeadersVisible)
3088 throw new InvalidOperationException ("row headers are not visible");
3089 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3090 throw new ArgumentOutOfRangeException ("rowIndex");
3092 DataGridViewRow row = GetRowInternal (rowIndex);
3094 int new_height = row.GetPreferredHeight (rowIndex, autoSizeRowMode, true);
3096 if (row.Height != new_height)
3097 row.SetAutoSizeHeight (new_height);
3100 [MonoTODO ("Does not use fixedColumnHeadersHeight or fixedRowsHeight parameter")]
3101 protected void AutoResizeRowHeadersWidth (DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode, bool fixedColumnHeadersHeight, bool fixedRowsHeight)
3103 AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
3106 [MonoTODO ("Does not use rowIndex or fixedColumnHeadersHeight or fixedRowsHeight parameter")]
3107 protected void AutoResizeRowHeadersWidth (int rowIndex, DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode, bool fixedColumnHeadersHeight, bool fixedRowHeight)
3109 AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
3112 [MonoTODO ("Does not use fixedWidth parameter")]
3113 protected void AutoResizeRows (DataGridViewAutoSizeRowsMode autoSizeRowsMode, bool fixedWidth)
3115 if (autoSizeRowsMode == DataGridViewAutoSizeRowsMode.None)
3118 bool displayed_only = false;
3119 DataGridViewAutoSizeRowMode mode = DataGridViewAutoSizeRowMode.AllCells;
3121 switch (autoSizeRowsMode) {
3122 case DataGridViewAutoSizeRowsMode.AllHeaders:
3123 mode = DataGridViewAutoSizeRowMode.RowHeader;
3125 case DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders:
3126 mode = DataGridViewAutoSizeRowMode.AllCellsExceptHeader;
3128 case DataGridViewAutoSizeRowsMode.AllCells:
3129 mode = DataGridViewAutoSizeRowMode.AllCells;
3131 case DataGridViewAutoSizeRowsMode.DisplayedHeaders:
3132 mode = DataGridViewAutoSizeRowMode.RowHeader;
3133 displayed_only = true;
3135 case DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders:
3136 mode = DataGridViewAutoSizeRowMode.AllCellsExceptHeader;
3137 displayed_only = true;
3139 case DataGridViewAutoSizeRowsMode.DisplayedCells:
3140 mode = DataGridViewAutoSizeRowMode.AllCells;
3141 displayed_only = true;
3145 foreach (DataGridViewRow row in Rows) {
3146 if (!displayed_only || row.Displayed) {
3147 int new_height = row.GetPreferredHeight (row.Index, mode, fixedWidth);
3149 if (row.Height != new_height)
3150 row.SetAutoSizeHeight (new_height);
3155 [MonoTODO ("Does not use fixedMode parameter")]
3156 protected void AutoResizeRows (int rowIndexStart, int rowsCount, DataGridViewAutoSizeRowMode autoSizeRowMode, bool fixedWidth)
3158 for (int i = rowIndexStart; i < rowIndexStart + rowsCount; i++)
3159 AutoResizeRow (i, autoSizeRowMode, fixedWidth);
3162 protected void ClearSelection (int columnIndexException, int rowIndexException, bool selectExceptionElement) {
3163 if (columnIndexException >= columns.Count) {
3164 throw new ArgumentOutOfRangeException("ColumnIndexException is greater than the highest column index.");
3166 if (selectionMode == DataGridViewSelectionMode.FullRowSelect) {
3167 if (columnIndexException < -1) {
3168 throw new ArgumentOutOfRangeException("ColumnIndexException is less than -1.");
3172 if (columnIndexException < 0) {
3173 throw new ArgumentOutOfRangeException("ColumnIndexException is less than 0.");
3176 if (rowIndexException >= rows.Count) {
3177 throw new ArgumentOutOfRangeException("RowIndexException is greater than the highest row index.");
3179 if (selectionMode == DataGridViewSelectionMode.FullColumnSelect) {
3180 if (rowIndexException < -1) {
3181 throw new ArgumentOutOfRangeException("RowIndexException is less than -1.");
3185 if (rowIndexException < 0) {
3186 throw new ArgumentOutOfRangeException("RowIndexException is less than 0.");
3189 switch (selectionMode) {
3190 case DataGridViewSelectionMode.FullRowSelect:
3191 foreach (DataGridViewRow row in rows) {
3192 if (selectExceptionElement && row.Index == rowIndexException) {
3195 SetSelectedRowCore (row.Index, false);
3198 case DataGridViewSelectionMode.FullColumnSelect:
3199 foreach (DataGridViewColumn col in columns) {
3200 if (selectExceptionElement && col.Index == columnIndexException) {
3203 SetSelectedColumnCore (col.Index, false);
3207 foreach (DataGridViewCell cell in SelectedCells) {
3208 if (selectExceptionElement && cell.RowIndex == rowIndexException && cell.ColumnIndex == columnIndexException) {
3211 SetSelectedCellCore (cell.ColumnIndex, cell.RowIndex, false);
3217 protected override AccessibleObject CreateAccessibilityInstance ()
3219 return new DataGridViewAccessibleObject(this);
3222 [EditorBrowsable (EditorBrowsableState.Advanced)]
3223 protected virtual DataGridViewColumnCollection CreateColumnsInstance ()
3225 return new DataGridViewColumnCollection(this);
3228 protected override Control.ControlCollection CreateControlsInstance ()
3230 return new DataGridViewControlCollection (this);
3233 [EditorBrowsable (EditorBrowsableState.Advanced)]
3234 protected virtual DataGridViewRowCollection CreateRowsInstance ()
3236 return new DataGridViewRowCollection(this);
3239 protected override void Dispose (bool disposing) {
3242 protected override AccessibleObject GetAccessibilityObjectById (int objectId)
3244 throw new NotImplementedException();
3247 protected override bool IsInputChar (char charCode)
3252 protected override bool IsInputKey (Keys keyData)
3254 // Don't look at the modifiers
3255 keyData = keyData & ~Keys.Modifiers;
3277 protected virtual void OnAllowUserToAddRowsChanged (EventArgs e)
3279 EventHandler eh = (EventHandler)(Events [AllowUserToAddRowsChangedEvent]);
3284 protected virtual void OnAllowUserToDeleteRowsChanged (EventArgs e)
3286 EventHandler eh = (EventHandler)(Events [AllowUserToDeleteRowsChangedEvent]);
3291 protected virtual void OnAllowUserToOrderColumnsChanged (EventArgs e)
3293 EventHandler eh = (EventHandler)(Events [AllowUserToOrderColumnsChangedEvent]);
3298 protected virtual void OnAllowUserToResizeColumnsChanged (EventArgs e)
3300 EventHandler eh = (EventHandler)(Events [AllowUserToResizeColumnsChangedEvent]);
3305 protected virtual void OnAllowUserToResizeRowsChanged (EventArgs e)
3307 EventHandler eh = (EventHandler)(Events [AllowUserToResizeRowsChangedEvent]);
3312 protected virtual void OnAlternatingRowsDefaultCellStyleChanged (EventArgs e)
3314 EventHandler eh = (EventHandler)(Events [AlternatingRowsDefaultCellStyleChangedEvent]);
3319 protected virtual void OnAutoGenerateColumnsChanged (EventArgs e)
3321 EventHandler eh = (EventHandler)(Events [AutoGenerateColumnsChangedEvent]);
3326 protected internal virtual void OnAutoSizeColumnModeChanged (DataGridViewAutoSizeColumnModeEventArgs e)
3328 DataGridViewAutoSizeColumnModeEventHandler eh = (DataGridViewAutoSizeColumnModeEventHandler)(Events [AutoSizeColumnModeChangedEvent]);
3333 protected virtual void OnAutoSizeColumnsModeChanged (DataGridViewAutoSizeColumnsModeEventArgs e)
3335 DataGridViewAutoSizeColumnsModeEventHandler eh = (DataGridViewAutoSizeColumnsModeEventHandler)(Events [AutoSizeColumnsModeChangedEvent]);
3340 protected virtual void OnAutoSizeRowsModeChanged (DataGridViewAutoSizeModeEventArgs e)
3342 DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [AutoSizeRowsModeChangedEvent]);
3347 protected virtual void OnBackgroundColorChanged (EventArgs e)
3349 EventHandler eh = (EventHandler)(Events [BackgroundColorChangedEvent]);
3354 protected override void OnBindingContextChanged (EventArgs e)
3356 base.OnBindingContextChanged(e);
3360 protected virtual void OnBorderStyleChanged (EventArgs e)
3362 EventHandler eh = (EventHandler)(Events [BorderStyleChangedEvent]);
3367 protected virtual void OnCancelRowEdit (QuestionEventArgs e) {
3368 QuestionEventHandler eh = (QuestionEventHandler)(Events [CancelRowEditEvent]);
3373 protected virtual void OnCellBeginEdit (DataGridViewCellCancelEventArgs e)
3375 DataGridViewCellCancelEventHandler eh = (DataGridViewCellCancelEventHandler)(Events [CellBeginEditEvent]);
3380 protected virtual void OnCellBorderStyleChanged (EventArgs e)
3382 EventHandler eh = (EventHandler)(Events [CellBorderStyleChangedEvent]);
3387 protected virtual void OnCellClick (DataGridViewCellEventArgs e)
3389 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3391 cell.OnClickInternal (e);
3393 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellClickEvent]);
3398 protected virtual void OnCellContentClick (DataGridViewCellEventArgs e)
3400 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3402 cell.OnContentClickInternal (e);
3404 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContentClickEvent]);
3409 protected virtual void OnCellContentDoubleClick (DataGridViewCellEventArgs e)
3411 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3413 cell.OnContentDoubleClickInternal (e);
3415 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContentDoubleClickEvent]);
3420 protected virtual void OnCellContextMenuStripChanged (DataGridViewCellEventArgs e)
3422 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContextMenuStripChangedEvent]);
3427 protected virtual void OnCellContextMenuStripNeeded (DataGridViewCellContextMenuStripNeededEventArgs e)
3429 DataGridViewCellContextMenuStripNeededEventHandler eh = (DataGridViewCellContextMenuStripNeededEventHandler)(Events [CellContextMenuStripNeededEvent]);
3434 protected virtual void OnCellDoubleClick (DataGridViewCellEventArgs e)
3436 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3438 cell.OnDoubleClickInternal (e);
3439 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellDoubleClickEvent]);
3444 protected virtual void OnCellEndEdit (DataGridViewCellEventArgs e)
3446 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellEndEditEvent]);
3451 protected virtual void OnCellEnter (DataGridViewCellEventArgs e)
3453 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellEnterEvent]);
3458 protected internal virtual void OnCellErrorTextChanged (DataGridViewCellEventArgs e)
3460 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellErrorTextChangedEvent]);
3465 protected virtual void OnCellErrorTextNeeded (DataGridViewCellErrorTextNeededEventArgs e)
3467 DataGridViewCellErrorTextNeededEventHandler eh = (DataGridViewCellErrorTextNeededEventHandler)(Events [CellErrorTextNeededEvent]);
3472 internal void OnCellFormattingInternal (DataGridViewCellFormattingEventArgs e)
3474 OnCellFormatting (e);
3477 protected virtual void OnCellFormatting (DataGridViewCellFormattingEventArgs e)
3479 DataGridViewCellFormattingEventHandler eh = (DataGridViewCellFormattingEventHandler)(Events [CellFormattingEvent]);
3484 protected virtual void OnCellLeave (DataGridViewCellEventArgs e)
3486 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellLeaveEvent]);
3491 protected virtual void OnCellMouseClick (DataGridViewCellMouseEventArgs e)
3493 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3495 cell.OnMouseClickInternal (e);
3497 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseClickEvent]);
3502 protected virtual void OnCellMouseDoubleClick (DataGridViewCellMouseEventArgs e)
3504 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3506 cell.OnMouseDoubleClickInternal (e);
3508 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseDoubleClickEvent]);
3513 protected virtual void OnCellMouseDown (DataGridViewCellMouseEventArgs e)
3516 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3518 cell.OnMouseDownInternal (e);
3520 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseDownEvent]);
3525 protected virtual void OnCellMouseEnter (DataGridViewCellEventArgs e)
3527 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3529 cell.OnMouseEnterInternal (e.RowIndex);
3531 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellMouseEnterEvent]);
3536 protected virtual void OnCellMouseLeave (DataGridViewCellEventArgs e)
3538 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3540 cell.OnMouseLeaveInternal (e.RowIndex);
3542 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellMouseLeaveEvent]);
3547 protected virtual void OnCellMouseMove (DataGridViewCellMouseEventArgs e)
3549 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3551 cell.OnMouseMoveInternal (e);
3553 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseMoveEvent]);
3558 protected virtual void OnCellMouseUp (DataGridViewCellMouseEventArgs e)
3560 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3562 cell.OnMouseUpInternal (e);
3564 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseUpEvent]);
3569 internal void OnCellPaintingInternal (DataGridViewCellPaintingEventArgs e)
3574 protected virtual void OnCellPainting (DataGridViewCellPaintingEventArgs e)
3576 DataGridViewCellPaintingEventHandler eh = (DataGridViewCellPaintingEventHandler)(Events [CellPaintingEvent]);
3581 protected internal virtual void OnCellParsing (DataGridViewCellParsingEventArgs e)
3583 DataGridViewCellParsingEventHandler eh = (DataGridViewCellParsingEventHandler)(Events [CellParsingEvent]);
3588 internal void OnCellStateChangedInternal (DataGridViewCellStateChangedEventArgs e) {
3589 this.OnCellStateChanged (e);
3592 protected virtual void OnCellStateChanged (DataGridViewCellStateChangedEventArgs e)
3594 DataGridViewCellStateChangedEventHandler eh = (DataGridViewCellStateChangedEventHandler)(Events [CellStateChangedEvent]);
3599 protected virtual void OnCellStyleChanged (DataGridViewCellEventArgs e)
3601 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellStyleChangedEvent]);
3606 protected virtual void OnCellStyleContentChanged (DataGridViewCellStyleContentChangedEventArgs e) {
3607 DataGridViewCellStyleContentChangedEventHandler eh = (DataGridViewCellStyleContentChangedEventHandler)(Events [CellStyleContentChangedEvent]);
3612 protected virtual void OnCellToolTipTextChanged (DataGridViewCellEventArgs e) {
3613 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellToolTipTextChangedEvent]);
3618 protected virtual void OnCellToolTipTextNeeded (DataGridViewCellToolTipTextNeededEventArgs e)
3620 DataGridViewCellToolTipTextNeededEventHandler eh = (DataGridViewCellToolTipTextNeededEventHandler)(Events [CellToolTipTextNeededEvent]);
3625 protected virtual void OnCellValidated (DataGridViewCellEventArgs e)
3627 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellValidatedEvent]);
3632 protected virtual void OnCellValidating (DataGridViewCellValidatingEventArgs e)
3634 DataGridViewCellValidatingEventHandler eh = (DataGridViewCellValidatingEventHandler)(Events [CellValidatingEvent]);
3639 protected virtual void OnCellValueChanged (DataGridViewCellEventArgs e)
3641 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellValueChangedEvent]);
3646 protected internal virtual void OnCellValueNeeded (DataGridViewCellValueEventArgs e)
3648 DataGridViewCellValueEventHandler eh = (DataGridViewCellValueEventHandler)(Events [CellValueNeededEvent]);
3653 protected virtual void OnCellValuePushed (DataGridViewCellValueEventArgs e)
3655 DataGridViewCellValueEventHandler eh = (DataGridViewCellValueEventHandler)(Events [CellValuePushedEvent]);
3660 internal void OnColumnAddedInternal (DataGridViewColumnEventArgs e)
3662 if (e.Column.CellTemplate != null) {
3663 // The first column has just been added programatically instead of
3664 // autogenerated so we need to create the rows for the first time.
3666 if (!is_autogenerating_columns && columns.Count == 1)
3668 foreach (DataGridViewRow row in Rows)
3669 row.Cells.Add ((DataGridViewCell)e.Column.CellTemplate.Clone ());
3672 AutoResizeColumnsInternal ();
3674 PrepareEditingRow (false, true);
3677 protected virtual void OnColumnAdded (DataGridViewColumnEventArgs e)
3679 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnAddedEvent]);
3684 protected internal virtual void OnColumnContextMenuStripChanged (DataGridViewColumnEventArgs e)
3686 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnContextMenuStripChangedEvent]);
3691 protected internal virtual void OnColumnDataPropertyNameChanged (DataGridViewColumnEventArgs e)
3693 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDataPropertyNameChangedEvent]);
3698 protected internal virtual void OnColumnDefaultCellStyleChanged (DataGridViewColumnEventArgs e)
3700 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDefaultCellStyleChangedEvent]);
3705 protected internal virtual void OnColumnDisplayIndexChanged (DataGridViewColumnEventArgs e)
3707 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDisplayIndexChangedEvent]);
3712 protected virtual void OnColumnDividerDoubleClick (DataGridViewColumnDividerDoubleClickEventArgs e)
3714 DataGridViewColumnDividerDoubleClickEventHandler eh = (DataGridViewColumnDividerDoubleClickEventHandler)(Events [ColumnDividerDoubleClickEvent]);
3719 protected internal virtual void OnColumnDividerWidthChanged (DataGridViewColumnEventArgs e)
3721 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDividerWidthChangedEvent]);
3726 protected internal virtual void OnColumnHeaderCellChanged (DataGridViewColumnEventArgs e)
3728 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnHeaderCellChangedEvent]);
3733 protected virtual void OnColumnHeaderMouseClick (DataGridViewCellMouseEventArgs e)
3735 DataGridViewColumn col = Columns[e.ColumnIndex];
3737 if (col.SortMode == DataGridViewColumnSortMode.Automatic) {
3738 ListSortDirection new_order;
3740 // Always use ascending unless we are clicking on a
3741 // column that is already sorted ascending.
3742 if (SortedColumn != col || sortOrder != SortOrder.Ascending)
3743 new_order = ListSortDirection.Ascending;
3745 new_order = ListSortDirection.Descending;
3747 Sort (col, new_order);
3750 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [ColumnHeaderMouseClickEvent]);
3755 protected virtual void OnColumnHeaderMouseDoubleClick (DataGridViewCellMouseEventArgs e)
3757 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [ColumnHeaderMouseDoubleClickEvent]);
3762 protected virtual void OnColumnHeadersBorderStyleChanged (EventArgs e)
3764 EventHandler eh = (EventHandler)(Events [ColumnHeadersBorderStyleChangedEvent]);
3769 protected virtual void OnColumnHeadersDefaultCellStyleChanged (EventArgs e)
3771 EventHandler eh = (EventHandler)(Events [ColumnHeadersDefaultCellStyleChangedEvent]);
3776 protected virtual void OnColumnHeadersHeightChanged (EventArgs e)
3778 EventHandler eh = (EventHandler)(Events [ColumnHeadersHeightChangedEvent]);
3783 protected virtual void OnColumnHeadersHeightSizeModeChanged (DataGridViewAutoSizeModeEventArgs e)
3785 DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [ColumnHeadersHeightSizeModeChangedEvent]);
3790 protected internal virtual void OnColumnMinimumWidthChanged (DataGridViewColumnEventArgs e)
3792 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnMinimumWidthChangedEvent]);
3797 protected internal virtual void OnColumnNameChanged (DataGridViewColumnEventArgs e)
3799 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnNameChangedEvent]);
3804 internal void OnColumnRemovedInternal (DataGridViewColumnEventArgs e)
3806 if (e.Column.CellTemplate != null) {
3807 int index = e.Column.Index;
3809 foreach (DataGridViewRow row in Rows)
3810 row.Cells.RemoveAt (index);
3813 AutoResizeColumnsInternal ();
3814 OnColumnRemoved (e);
3815 PrepareEditingRow (false, true);
3818 protected virtual void OnColumnRemoved (DataGridViewColumnEventArgs e)
3820 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnRemovedEvent]);
3825 protected internal virtual void OnColumnSortModeChanged (DataGridViewColumnEventArgs e)
3827 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnSortModeChangedEvent]);
3832 protected internal virtual void OnColumnStateChanged (DataGridViewColumnStateChangedEventArgs e)
3834 DataGridViewColumnStateChangedEventHandler eh = (DataGridViewColumnStateChangedEventHandler)(Events [ColumnStateChangedEvent]);
3839 protected internal virtual void OnColumnToolTipTextChanged (DataGridViewColumnEventArgs e)
3841 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnToolTipTextChangedEvent]);
3846 protected internal virtual void OnColumnWidthChanged (DataGridViewColumnEventArgs e)
3848 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnWidthChangedEvent]);
3853 protected virtual void OnCurrentCellChanged (EventArgs e)
3855 EventHandler eh = (EventHandler)(Events [CurrentCellChangedEvent]);
3860 protected virtual void OnCurrentCellDirtyStateChanged (EventArgs e)
3862 EventHandler eh = (EventHandler)(Events [CurrentCellDirtyStateChangedEvent]);
3867 protected override void OnCursorChanged (EventArgs e)
3869 base.OnCursorChanged (e);
3872 protected virtual void OnDataBindingComplete (DataGridViewBindingCompleteEventArgs e)
3874 DataGridViewBindingCompleteEventHandler eh = (DataGridViewBindingCompleteEventHandler)(Events [DataBindingCompleteEvent]);
3879 protected virtual void OnDataError (bool displayErrorDialogIfNoHandler, DataGridViewDataErrorEventArgs e)
3881 DataGridViewDataErrorEventHandler eh = (DataGridViewDataErrorEventHandler)(Events [DataErrorEvent]);
3885 else if (displayErrorDialogIfNoHandler)
3886 MessageBox.Show (e.ToString ());
3888 protected virtual void OnDataMemberChanged (EventArgs e) {
3889 EventHandler eh = (EventHandler)(Events [DataMemberChangedEvent]);
3894 protected virtual void OnDataSourceChanged (EventArgs e) {
3895 EventHandler eh = (EventHandler)(Events [DataSourceChangedEvent]);
3900 protected virtual void OnDefaultCellStyleChanged (EventArgs e) {
3901 EventHandler eh = (EventHandler)(Events [DefaultCellStyleChangedEvent]);
3906 protected virtual void OnDefaultValuesNeeded (DataGridViewRowEventArgs e) {
3907 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [DefaultValuesNeededEvent]);
3912 protected override void OnDoubleClick (EventArgs e) {
3913 base.OnDoubleClick(e);
3916 protected virtual void OnEditingControlShowing (DataGridViewEditingControlShowingEventArgs e) {
3917 DataGridViewEditingControlShowingEventHandler eh = (DataGridViewEditingControlShowingEventHandler)(Events [EditingControlShowingEvent]);
3922 protected virtual void OnEditModeChanged (EventArgs e)
3924 EventHandler eh = (EventHandler)(Events [EditModeChangedEvent]);
3929 protected override void OnEnabledChanged (EventArgs e)
3931 base.OnEnabledChanged(e);
3934 protected override void OnEnter (EventArgs e )
3939 protected override void OnGotFocus(EventArgs e)
3941 base.OnGotFocus (e);
3943 // To add focus rectangle if needed
3944 if (currentCell != null && ShowFocusCues)
3945 InvalidateCell (currentCell);
3948 protected override void OnFontChanged (EventArgs e)
3950 base.OnFontChanged(e);
3953 protected override void OnForeColorChanged (EventArgs e)
3955 base.OnForeColorChanged(e);
3958 protected virtual void OnGridColorChanged (EventArgs e)
3960 EventHandler eh = (EventHandler)(Events [GridColorChangedEvent]);
3965 protected override void OnHandleCreated (EventArgs e)
3967 base.OnHandleCreated(e);
3969 if (CurrentCell == null && Rows.Count > 0 && Columns.Count > 0)
3970 MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, false, false, false);
3973 protected override void OnHandleDestroyed(EventArgs e)
3975 base.OnHandleDestroyed (e);
3978 [EditorBrowsable (EditorBrowsableState.Advanced)]
3979 protected override void OnKeyDown (KeyEventArgs e)
3983 e.Handled = ProcessDataGridViewKey (e);
3986 [EditorBrowsable (EditorBrowsableState.Advanced)]
3987 protected override void OnKeyPress (KeyPressEventArgs e)
3992 [EditorBrowsable (EditorBrowsableState.Advanced)]
3993 protected override void OnKeyUp (KeyEventArgs e)
3998 protected override void OnLayout (LayoutEventArgs e)
4000 if (horizontalScrollBar.Visible && verticalScrollBar.Visible) {
4001 horizontalScrollBar.Bounds = new Rectangle (BorderWidth, Height - BorderWidth - horizontalScrollBar.Height, Width - (2 * BorderWidth) - verticalScrollBar.Width, horizontalScrollBar.Height);
4002 verticalScrollBar.Bounds = new Rectangle (Width - BorderWidth - verticalScrollBar.Width, BorderWidth, verticalScrollBar.Width, Height - (2 * BorderWidth) - horizontalScrollBar.Height);
4003 } else if (horizontalScrollBar.Visible)
4004 horizontalScrollBar.Bounds = new Rectangle (BorderWidth, Height - BorderWidth - horizontalScrollBar.Height, Width - (2 * BorderWidth), horizontalScrollBar.Height);
4005 else if (verticalScrollBar.Visible)
4006 verticalScrollBar.Bounds = new Rectangle (Width - BorderWidth - verticalScrollBar.Width, BorderWidth, verticalScrollBar.Width, Height - (2 * BorderWidth));
4008 AutoResizeColumnsInternal ();
4012 protected override void OnLeave (EventArgs e)
4017 protected override void OnLostFocus(EventArgs e)
4019 base.OnLostFocus (e);
4021 // To remove focus rectangle if needed
4022 if (currentCell != null && ShowFocusCues)
4023 InvalidateCell (currentCell);
4026 protected override void OnMouseClick (MouseEventArgs e)
4028 base.OnMouseClick(e);
4030 if (column_resize_active || row_resize_active)
4033 //Console.WriteLine("Mouse: Clicks: {0}; Delta: {1}; X: {2}; Y: {3};", e.Clicks, e.Delta, e.X, e.Y);
4034 HitTestInfo hit = HitTest (e.X, e.Y);
4037 case DataGridViewHitTestType.Cell:
4038 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4039 Point cellpoint = new Point (e.X - display.X, e.Y - display.Y);
4041 OnCellMouseClick (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, cellpoint.X, cellpoint.Y, e));
4043 DataGridViewCell cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex);
4045 if (cell.GetContentBounds (hit.RowIndex).Contains (cellpoint)) {
4046 DataGridViewCellEventArgs dgvcea = new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex);
4047 OnCellContentClick (dgvcea);
4051 case DataGridViewHitTestType.ColumnHeader:
4052 Rectangle display2 = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4053 Point cellpoint2 = new Point (e.X - display2.X, e.Y - display2.Y);
4055 OnColumnHeaderMouseClick (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, cellpoint2.X, cellpoint2.Y, e));
4060 protected override void OnMouseDoubleClick (MouseEventArgs e)
4062 base.OnMouseDoubleClick(e);
4065 private void DoSelectionOnMouseDown (HitTestInfo hitTest)
4067 Keys modifiers = Control.ModifierKeys;
4068 bool isControl = (modifiers & Keys.Control) != 0;
4069 bool isShift = (modifiers & Keys.Shift) != 0;
4070 //bool isRowHeader = hitTest.Type == DataGridViewHitTestType.RowHeader;
4071 //bool isColHeader = hitTest.Type == DataGridViewHitTestType.ColumnHeader;
4072 DataGridViewSelectionMode mode;
4074 switch (hitTest.Type) {
4075 case DataGridViewHitTestType.Cell:
4076 mode = selectionMode;
4078 case DataGridViewHitTestType.ColumnHeader:
4079 mode = selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect ? DataGridViewSelectionMode.FullColumnSelect : selectionMode;
4081 if (mode != DataGridViewSelectionMode.FullColumnSelect)
4084 case DataGridViewHitTestType.RowHeader:
4085 mode = selectionMode == DataGridViewSelectionMode.RowHeaderSelect ? DataGridViewSelectionMode.FullRowSelect : selectionMode;
4087 if (mode != DataGridViewSelectionMode.FullRowSelect)
4089 break; // Handled below
4095 // If SHIFT is pressed:
4096 // Select all from selected_row/column/cell to current row/column/cell, unselect everything else
4098 // Unselect all rows/columns/cells, select the clicked one
4099 int min_row, max_row;
4100 int min_col, max_col;
4102 selected_row = hitTest.RowIndex;
4103 selected_column = hitTest.ColumnIndex;
4106 if (selected_row != -1)
4107 selected_row = hitTest.RowIndex;
4108 if (selected_column != -1)
4109 selected_column = hitTest.ColumnIndex;
4111 if (selected_row >= hitTest.RowIndex) {
4112 min_row = hitTest.RowIndex;
4113 max_row = isShift ? selected_row : min_row;
4115 max_row = hitTest.RowIndex;
4116 min_row = isShift ? selected_row : max_row;
4118 if (selected_column >= hitTest.ColumnIndex) {
4119 min_col = hitTest.ColumnIndex;
4120 max_col = isShift ? selected_column : min_col;
4122 max_col = hitTest.ColumnIndex;
4123 min_col = isShift ? selected_column : max_col;
4127 case DataGridViewSelectionMode.FullRowSelect:
4128 for (int i = 0; i < RowCount; i++) {
4129 bool select = i >= min_row && i <= max_row;
4131 for (int c = 0; c < ColumnCount; c++) {
4132 if (Rows [i].Cells [c].Selected) {
4133 SetSelectedCellCore (c, i, false);
4137 if (select != Rows [i].Selected) {
4138 SetSelectedRowCore (i, select);
4142 case DataGridViewSelectionMode.FullColumnSelect:
4143 for (int i = 0; i < ColumnCount; i++) {
4144 bool select = i >= min_col && i <= max_col;
4146 for (int r = 0; r < RowCount; r++) {
4147 if (Rows [r].Cells [i].Selected) {
4148 SetSelectedCellCore (i, r, false);
4152 if (select != Columns [i].Selected) {
4153 SetSelectedColumnCore (i, select);
4157 case DataGridViewSelectionMode.ColumnHeaderSelect:
4158 case DataGridViewSelectionMode.RowHeaderSelect:
4160 case DataGridViewSelectionMode.CellSelect:
4162 for (int c = 0; c < ColumnCount; c++) {
4163 if (columns [c].Selected)
4164 SetSelectedColumnCore (c, false);
4167 for (int r = 0; r < RowCount; r++) {
4168 if (rows [r].Selected)
4169 SetSelectedRowCore (r, false);
4172 for (int r = 0; r < RowCount; r++) {
4173 for (int c = 0; c < ColumnCount; c++) {
4174 bool select = (r >= min_row && r <= max_row) && (c >= min_col && c <= max_col);
4175 if (select != Rows [r].Cells [c].Selected)
4176 SetSelectedCellCore (c, r, select);
4182 } else if (isControl) {
4183 // Switch the selected state of the row.
4185 case DataGridViewSelectionMode.FullRowSelect:
4186 SetSelectedRowCore (hitTest.RowIndex, !rows [hitTest.RowIndex].Selected);
4188 case DataGridViewSelectionMode.FullColumnSelect:
4189 SetSelectedColumnCore (hitTest.ColumnIndex, !columns [hitTest.ColumnIndex].Selected);
4191 case DataGridViewSelectionMode.ColumnHeaderSelect:
4192 case DataGridViewSelectionMode.RowHeaderSelect:
4194 case DataGridViewSelectionMode.CellSelect:
4195 if (hitTest.ColumnIndex >= 0 && hitTest.RowIndex >= 0) {
4196 SetSelectedCellCore (hitTest.ColumnIndex, hitTest.RowIndex, !Rows [hitTest.RowIndex].Cells [hitTest.ColumnIndex].Selected);
4204 protected override void OnMouseDown (MouseEventArgs e)
4206 base.OnMouseDown(e);
4211 HitTestInfo hitTest = HitTest(e.X, e.Y);
4213 DataGridViewCell cell = null;
4214 DataGridViewRow row = null;
4215 Rectangle cellBounds;
4217 if (hitTest.Type == DataGridViewHitTestType.ColumnHeader && MouseOverColumnResize (hitTest.ColumnIndex, e.X)) {
4218 if (e.Clicks == 2) {
4219 AutoResizeColumn (hitTest.ColumnIndex);
4223 resize_band = hitTest.ColumnIndex;
4224 column_resize_active = true;
4225 resize_band_start = e.X;
4226 resize_band_delta = 0;
4227 DrawVerticalResizeLine (resize_band_start);
4231 if (hitTest.Type == DataGridViewHitTestType.RowHeader && MouseOverRowResize (hitTest.RowIndex, e.Y)) {
4232 if (e.Clicks == 2) {
4233 AutoResizeRow (hitTest.RowIndex);
4237 resize_band = hitTest.RowIndex;
4238 row_resize_active = true;
4239 resize_band_start = e.Y;
4240 resize_band_delta = 0;
4241 DrawHorizontalResizeLine (resize_band_start);
4245 if (hitTest.Type == DataGridViewHitTestType.Cell) {
4246 row = rows [hitTest.RowIndex];
4247 cell = row.Cells [hitTest.ColumnIndex];
4248 SetCurrentCellAddressCore (cell.ColumnIndex, cell.RowIndex, false, true, true);
4249 cellBounds = GetCellDisplayRectangle (hitTest.ColumnIndex, hitTest.RowIndex, false);
4250 OnCellMouseDown (new DataGridViewCellMouseEventArgs (hitTest.ColumnIndex, hitTest.RowIndex, e.X - cellBounds.X, e.Y - cellBounds.Y, e));
4251 OnCellClick (new DataGridViewCellEventArgs (hitTest.ColumnIndex, hitTest.RowIndex));
4254 DoSelectionOnMouseDown (hitTest);
4256 if (hitTest.Type != DataGridViewHitTestType.Cell) {
4257 if (hitTest.Type == DataGridViewHitTestType.ColumnHeader)
4258 pressed_header_cell = columns [hitTest.ColumnIndex].HeaderCell;
4259 else if (hitTest.Type == DataGridViewHitTestType.RowHeader)
4260 pressed_header_cell = rows [hitTest.RowIndex].HeaderCell;
4269 private void UpdateBindingPosition (int position)
4271 if (DataManager != null)
4272 DataManager.Position = position;
4275 protected override void OnMouseEnter (EventArgs e)
4277 base.OnMouseEnter(e);
4280 protected override void OnMouseLeave (EventArgs e)
4282 base.OnMouseLeave (e);
4284 if (hover_cell != null) {
4285 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4289 EnteredHeaderCell = null;
4292 protected override void OnMouseMove (MouseEventArgs e)
4294 base.OnMouseMove (e);
4296 if (column_resize_active) {
4297 // Erase the old line
4298 DrawVerticalResizeLine (resize_band_start + resize_band_delta);
4300 resize_band_delta = e.X - resize_band_start;
4302 // Draw the new line
4303 DrawVerticalResizeLine (resize_band_start + resize_band_delta);
4307 if (row_resize_active) {
4308 // Erase the old line
4309 DrawHorizontalResizeLine (resize_band_start + resize_band_delta);
4311 resize_band_delta = e.Y - resize_band_start;
4313 // Draw the new line
4314 DrawHorizontalResizeLine (resize_band_start + resize_band_delta);
4318 Cursor new_cursor = Cursors.Default;
4319 HitTestInfo hit = this.HitTest (e.X, e.Y);
4321 if (hit.Type == DataGridViewHitTestType.Cell) {
4322 EnteredHeaderCell = null;
4324 DataGridViewCell new_cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex);
4326 // Check if we have moved into an error icon area
4327 Rectangle icon = new_cell.ErrorIconBounds;
4329 if (!icon.IsEmpty) {
4330 Point loc = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false).Location;
4335 if (icon.Contains (e.X, e.Y)) {
4336 if (tooltip_currently_showing != new_cell)
4337 MouseEnteredErrorIcon (new_cell);
4339 MouseLeftErrorIcon (new_cell);
4342 // We have never been in a cell before
4343 if (hover_cell == null) {
4344 hover_cell = new_cell;
4345 OnCellMouseEnter (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex));
4347 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4348 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4353 // Were we already in this cell?
4354 if (hover_cell.RowIndex == hit.RowIndex && hover_cell.ColumnIndex == hit.ColumnIndex) {
4355 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4356 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4361 // We are changing cells
4362 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4364 hover_cell = new_cell;
4366 OnCellMouseEnter (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex));
4368 Rectangle display2 = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4369 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display2.X, e.Y - display2.Y, e));
4372 } else if (hit.Type == DataGridViewHitTestType.RowHeader) {
4373 DataGridViewRowHeaderCell new_cell = Rows[hit.RowIndex].HeaderCell;
4375 EnteredHeaderCell = new_cell;
4377 if (MouseOverRowResize (hit.RowIndex, e.Y))
4378 new_cursor = Cursors.HSplit;
4380 // Check if we have moved into an error icon area
4381 Rectangle icon = new_cell.InternalErrorIconsBounds;
4383 if (!icon.IsEmpty) {
4384 Point loc = GetCellDisplayRectangle (0, hit.RowIndex, false).Location;
4386 icon.X += BorderWidth;
4389 if (icon.Contains (e.X, e.Y)) {
4390 if (tooltip_currently_showing != new_cell)
4391 MouseEnteredErrorIcon (new_cell);
4393 MouseLeftErrorIcon (new_cell);
4395 } else if (hit.Type == DataGridViewHitTestType.TopLeftHeader) {
4396 EnteredHeaderCell = null;
4398 DataGridViewTopLeftHeaderCell new_cell = (DataGridViewTopLeftHeaderCell)TopLeftHeaderCell;
4400 // Check if we have moved into an error icon area
4401 Rectangle icon = new_cell.InternalErrorIconsBounds;
4403 if (!icon.IsEmpty) {
4404 Point loc = Point.Empty;
4406 icon.X += BorderWidth;
4409 if (icon.Contains (e.X, e.Y)) {
4410 if (tooltip_currently_showing != new_cell)
4411 MouseEnteredErrorIcon (new_cell);
4413 MouseLeftErrorIcon (new_cell);
4417 if (hit.Type == DataGridViewHitTestType.ColumnHeader) {
4418 EnteredHeaderCell = Columns [hit.ColumnIndex].HeaderCell;
4420 if (MouseOverColumnResize (hit.ColumnIndex, e.X))
4421 new_cursor = Cursors.VSplit;
4423 EnteredHeaderCell = null;
4425 // We have left the cell area
4426 if (hover_cell != null) {
4427 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4432 Cursor = new_cursor;
4435 protected override void OnMouseUp (MouseEventArgs e)
4439 if (column_resize_active) {
4440 column_resize_active = false;
4442 if (resize_band_delta + Columns[resize_band].Width < 0)
4443 resize_band_delta = -Columns[resize_band].Width;
4445 Columns[resize_band].Width = Math.Max (resize_band_delta + Columns[resize_band].Width, Columns[resize_band].MinimumWidth);
4450 if (row_resize_active) {
4451 row_resize_active = false;
4453 if (resize_band_delta + Rows[resize_band].Height < 0)
4454 resize_band_delta = -Rows[resize_band].Height;
4456 Rows[resize_band].Height = Math.Max (resize_band_delta + Rows[resize_band].Height, Rows[resize_band].MinimumHeight);
4461 HitTestInfo hit = this.HitTest (e.X, e.Y);
4463 if (hit.Type == DataGridViewHitTestType.Cell) {
4464 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4465 OnCellMouseUp (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4468 if (pressed_header_cell != null) {
4469 DataGridViewHeaderCell cell = pressed_header_cell;
4470 pressed_header_cell = null;
4471 if (ThemeEngine.Current.DataGridViewHeaderCellHasPressedStyle (this))
4472 Invalidate (GetHeaderCellBounds (cell));
4476 protected override void OnMouseWheel (MouseEventArgs e)
4478 base.OnMouseWheel(e);
4481 protected virtual void OnMultiSelectChanged (EventArgs e)
4483 EventHandler eh = (EventHandler)(Events [MultiSelectChangedEvent]);
4484 if (eh != null) eh (this, e);
4487 protected virtual void OnNewRowNeeded (DataGridViewRowEventArgs e) {
4488 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [NewRowNeededEvent]);
4489 if (eh != null) eh (this, e);
4492 int first_row_index = 0;
4493 internal int first_col_index = 0;
4495 protected override void OnPaint (PaintEventArgs e)
4499 Graphics g = e.Graphics;
4500 Rectangle bounds = ClientRectangle;
4502 // Paint the background
4503 PaintBackground (g, e.ClipRectangle, bounds);
4505 List<DataGridViewColumn> sortedColumns = columns.ColumnDisplayIndexSortedArrayList;
4507 // Take borders into account
4508 bounds.Inflate (-BorderWidth, -BorderWidth);
4510 // Paint the top left cell
4511 if (rowHeadersVisible && columnHeadersVisible && ColumnCount > 0) {
4512 Rectangle topleftbounds = new Rectangle (bounds.X, bounds.Y, rowHeadersWidth, columnHeadersHeight);
4514 TopLeftHeaderCell.PaintWork (g, e.ClipRectangle, topleftbounds, -1, TopLeftHeaderCell.State, ColumnHeadersDefaultCellStyle, AdvancedColumnHeadersBorderStyle, DataGridViewPaintParts.All);
4517 // Paint the column headers
4518 if (columnHeadersVisible) {
4519 Rectangle headerBounds = bounds;
4520 headerBounds.Height = columnHeadersHeight;
4522 if (rowHeadersVisible)
4523 headerBounds.X += rowHeadersWidth;
4525 for (int index = first_col_index; index < sortedColumns.Count; index++) {
4526 DataGridViewColumn col = sortedColumns[index];
4531 headerBounds.Width = col.Width;
4532 DataGridViewCell cell = col.HeaderCell;
4534 DataGridViewAdvancedBorderStyle intermediateBorderStyle = (DataGridViewAdvancedBorderStyle)((ICloneable)this.AdvancedColumnHeadersBorderStyle).Clone ();
4535 DataGridViewAdvancedBorderStyle borderStyle = AdjustColumnHeaderBorderStyle (this.AdvancedColumnHeadersBorderStyle, intermediateBorderStyle, cell.ColumnIndex == 0, cell.ColumnIndex == columns.Count - 1);
4537 cell.PaintWork (g, e.ClipRectangle, headerBounds, -1, cell.State, cell.InheritedStyle, borderStyle, DataGridViewPaintParts.All);
4539 headerBounds.X += col.Width;
4542 bounds.Y += columnHeadersHeight;
4545 gridWidth = rowHeadersVisible ? rowHeadersWidth : 0;
4548 int first_row_height = Rows.Count > 0 ? Rows[Math.Min (Rows.Count - 1, first_row_index)].Height : 0;
4549 // int room_left = this.Height;
4551 // Reset all columns to !Displayed
4552 for (int i = 0; i < Columns.Count; i++)
4553 Columns[i].DisplayedInternal = false;
4555 // Set Displayed columns
4556 for (int i = first_col_index; i < Columns.Count; i++) {
4557 DataGridViewColumn col = Columns.ColumnDisplayIndexSortedArrayList[i];
4562 col.DisplayedInternal = true;
4563 gridWidth += col.Width;
4565 if (gridWidth >= Width)
4569 // Reset all rows to !Displayed
4570 for (int i = 0; i < Rows.Count; i++)
4571 GetRowInternal (i).DisplayedInternal = false;
4574 for (int index = first_row_index; index < Rows.Count; index++) {
4575 DataGridViewRow row = Rows[index];
4576 GetRowInternal (index).DisplayedInternal = true;
4578 bounds.Height = row.Height;
4579 bool is_first = row.Index == 0;
4580 bool is_last = row.Index == rows.Count - 1;
4582 row.Paint (g, e.ClipRectangle, bounds, row.Index, row.GetState (row.Index), is_first, is_last);
4584 bounds.Y += bounds.Height;
4585 bounds.X = BorderWidth;
4587 if (bounds.Y >= ClientSize.Height - (horizontalScrollBar.Visible ? horizontalScrollBar.Height : 0))
4590 gridHeight += row.Height;
4595 foreach (DataGridViewColumn col in sortedColumns)
4597 gridWidth += col.Width;
4601 foreach (DataGridViewRow row in Rows)
4602 gridHeight += row.Height;
4604 if (rowHeadersVisible)
4605 gridWidth += rowHeadersWidth;
4607 if (columnHeadersVisible)
4608 gridHeight += columnHeadersHeight;
4610 bool horizontalVisible = false;
4611 bool verticalVisible = false;
4614 if (gridWidth > Size.Width || gridHeight > Size.Height) {
4615 Size = new Size(gridWidth, gridHeight);
4619 if (gridWidth > Size.Width) {
4620 horizontalVisible = true;
4622 if (gridHeight > Size.Height) {
4623 verticalVisible = true;
4625 if (horizontalScrollBar.Visible && (gridHeight + horizontalScrollBar.Height) > Size.Height) {
4626 verticalVisible = true;
4628 if (verticalScrollBar.Visible && (gridWidth + verticalScrollBar.Width) > Size.Width) {
4629 horizontalVisible = true;
4631 if (horizontalVisible) {
4632 horizontalScrollBar.Minimum = 0;
4633 horizontalScrollBar.Maximum = gridWidth;
4634 horizontalScrollBar.SmallChange = Columns[first_col_index].Width;
4635 int largeChange = ClientSize.Width - rowHeadersWidth;
4636 if (largeChange <= 0)
4637 largeChange = ClientSize.Width;
4638 horizontalScrollBar.LargeChange = largeChange;
4640 if (verticalVisible) {
4641 verticalScrollBar.Minimum = 0;
4642 verticalScrollBar.Maximum = gridHeight;
4643 verticalScrollBar.SmallChange = first_row_height + 1;
4644 int largeChange = ClientSize.Height - columnHeadersHeight;
4645 if (largeChange <= 0)
4646 largeChange = ClientSize.Height;
4647 verticalScrollBar.LargeChange = largeChange;
4651 horizontalScrollBar.Visible = horizontalVisible;
4652 verticalScrollBar.Visible = verticalVisible;
4654 // Paint the bottom right square if both scrollbars are displayed
4655 if (horizontalScrollBar.Visible && verticalScrollBar.Visible)
4656 g.FillRectangle (SystemBrushes.Control, new Rectangle (horizontalScrollBar.Right, verticalScrollBar.Bottom, verticalScrollBar.Width, horizontalScrollBar.Height));
4659 bounds = ClientRectangle;
4661 switch (BorderStyle) {
4662 case BorderStyle.FixedSingle:
4663 g.DrawRectangle (Pens.Black, new Rectangle (bounds.Left, bounds.Top, bounds.Width - 1, bounds.Height - 1));
4665 case BorderStyle.Fixed3D:
4666 ControlPaint.DrawBorder3D (g, bounds, Border3DStyle.Sunken);
4671 protected virtual void OnReadOnlyChanged (EventArgs e) {
4672 EventHandler eh = (EventHandler)(Events [ReadOnlyChangedEvent]);
4677 protected override void OnResize (EventArgs e) {
4679 AutoResizeColumnsInternal ();
4681 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
4682 OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
4685 protected override void OnRightToLeftChanged (EventArgs e) {
4686 base.OnRightToLeftChanged(e);
4689 // In MSDN2 documentation there's no internal here
4690 protected internal virtual void OnRowContextMenuStripChanged (DataGridViewRowEventArgs e)
4692 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowContextMenuStripChangedEvent]);
4693 if (eh != null) eh (this, e);
4696 protected virtual void OnRowContextMenuStripNeeded (DataGridViewRowContextMenuStripNeededEventArgs e)
4698 DataGridViewRowContextMenuStripNeededEventHandler eh = (DataGridViewRowContextMenuStripNeededEventHandler)(Events [RowContextMenuStripNeededEvent]);
4699 if (eh != null) eh (this, e);
4702 protected internal virtual void OnRowDefaultCellStyleChanged (DataGridViewRowEventArgs e)
4704 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowDefaultCellStyleChangedEvent]);
4705 if (eh != null) eh (this, e);
4708 protected virtual void OnRowDirtyStateNeeded (QuestionEventArgs e)
4710 QuestionEventHandler eh = (QuestionEventHandler)(Events [RowDirtyStateNeededEvent]);
4711 if (eh != null) eh (this, e);
4714 protected virtual void OnRowDividerDoubleClick (DataGridViewRowDividerDoubleClickEventArgs e)
4716 DataGridViewRowDividerDoubleClickEventHandler eh = (DataGridViewRowDividerDoubleClickEventHandler)(Events [RowDividerDoubleClickEvent]);
4717 if (eh != null) eh (this, e);
4720 protected virtual void OnRowDividerHeightChanged (DataGridViewRowEventArgs e)
4722 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowDividerHeightChangedEvent]);
4723 if (eh != null) eh (this, e);
4726 protected virtual void OnRowEnter (DataGridViewCellEventArgs e)
4728 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowEnterEvent]);
4729 if (eh != null) eh (this, e);
4732 protected internal virtual void OnRowErrorTextChanged (DataGridViewRowEventArgs e)
4734 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowErrorTextChangedEvent]);
4735 if (eh != null) eh (this, e);
4738 protected virtual void OnRowErrorTextNeeded (DataGridViewRowErrorTextNeededEventArgs e)
4740 DataGridViewRowErrorTextNeededEventHandler eh = (DataGridViewRowErrorTextNeededEventHandler)(Events [RowErrorTextNeededEvent]);
4741 if (eh != null) eh (this, e);
4744 protected internal virtual void OnRowHeaderCellChanged (DataGridViewRowEventArgs e)
4746 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowHeaderCellChangedEvent]);
4747 if (eh != null) eh (this, e);
4750 protected virtual void OnRowHeaderMouseClick (DataGridViewCellMouseEventArgs e)
4752 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [RowHeaderMouseClickEvent]);
4753 if (eh != null) eh (this, e);
4756 protected virtual void OnRowHeaderMouseDoubleClick (DataGridViewCellMouseEventArgs e)
4758 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [RowHeaderMouseDoubleClickEvent]);
4759 if (eh != null) eh (this, e);
4762 protected virtual void OnRowHeadersBorderStyleChanged (EventArgs e)
4764 EventHandler eh = (EventHandler)(Events [RowHeadersBorderStyleChangedEvent]);
4765 if (eh != null) eh (this, e);
4768 protected virtual void OnRowHeadersDefaultCellStyleChanged (EventArgs e)
4770 EventHandler eh = (EventHandler)(Events [RowHeadersDefaultCellStyleChangedEvent]);
4771 if (eh != null) eh (this, e);
4774 protected virtual void OnRowHeadersWidthChanged (EventArgs e)
4776 EventHandler eh = (EventHandler)(Events [RowHeadersWidthChangedEvent]);
4777 if (eh != null) eh (this, e);
4780 protected virtual void OnRowHeadersWidthSizeModeChanged (DataGridViewAutoSizeModeEventArgs e)
4782 DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [RowHeadersWidthSizeModeChangedEvent]);
4783 if (eh != null) eh (this, e);
4786 protected internal virtual void OnRowHeightChanged (DataGridViewRowEventArgs e)
4788 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowHeightChangedEvent]);
4789 if (eh != null) eh (this, e);
4792 protected virtual void OnRowHeightInfoNeeded (DataGridViewRowHeightInfoNeededEventArgs e)
4794 DataGridViewRowHeightInfoNeededEventHandler eh = (DataGridViewRowHeightInfoNeededEventHandler)(Events [RowHeightInfoNeededEvent]);
4795 if (eh != null) eh (this, e);
4798 protected virtual void OnRowHeightInfoPushed (DataGridViewRowHeightInfoPushedEventArgs e)
4800 DataGridViewRowHeightInfoPushedEventHandler eh = (DataGridViewRowHeightInfoPushedEventHandler)(Events [RowHeightInfoPushedEvent]);
4801 if (eh != null) eh (this, e);
4804 protected virtual void OnRowLeave (DataGridViewCellEventArgs e)
4806 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowLeaveEvent]);
4807 if (eh != null) eh (this, e);
4810 protected internal virtual void OnRowMinimumHeightChanged (DataGridViewRowEventArgs e)
4812 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowMinimumHeightChangedEvent]);
4813 if (eh != null) eh (this, e);
4816 protected internal virtual void OnRowPostPaint (DataGridViewRowPostPaintEventArgs e)
4818 DataGridViewRowPostPaintEventHandler eh = (DataGridViewRowPostPaintEventHandler)(Events [RowPostPaintEvent]);
4819 if (eh != null) eh (this, e);
4822 protected internal virtual void OnRowPrePaint (DataGridViewRowPrePaintEventArgs e)
4824 DataGridViewRowPrePaintEventHandler eh = (DataGridViewRowPrePaintEventHandler)(Events [RowPrePaintEvent]);
4825 if (eh != null) eh (this, e);
4828 internal void OnRowsAddedInternal (DataGridViewRowsAddedEventArgs e)
4830 if (hover_cell != null && hover_cell.RowIndex >= e.RowIndex)
4832 AutoResizeColumnsInternal ();
4837 protected internal virtual void OnRowsAdded (DataGridViewRowsAddedEventArgs e)
4839 DataGridViewRowsAddedEventHandler eh = (DataGridViewRowsAddedEventHandler)(Events [RowsAddedEvent]);
4840 if (eh != null) eh (this, e);
4843 protected virtual void OnRowsDefaultCellStyleChanged (EventArgs e)
4845 EventHandler eh = (EventHandler)(Events [RowsDefaultCellStyleChangedEvent]);
4846 if (eh != null) eh (this, e);
4849 internal void OnRowsRemovedInternal (DataGridViewRowsRemovedEventArgs e)
4851 if (selected_rows != null)
4852 selected_rows.InternalClear ();
4853 if (selected_columns != null)
4854 selected_columns.InternalClear ();
4856 if (Rows.Count == 0) {
4857 MoveCurrentCell (-1, -1, true, false, false, true);
4859 } else if (Columns.Count == 0) {
4860 MoveCurrentCell (-1, -1, true, false, false, true);
4863 int nextRowIndex = e.RowIndex;
4864 if (nextRowIndex >= Rows.Count)
4865 nextRowIndex = Rows.Count - 1;
4866 MoveCurrentCell (currentCell != null ? currentCell.ColumnIndex : 0, nextRowIndex,
4867 true, false, false, true);
4868 if (hover_cell != null && hover_cell.RowIndex >= e.RowIndex)
4876 protected virtual void OnRowsRemoved (DataGridViewRowsRemovedEventArgs e)
4878 DataGridViewRowsRemovedEventHandler eh = (DataGridViewRowsRemovedEventHandler)(Events [RowsRemovedEvent]);
4879 if (eh != null) eh (this, e);
4882 protected internal virtual void OnRowStateChanged (int rowIndex, DataGridViewRowStateChangedEventArgs e)
4884 DataGridViewRowStateChangedEventHandler eh = (DataGridViewRowStateChangedEventHandler)(Events [RowStateChangedEvent]);
4885 if (eh != null) eh (this, e);
4888 protected virtual void OnRowUnshared (DataGridViewRowEventArgs e)
4890 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowUnsharedEvent]);
4891 if (eh != null) eh (this, e);
4894 protected virtual void OnRowValidated (DataGridViewCellEventArgs e)
4896 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowValidatedEvent]);
4897 if (eh != null) eh (this, e);
4900 protected virtual void OnRowValidating (DataGridViewCellCancelEventArgs e)
4902 DataGridViewCellCancelEventHandler eh = (DataGridViewCellCancelEventHandler)(Events [RowValidatingEvent]);
4903 if (eh != null) eh (this, e);
4906 protected virtual void OnScroll (ScrollEventArgs e)
4908 ScrollEventHandler eh = (ScrollEventHandler)(Events [ScrollEvent]);
4909 if (eh != null) eh (this, e);
4912 protected virtual void OnSelectionChanged (EventArgs e)
4914 EventHandler eh = (EventHandler)(Events [SelectionChangedEvent]);
4915 if (eh != null) eh (this, e);
4918 protected virtual void OnSortCompare (DataGridViewSortCompareEventArgs e) {
4919 DataGridViewSortCompareEventHandler eh = (DataGridViewSortCompareEventHandler)(Events [SortCompareEvent]);
4920 if (eh != null) eh (this, e);
4923 protected virtual void OnSorted (EventArgs e)
4925 EventHandler eh = (EventHandler)(Events [SortedEvent]);
4926 if (eh != null) eh (this, e);
4929 protected virtual void OnUserAddedRow (DataGridViewRowEventArgs e)
4931 PrepareEditingRow (false, false);
4933 new_row_editing = true;
4934 if (DataManager != null) {
4935 // Switch the current editing row with a real one
4936 if (editing_row != null) {
4937 Rows.RemoveInternal (editing_row);
4940 DataManager.AddNew (); // will raise OnListPositionChanged
4943 e = new DataGridViewRowEventArgs (Rows[NewRowIndex]);
4944 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [UserAddedRowEvent]);
4945 if (eh != null) eh (this, e);
4948 protected virtual void OnUserDeletedRow (DataGridViewRowEventArgs e)
4950 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [UserDeletedRowEvent]);
4951 if (eh != null) eh (this, e);
4954 protected virtual void OnUserDeletingRow (DataGridViewRowCancelEventArgs e)
4956 DataGridViewRowCancelEventHandler eh = (DataGridViewRowCancelEventHandler)(Events [UserDeletingRowEvent]);
4957 if (eh != null) eh (this, e);
4960 protected override void OnValidating (CancelEventArgs e)
4962 base.OnValidating(e);
4965 protected override void OnVisibleChanged (EventArgs e)
4967 base.OnVisibleChanged(e);
4970 protected virtual void PaintBackground (Graphics graphics, Rectangle clipBounds, Rectangle gridBounds)
4972 graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (backgroundColor), gridBounds);
4975 protected bool ProcessAKey (Keys keyData)
4980 if ((keyData & Keys.Control) == Keys.Control) {
4988 protected virtual bool ProcessDataGridViewKey (KeyEventArgs e)
4990 switch (e.KeyData & ~Keys.Modifiers) {
4992 return ProcessAKey (e.KeyData);
4994 return ProcessDeleteKey (e.KeyData);
4996 return ProcessDownKey (e.KeyData);
4998 return ProcessEscapeKey (e.KeyData);
5000 return ProcessEndKey (e.KeyData);
5002 return ProcessEnterKey (e.KeyData);
5004 return ProcessF2Key (e.KeyData);
5006 return ProcessHomeKey (e.KeyData);
5008 return ProcessLeftKey (e.KeyData);
5010 return ProcessNextKey (e.KeyData);
5012 return ProcessPriorKey (e.KeyData);
5014 return ProcessRightKey (e.KeyData);
5016 return ProcessSpaceKey (e.KeyData);
5018 return ProcessTabKey (e.KeyData);
5020 return ProcessUpKey (e.KeyData);
5023 return ProcessZeroKey (e.KeyData);
5029 protected bool ProcessDeleteKey (Keys keyData)
5031 if (!allowUserToDeleteRows || SelectedRows.Count == 0)
5034 int index = Math.Max (selected_row - SelectedRows.Count + 1, 0);
5036 for (int i = SelectedRows.Count - 1; i >= 0; i--) {
5037 DataGridViewRow row = SelectedRows[i];
5042 if (hover_cell != null && hover_cell.OwningRow == row)
5045 if (DataSource != null && DataSource is DataSet)
5046 (DataSource as DataSet).Tables[dataMember].Rows.RemoveAt (row.Index);
5048 Rows.RemoveAt (row.Index);
5054 protected override bool ProcessDialogKey (Keys keyData)
5058 case Keys.Shift | Keys.Tab:
5060 return base.ProcessDialogKey (keyData & ~Keys.Control);
5062 if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
5066 case Keys.Control | Keys.Tab:
5067 case Keys.Control | Keys.Shift | Keys.Tab:
5069 return base.ProcessDialogKey (keyData & ~Keys.Control);
5071 if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
5077 if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
5083 return base.ProcessDialogKey(keyData);
5086 protected bool ProcessDownKey (Keys keyData)
5088 int current_row = CurrentCellAddress.Y;
5090 if (current_row < Rows.Count - 1) {
5091 // Move to the last cell in the column
5092 if ((keyData & Keys.Control) == Keys.Control)
5093 MoveCurrentCell (CurrentCellAddress.X, Rows.Count - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5094 // Move one cell down
5096 MoveCurrentCell (CurrentCellAddress.X, current_row + 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5104 protected bool ProcessEndKey (Keys keyData)
5106 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5108 // Move to the last cell in the control
5109 if ((keyData & Keys.Control) == Keys.Control) {
5110 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), Rows.Count - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5114 // Move to the last cell in the row
5115 if (disp_index < Columns.Count - 1) {
5116 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5123 protected bool ProcessEnterKey (Keys keyData)
5125 if (ProcessDownKey (keyData))
5128 // ProcessDown may fail if we are on the last row,
5129 // but Enter should still EndEdit if this is the last row
5134 protected bool ProcessEscapeKey (Keys keyData)
5136 if (!IsCurrentCellInEditMode)
5143 protected bool ProcessF2Key (Keys keyData)
5145 if (editMode == DataGridViewEditMode.EditOnF2 || editMode == DataGridViewEditMode.EditOnKeystrokeOrF2) {
5153 protected bool ProcessHomeKey (Keys keyData)
5155 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5157 // Move to the first cell in the control
5158 if ((keyData & Keys.Control) == Keys.Control) {
5159 MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5163 // Move to the first cell in the row
5164 if (disp_index > 0) {
5165 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5172 [MonoTODO ("What does insert do?")]
5173 protected bool ProcessInsertKey (Keys keyData)
5178 protected override bool ProcessKeyEventArgs (ref Message m)
5180 DataGridViewCell cell = CurrentCell;
5183 if (cell.KeyEntersEditMode (new KeyEventArgs ((Keys)m.WParam.ToInt32 ())))
5185 if (EditingControl != null && ((Msg)m.Msg == Msg.WM_KEYDOWN || (Msg)m.Msg == Msg.WM_CHAR))
5186 XplatUI.SendMessage (EditingControl.Handle, (Msg)m.Msg, m.WParam, m.LParam);
5189 return base.ProcessKeyEventArgs (ref m);
5192 protected override bool ProcessKeyPreview (ref Message m)
5194 if ((Msg)m.Msg == Msg.WM_KEYDOWN && (IsCurrentCellInEditMode || m.HWnd == horizontalScrollBar.Handle || m.HWnd == verticalScrollBar.Handle)) {
5195 KeyEventArgs e = new KeyEventArgs ((Keys)m.WParam.ToInt32 ());
5197 IDataGridViewEditingControl ctrl = (IDataGridViewEditingControl)EditingControlInternal;
5200 if (ctrl.EditingControlWantsInputKey (e.KeyData, false))
5203 switch (e.KeyData) {
5212 return ProcessDataGridViewKey (e);
5216 return base.ProcessKeyPreview (ref m);
5219 protected bool ProcessLeftKey (Keys keyData)
5221 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5223 if (disp_index > 0) {
5224 // Move to the first cell in the row
5225 if ((keyData & Keys.Control) == Keys.Control)
5226 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5227 // Move one cell to the left
5229 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5238 protected bool ProcessNextKey (Keys keyData)
5240 int current_row = CurrentCellAddress.Y;
5242 if (current_row < Rows.Count - 1) {
5243 // Move one "page" of cells down
5244 int new_row = Math.Min (Rows.Count - 1, current_row + DisplayedRowCount (false));
5246 MoveCurrentCell (CurrentCellAddress.X, new_row, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5255 protected bool ProcessPriorKey (Keys keyData)
5257 int current_row = CurrentCellAddress.Y;
5259 if (current_row > 0) {
5260 // Move one "page" of cells up
5261 int new_row = Math.Max (0, current_row - DisplayedRowCount (false));
5263 MoveCurrentCell (CurrentCellAddress.X, new_row, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5271 protected bool ProcessRightKey (Keys keyData)
5273 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5275 if (disp_index < Columns.Count - 1) {
5276 // Move to the last cell in the row
5277 if ((keyData & Keys.Control) == Keys.Control)
5278 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5279 // Move one cell to the right
5281 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index + 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5289 protected bool ProcessSpaceKey (Keys keyData)
5291 if ((keyData & Keys.Shift) == Keys.Shift) {
5292 if (selectionMode == DataGridViewSelectionMode.RowHeaderSelect) {
5293 SetSelectedRowCore (CurrentCellAddress.Y, true);
5294 InvalidateRow (CurrentCellAddress.Y);
5297 if (selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect) {
5298 SetSelectedColumnCore (CurrentCellAddress.X, true);
5299 InvalidateColumn (CurrentCellAddress.X);
5304 if (CurrentCell is DataGridViewButtonCell || CurrentCell is DataGridViewLinkCell || CurrentCell is DataGridViewCheckBoxCell) {
5305 DataGridViewCellEventArgs e = new DataGridViewCellEventArgs (CurrentCell.ColumnIndex, CurrentCell.RowIndex);
5308 OnCellContentClick (e);
5310 if (CurrentCell is DataGridViewButtonCell)
5311 (CurrentCell as DataGridViewButtonCell).OnClickInternal (e);
5312 if (CurrentCell is DataGridViewCheckBoxCell)
5313 (CurrentCell as DataGridViewCheckBoxCell).OnClickInternal (e);
5321 protected bool ProcessTabKey (Keys keyData)
5323 Form f = FindForm ();
5326 f.ActivateFocusCues ();
5328 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5331 // Shift-tab goes backwards
5332 if ((keyData & Keys.Shift) == Keys.Shift) {
5333 if (disp_index > 0) {
5334 // Move one cell to the left
5335 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, false, true);
5337 } else if (currentCellAddress.Y > 0) {
5338 // Move to the last cell in the previous row
5339 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y - 1, true, false, false, true);
5344 if (disp_index < Columns.Count - 1) {
5345 // Move one cell to the right
5346 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index + 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, false, true);
5349 } else if (currentCellAddress.Y < Rows.Count - 1) {
5350 // Move to the first cell in the next row
5351 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y + 1, true, false, false, true);
5361 protected bool ProcessUpKey (Keys keyData)
5363 int current_row = CurrentCellAddress.Y;
5365 if (current_row > 0) {
5366 // Move to the first cell in the column
5367 if ((keyData & Keys.Control) == Keys.Control)
5368 MoveCurrentCell (CurrentCellAddress.X, 0, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5371 MoveCurrentCell (CurrentCellAddress.X, current_row - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5379 protected bool ProcessZeroKey (Keys keyData)
5381 if ((keyData & Keys.Control) == Keys.Control && CurrentCell.EditType != null) {
5382 CurrentCell.Value = DBNull.Value;
5383 InvalidateCell (CurrentCell);
5390 protected override void SetBoundsCore (int x, int y, int width, int height, BoundsSpecified specified) {
5391 base.SetBoundsCore(x, y, width, height, specified);
5394 [MonoTODO ("Does not use validateCurrentCell")]
5395 protected virtual bool SetCurrentCellAddressCore (int columnIndex, int rowIndex, bool setAnchorCellAddress, bool validateCurrentCell, bool throughMouseClick)
5397 if ((columnIndex < 0 || columnIndex > Columns.Count - 1) && rowIndex != -1)
5398 throw new ArgumentOutOfRangeException ("columnIndex");
5399 if ((rowIndex < 0 || rowIndex > Rows.Count - 1) && columnIndex != -1)
5400 throw new ArgumentOutOfRangeException ("rowIndex");
5402 DataGridViewCell cell;
5404 if (columnIndex == -1 && rowIndex == -1)
5407 cell = Rows.SharedRow (rowIndex).Cells[columnIndex];
5409 if (cell != null && !cell.Visible)
5410 throw new InvalidOperationException ("cell is not visible");
5412 // Always update the current cell address property
5413 // If the row has moved it would be out of date.
5414 if (currentCell != null) {
5415 if (setAnchorCellAddress) {
5416 anchor_cell.X = currentCell.ColumnIndex;
5417 anchor_cell.Y = currentCell.RowIndex;
5419 currentCellAddress.X = currentCell.ColumnIndex;
5420 currentCellAddress.Y = currentCell.RowIndex;
5423 if (cell != currentCell) {
5424 if (currentCell != null) {
5425 if (currentCell.IsInEditMode) {
5428 else if (currentCell.RowIndex == NewRowIndex && new_row_editing)
5431 OnCellLeave (new DataGridViewCellEventArgs(currentCell.ColumnIndex, currentCell.RowIndex));
5432 OnRowLeave (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
5436 if (setAnchorCellAddress)
5437 anchor_cell = new Point (columnIndex, rowIndex);
5438 currentCellAddress = new Point (columnIndex, rowIndex);
5441 UpdateBindingPosition (cell.RowIndex);
5442 OnRowEnter (new DataGridViewCellEventArgs (cell.ColumnIndex, cell.RowIndex));
5443 OnCellEnter (new DataGridViewCellEventArgs(cell.ColumnIndex, cell.RowIndex));
5445 OnCurrentCellChanged (EventArgs.Empty);
5448 // If the user begins an edit in the NewRow, add a new row
5449 if (AllowUserToAddRows && cell.RowIndex == NewRowIndex && !is_binding && !new_row_editing) {
5450 // OnUserAddedRow will add a real row and reset the current cell
5451 OnUserAddedRow (new DataGridViewRowEventArgs (Rows[NewRowIndex]));
5453 if (editMode == DataGridViewEditMode.EditOnEnter)
5458 if (cell != null && throughMouseClick)
5465 protected virtual void SetSelectedCellCore (int columnIndex, int rowIndex, bool selected) {
5466 rows [rowIndex].Cells [columnIndex].Selected = selected;
5468 OnSelectionChanged (EventArgs.Empty);
5471 internal void SetSelectedColumnCoreInternal (int columnIndex, bool selected) {
5472 SetSelectedColumnCore (columnIndex, selected);
5475 protected virtual void SetSelectedColumnCore (int columnIndex, bool selected) {
5476 if (selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect && selectionMode != DataGridViewSelectionMode.FullColumnSelect)
5479 DataGridViewColumn col = columns [columnIndex];
5481 col.SelectedInternal = selected;
5483 if (selected_columns == null)
5484 selected_columns = new DataGridViewSelectedColumnCollection ();
5486 if (!selected && selected_columns.Contains (col)) {
5487 selected_columns.InternalRemove (col);
5488 } else if (selected && !selected_columns.Contains (col)) {
5489 selected_columns.InternalAdd (col);
5495 internal void SetSelectedRowCoreInternal (int rowIndex, bool selected) {
5496 if (rowIndex >= 0 && rowIndex < Rows.Count)
5497 SetSelectedRowCore (rowIndex, selected);
5500 protected virtual void SetSelectedRowCore (int rowIndex, bool selected) {
5501 DataGridViewRow row = rows [rowIndex];
5503 row.SelectedInternal = selected;
5505 if (selected_rows == null)
5506 selected_rows = new DataGridViewSelectedRowCollection (this);
5508 if (!selected && selected_rows.Contains (row)) {
5509 selected_rows.InternalRemove (row);
5510 } else if (selected && !selected_rows.Contains (row)) {
5511 selected_rows.InternalAdd (row);
5517 protected override void WndProc (ref Message m)
5519 base.WndProc (ref m);
5522 internal void InternalOnCellClick (DataGridViewCellEventArgs e)
5527 internal void InternalOnCellContentClick (DataGridViewCellEventArgs e)
5529 OnCellContentClick (e);
5532 internal void InternalOnCellContentDoubleClick (DataGridViewCellEventArgs e)
5534 OnCellContentDoubleClick (e);
5537 internal void InternalOnCellValueChanged (DataGridViewCellEventArgs e)
5539 OnCellValueChanged (e);
5542 internal void InternalOnDataError (DataGridViewDataErrorEventArgs e)
5544 /////////////// false? ////////////
5545 OnDataError (false, e);
5548 internal void InternalOnMouseWheel (MouseEventArgs e)
5553 internal void OnHScrollBarScroll (object sender, ScrollEventArgs e)
5555 horizontalScrollingOffset = e.NewValue;
5558 for (int index = 0; index < Columns.Count; index++) {
5559 DataGridViewColumn col = Columns[index];
5561 if (e.NewValue < left + col.Width) {
5562 if (first_col_index != index) {
5563 first_col_index = index;
5575 internal void OnVScrollBarScroll (object sender, ScrollEventArgs e)
5577 verticalScrollingOffset = e.NewValue;
5578 if (Rows.Count == 0)
5583 for (int index = 0; index < Rows.Count; index++) {
5584 DataGridViewRow row = Rows[index];
5585 if (e.NewValue < top + row.Height) {
5586 if (first_row_index != index) {
5587 first_row_index = index;
5598 first_row_index = Rows.Count - DisplayedRowCount (false);
5603 internal void RaiseCellStyleChanged (DataGridViewCellEventArgs e) {
5604 OnCellStyleChanged(e);
5607 internal void OnColumnCollectionChanged (object sender, CollectionChangeEventArgs e) {
5609 case CollectionChangeAction.Add:
5610 OnColumnAddedInternal(new DataGridViewColumnEventArgs(e.Element as DataGridViewColumn));
5612 case CollectionChangeAction.Remove:
5613 OnColumnRemovedInternal(new DataGridViewColumnEventArgs(e.Element as DataGridViewColumn));
5615 case CollectionChangeAction.Refresh:
5620 // Resizes all columns according to their AutoResizeMode property.
5621 // First all the columns that aren't Filled are resized, then we resize all the Filled columns.
5622 internal void AutoResizeColumnsInternal ()
5624 for (int i = 0; i < Columns.Count; i++)
5625 AutoResizeColumnInternal (i, Columns [i].InheritedAutoSizeMode);
5627 AutoFillColumnsInternal ();
5630 internal void AutoFillColumnsInternal ()
5632 float totalFillWeight = 0;
5633 int FillCount = 0; // The number of columns that has AutoSizeMode.Fill set
5634 int spaceLeft = ClientSize.Width - (verticalScrollBar.VisibleInternal ? verticalScrollBar.Width : 0);
5636 if (RowHeadersVisible) {
5637 spaceLeft -= RowHeadersWidth;
5639 spaceLeft -= BorderWidth * 2;
5641 int [] fixed_widths = new int [Columns.Count];
5642 int [] new_widths = new int [Columns.Count];
5643 bool fixed_any = false;
5645 for (int i = 0; i < Columns.Count; i++) {
5646 DataGridViewColumn col = Columns [i];
5648 switch (col.InheritedAutoSizeMode) {
5649 case DataGridViewAutoSizeColumnMode.Fill:
5651 totalFillWeight += col.FillWeight;
5653 case DataGridViewAutoSizeColumnMode.AllCellsExceptHeader:
5654 case DataGridViewAutoSizeColumnMode.AllCells:
5655 case DataGridViewAutoSizeColumnMode.DisplayedCells:
5656 case DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader:
5657 case DataGridViewAutoSizeColumnMode.None:
5658 case DataGridViewAutoSizeColumnMode.NotSet:
5659 spaceLeft -= Columns [i].Width;
5664 spaceLeft = Math.Max (0, spaceLeft);
5668 for (int i = 0; i < columns.Count; i++) {
5669 DataGridViewColumn col = Columns [i];
5672 if (col.InheritedAutoSizeMode != DataGridViewAutoSizeColumnMode.Fill)
5675 if (fixed_widths [i] != 0)
5678 width = (totalFillWeight == 0) ? 0 : (int) Math.Round (spaceLeft * (col.FillWeight / totalFillWeight), 0);
5683 if (width < col.MinimumWidth) {
5684 width = col.MinimumWidth;
5685 fixed_widths [i] = width;
5688 totalFillWeight -= col.FillWeight;
5691 new_widths [i] = width;
5693 } while (fixed_any);
5695 for (int i = 0; i < columns.Count; i++) {
5696 if (Columns [i].InheritedAutoSizeMode != DataGridViewAutoSizeColumnMode.Fill)
5699 Columns [i].Width = new_widths [i];
5703 internal void AutoResizeColumnInternal (int columnIndex, DataGridViewAutoSizeColumnMode mode)
5705 // http://msdn2.microsoft.com/en-us/library/ms171605.aspx
5708 DataGridViewColumn col = Columns [columnIndex];
5711 case DataGridViewAutoSizeColumnMode.Fill:
5713 case DataGridViewAutoSizeColumnMode.AllCellsExceptHeader:
5714 case DataGridViewAutoSizeColumnMode.AllCells:
5715 case DataGridViewAutoSizeColumnMode.DisplayedCells:
5716 case DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader:
5717 size = Math.Max (CalculateColumnCellWidth (columnIndex, col.InheritedAutoSizeMode),
5718 col.HeaderCell.ContentBounds.Width);
5720 case DataGridViewAutoSizeColumnMode.ColumnHeader:
5721 size = col.HeaderCell.ContentBounds.Width;
5730 if (size < col.MinimumWidth)
5731 size = col.MinimumWidth;
5736 internal int CalculateColumnCellWidth (int index, DataGridViewAutoSizeColumnMode mode)
5740 bool only_visible = false;
5742 if (mode == DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader ||
5743 mode == DataGridViewAutoSizeColumnMode.AllCellsExceptHeader)
5746 only_visible = (mode == DataGridViewAutoSizeColumnMode.DisplayedCells || mode == DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader);
5748 for (int i = first_row; i < Rows.Count; i++) {
5750 Rectangle row_rect = this.GetRowDisplayRectangle (i, false);
5751 if (!ClientRectangle.IntersectsWith (row_rect))
5755 int cell_width = Rows[i].Cells[index].PreferredSize.Width;
5757 result = Math.Max (result, cell_width);
5763 Rectangle GetHeaderCellBounds (DataGridViewHeaderCell cell)
5765 Rectangle bounds = new Rectangle (ClientRectangle.Location, cell.Size);
5766 if (cell is DataGridViewColumnHeaderCell) {
5767 if (RowHeadersVisible)
5768 bounds.X += RowHeadersWidth;
5769 List<DataGridViewColumn> sortedColumns = columns.ColumnDisplayIndexSortedArrayList;
5770 for (int index = first_col_index; index < sortedColumns.Count; index++) {
5771 DataGridViewColumn column = sortedColumns [index];
5772 if (column.Index == cell.ColumnIndex)
5774 bounds.X += column.Width;
5777 if (ColumnHeadersVisible)
5778 bounds.Y += ColumnHeadersHeight;
5779 for (int index = first_row_index; index < Rows.Count; index++) {
5780 DataGridViewRow row = GetRowInternal (index);
5781 if (row.HeaderCell == cell)
5783 bounds.Y += row.Height;
5789 internal void PrepareEditingRow (bool cell_changed, bool column_changed)
5791 if (new_row_editing)
5796 show = ColumnCount > 0 && AllowUserToAddRows;
5798 if (!show && editing_row != null) {
5799 Rows.RemoveInternal (editing_row);
5802 if (editing_row != null && (cell_changed || column_changed)) {
5803 // The row changed, it's no longer an editing row.
5805 // The number of columns has changed, we need a new editing row.
5806 Rows.RemoveInternal (editing_row);
5809 if (editing_row == null) {
5810 editing_row = RowTemplateFull;
5811 Rows.AddInternal (editing_row, false);
5816 internal DataGridViewRow EditingRow {
5817 get { return editing_row; }
5820 private void AddBoundRow (object element)
5822 // Don't add rows if there are no columns
5823 if (ColumnCount == 0)
5826 DataGridViewRow row = (DataGridViewRow)RowTemplateFull;
5827 rows.InternalAdd (row);
5829 PropertyDescriptorCollection properties = TypeDescriptor.GetProperties (element);
5831 foreach (PropertyDescriptor property in properties) {
5832 if (property.PropertyType == typeof (IBindingList))
5835 // We do it this way because there may not be a column
5836 // for every cell, ignore cells with no column
5837 DataGridViewCell cell = row.Cells.GetBoundCell (property.Name);
5842 cell.Value = property.GetValue (element);
5843 cell.ValueType = property.PropertyType;
5847 private bool IsColumnAlreadyBound (string name)
5849 foreach (DataGridViewColumn col in Columns)
5850 if (col.DataPropertyName == name)
5856 private DataGridViewColumn CreateColumnByType (Type type)
5858 if (type == typeof (bool))
5859 return new DataGridViewCheckBoxColumn ();
5860 else if (typeof(Bitmap).IsAssignableFrom (type))
5861 return new DataGridViewImageColumn ();
5863 return new DataGridViewTextBoxColumn ();
5866 private void ClearBinding ()
5868 if (DataManager != null) {
5869 columns.ClearAutoGeneratedColumns ();
5870 PrepareEditingRow (false, true);
5872 DataManager.ListChanged -= OnListChanged;
5873 DataManager.PositionChanged -= OnListPositionChanged;
5877 private void DoBinding ()
5879 /* 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:
5880 - the System.Collections.IList interface, including one-dimensional arrays.
5881 - the System.ComponentModel.IListSource interface, such as the System.Data.DataTable and System.Data.DataSet classes.
5882 - the System.ComponentModel.IBindingList interface, such as the System.ComponentModel.Collections.BindingList<> class.
5883 - the System.ComponentModel.IBindingListView interface, such as the System.Windows.Forms.BindingSource class.
5886 if (dataSource != null && DataManager != null) {
5887 if (autoGenerateColumns) {
5888 is_autogenerating_columns = true;
5890 foreach (PropertyDescriptor property in DataManager.GetItemProperties()) {
5891 // This keeps out things like arrays
5892 if ((typeof(ICollection).IsAssignableFrom (property.PropertyType)))
5895 if (IsColumnAlreadyBound (property.DisplayName))
5898 DataGridViewColumn col = CreateColumnByType (property.PropertyType);
5899 col.Name = property.DisplayName;
5900 col.DataPropertyName = property.DisplayName;
5901 col.ReadOnly = !DataManager.AllowEdit || property.IsReadOnly;
5902 col.SetIsDataBound (true);
5903 col.ValueType = property.PropertyType;
5904 col.AutoGenerated = true;
5908 is_autogenerating_columns = false;
5911 // DataBind both autogenerated and not columns if there is a matching property
5912 foreach (PropertyDescriptor property in DataManager.GetItemProperties()) {
5913 foreach (DataGridViewColumn col in Columns) {
5914 if (col.DataPropertyName == property.Name)
5915 col.SetIsDataBound (true);
5919 foreach (object element in DataManager.List)
5920 AddBoundRow (element);
5922 DataManager.ListChanged += OnListChanged;
5923 DataManager.PositionChanged += OnListPositionChanged;
5924 OnDataBindingComplete (new DataGridViewBindingCompleteEventArgs (ListChangedType.Reset));
5925 OnListPositionChanged (this, EventArgs.Empty);
5927 if (Rows.Count > 0 && Columns.Count > 0)
5928 MoveCurrentCell (0, 0, true, false, false, false);
5935 private void MoveCurrentCell (int x, int y, bool select, bool isControl, bool isShift, bool scroll)
5937 if (x == -1 || y == -1)
5940 if (!SetCurrentCellAddressCore (x, y, true, false, false)) {
5944 if (x == -1 && y == -1) {
5949 bool full_row_selected = Rows.SharedRow(CurrentCellAddress.Y).Selected;
5950 bool full_col_selected = Columns[CurrentCellAddress.X].Selected;
5953 DataGridViewSelectionMode mode = selectionMode;
5955 // If we are row header select and we clicked a row header, use full row
5956 if (mode == DataGridViewSelectionMode.RowHeaderSelect && (x == -1 || (full_row_selected && CurrentCellAddress.X == x)))
5957 mode = DataGridViewSelectionMode.FullRowSelect;
5958 else if (mode == DataGridViewSelectionMode.RowHeaderSelect)
5959 mode = DataGridViewSelectionMode.CellSelect;
5961 // If we are col header select and we clicked a col header, use full col
5962 if (mode == DataGridViewSelectionMode.ColumnHeaderSelect && (y == -1 || (full_col_selected && CurrentCellAddress.Y == y)))
5963 mode = DataGridViewSelectionMode.FullColumnSelect;
5964 else if (mode == DataGridViewSelectionMode.ColumnHeaderSelect)
5965 mode = DataGridViewSelectionMode.CellSelect;
5967 // If the current cell isn't visible, scroll to it
5969 int disp_x = ColumnIndexToDisplayIndex (x);
5971 if (disp_x < first_col_index) {
5975 delta_x = horizontalScrollBar.Value;
5977 for (int i = disp_x; i < first_col_index; i++)
5978 delta_x += Columns[ColumnDisplayIndexToIndex (i)].Width;
5980 horizontalScrollBar.SafeValueSet (horizontalScrollBar.Value - delta_x);
5981 OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
5985 int displayedRowsCount = DisplayedRowCount (false);
5988 if (disp_y < first_row_index) {
5990 delta_y = verticalScrollBar.Value;
5992 for (int i = disp_y; i < first_row_index; i++)
5993 delta_y += GetRowInternal (i).Height;
5995 verticalScrollBar.SafeValueSet (verticalScrollBar.Value - delta_y);
5996 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
5997 } else if (disp_y > first_row_index + displayedRowsCount - 1) {
5998 if (disp_y == Rows.Count - 1)
5999 delta_y = verticalScrollBar.Maximum - verticalScrollBar.Value;
6001 for (int i = first_row_index + displayedRowsCount - 1; i < disp_y; i++)
6002 delta_y += GetRowInternal (i).Height;
6004 verticalScrollBar.SafeValueSet (verticalScrollBar.Value + delta_y);
6005 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
6012 // Clear old selection unless multi-selecting
6017 case DataGridViewSelectionMode.CellSelect:
6018 SetSelectedCellCore (x, y, true);
6020 case DataGridViewSelectionMode.FullRowSelect:
6021 SetSelectedRowCore (y, true);
6023 case DataGridViewSelectionMode.FullColumnSelect:
6024 SetSelectedColumnCore (x, true);
6031 private int ColumnIndexToDisplayIndex (int index)
6035 return Columns[index].DisplayIndex;
6038 private int ColumnDisplayIndexToIndex (int index)
6040 return Columns.ColumnDisplayIndexSortedArrayList[index].Index;
6043 private void OnListChanged (object sender, ListChangedEventArgs args)
6045 switch (args.ListChangedType) {
6046 case ListChangedType.ItemAdded:
6047 AddBoundRow (DataManager[args.NewIndex]);
6049 case ListChangedType.ItemDeleted:
6050 Rows.RemoveAtInternal (args.NewIndex);
6052 case ListChangedType.ItemChanged:
6062 private void OnListPositionChanged (object sender, EventArgs args)
6064 if (Rows.Count > 0 && Columns.Count > 0 && DataManager.Position != -1)
6065 MoveCurrentCell (currentCell != null ? currentCell.ColumnIndex : 0, DataManager.Position,
6066 true, false, false, true);
6068 MoveCurrentCell (-1, -1, true, false, false, true);
6071 private void ReBind ()
6081 private bool MouseOverColumnResize (int col, int mousex)
6083 if (!allowUserToResizeColumns)
6086 Rectangle col_bounds = GetCellDisplayRectangle (col, 0, false);
6088 if (mousex >= col_bounds.Right - 4 && mousex <= col_bounds.Right)
6094 private bool MouseOverRowResize (int row, int mousey)
6096 if (!allowUserToResizeRows)
6099 Rectangle row_bounds = GetCellDisplayRectangle (0, row, false);
6101 if (mousey >= row_bounds.Bottom - 4 && mousey <= row_bounds.Bottom)
6107 private void DrawVerticalResizeLine (int x)
6109 Rectangle splitter = new Rectangle (x, Bounds.Y + 3 + (ColumnHeadersVisible ? ColumnHeadersHeight : 0), 1, Bounds.Height - 3 - (ColumnHeadersVisible ? ColumnHeadersHeight : 0));
6110 XplatUI.DrawReversibleRectangle (Handle, splitter, 2);
6113 private void DrawHorizontalResizeLine (int y)
6115 Rectangle splitter = new Rectangle (Bounds.X + 3 + (RowHeadersVisible ? RowHeadersWidth : 0), y, Bounds.Width - 3 + (RowHeadersVisible ? RowHeadersWidth : 0), 1);
6116 XplatUI.DrawReversibleRectangle (Handle, splitter, 2);
6119 #region Stuff for ToolTips
6120 private void MouseEnteredErrorIcon (DataGridViewCell item)
6122 tooltip_currently_showing = item;
6123 ToolTipTimer.Start ();
6126 private void MouseLeftErrorIcon (DataGridViewCell item)
6128 ToolTipTimer.Stop ();
6129 ToolTipWindow.Hide (this);
6130 tooltip_currently_showing = null;
6133 private Timer ToolTipTimer {
6135 if (tooltip_timer == null) {
6136 tooltip_timer = new Timer ();
6137 tooltip_timer.Enabled = false;
6138 tooltip_timer.Interval = 500;
6139 tooltip_timer.Tick += new EventHandler (ToolTipTimer_Tick);
6142 return tooltip_timer;
6146 private ToolTip ToolTipWindow {
6148 if (tooltip_window == null)
6149 tooltip_window = new ToolTip ();
6151 return tooltip_window;
6155 private void ToolTipTimer_Tick (object o, EventArgs args)
6157 string tooltip = tooltip_currently_showing.ErrorText;
6159 if (!string.IsNullOrEmpty (tooltip))
6160 ToolTipWindow.Present (this, tooltip);
6162 ToolTipTimer.Stop ();
6166 private class ColumnSorter : IComparer
6172 public ColumnSorter (DataGridViewColumn column, ListSortDirection direction, bool numeric)
6174 this.column = column.Index;
6175 this.numeric_sort = numeric;
6177 if (direction == ListSortDirection.Descending)
6178 this.direction = -1;
6181 #region IComparer Members
6182 public int Compare (object x, object y)
6184 DataGridViewRow row1 = (DataGridViewRow)x;
6185 DataGridViewRow row2 = (DataGridViewRow)y;
6187 if (row1.Cells[column].ValueType == typeof (DateTime) && row2.Cells[column].ValueType == typeof (DateTime))
6188 return DateTime.Compare ((DateTime)row1.Cells[column].Value, (DateTime)row2.Cells[column].Value) * direction;
6190 object val1 = row1.Cells[column].FormattedValue;
6191 object val2 = row2.Cells[column].FormattedValue;
6192 object val1NullValue = row1.Cells[column].InheritedStyle.NullValue;
6193 object val2NullValue = row2.Cells[column].InheritedStyle.NullValue;
6195 if (val1 == val1NullValue && val2 == val2NullValue)
6197 if (val1 == val1NullValue)
6199 if (val2 == val2NullValue)
6200 return -1 * direction;
6203 return (int)(double.Parse (val1.ToString ()) - double.Parse (val2.ToString ())) * direction;
6205 return string.Compare (val1.ToString (), val2.ToString ()) * direction;
6210 public sealed class HitTestInfo {
6212 public static readonly HitTestInfo Nowhere = new HitTestInfo(-1, -1, -1, -1, DataGridViewHitTestType.None);
6214 private int columnIndex;
6215 private int columnX;
6216 private int rowIndex;
6218 private DataGridViewHitTestType type;
6220 internal HitTestInfo (int columnIndex, int columnX, int rowIndex, int rowY, DataGridViewHitTestType type) {
6221 this.columnIndex = columnIndex;
6222 this.columnX = columnX;
6223 this.rowIndex = rowIndex;
6228 public int ColumnIndex {
6229 get { return columnIndex; }
6232 public int ColumnX {
6233 get { return columnX; }
6236 public int RowIndex {
6237 get { return rowIndex; }
6241 get { return rowY; }
6244 public DataGridViewHitTestType Type {
6245 get { return type; }
6248 public override bool Equals (object value) {
6249 if (value is HitTestInfo) {
6250 HitTestInfo aux = (HitTestInfo) value;
6251 if (aux.columnIndex == columnIndex && aux.columnX == columnX && aux.rowIndex == rowIndex && aux.rowY == rowY && aux.type == type) {
6258 public override int GetHashCode () {
6259 return base.GetHashCode();
6262 public override string ToString () {
6263 return string.Format ("Type:{0}, Column:{1}, Row:{2}", type, columnIndex, rowIndex);
6268 [ComVisible (false)]
6269 public class DataGridViewControlCollection : Control.ControlCollection
6271 private DataGridView owner;
6273 public DataGridViewControlCollection (DataGridView owner) : base (owner)
6278 public override void Clear ()
6281 // This is severely buggy, just as MS' implementation is.
6283 for (int i = 0; i < Count; i++) {
6288 public void CopyTo (Control [] array, int index)
6290 base.CopyTo (array, index);
6293 public void Insert (int index, Control value)
6295 throw new NotSupportedException ();
6298 public override void Remove (Control value)
6300 if (value == owner.horizontalScrollBar)
6303 if (value == owner.verticalScrollBar)
6306 if (value == owner.editingControl)
6309 base.Remove (value);
6312 internal void RemoveInternal (Control value)
6314 base.Remove (value);
6320 [ComVisibleAttribute(true)]
6321 protected class DataGridViewAccessibleObject : ControlAccessibleObject {
6323 public DataGridViewAccessibleObject (DataGridView owner) : base (owner){
6326 public override AccessibleRole Role {
6327 get { return base.Role; }
6330 public override string Name {
6331 get { return base.Name; }
6334 public override AccessibleObject GetChild (int index) {
6335 return base.GetChild(index);
6338 public override int GetChildCount () {
6339 return base.GetChildCount();
6342 public override AccessibleObject GetFocused () {
6343 return base.GetFocused();
6346 public override AccessibleObject GetSelected () {
6347 return base.GetSelected();
6350 public override AccessibleObject HitTest (int x, int y) {
6351 return base.HitTest(x, y);
6354 public override AccessibleObject Navigate( AccessibleNavigation navigationDirection) {
6355 return base.Navigate(navigationDirection);
6361 protected class DataGridViewTopRowAccessibleObject : AccessibleObject
6363 #region Constructors
6364 public DataGridViewTopRowAccessibleObject ()
6368 public DataGridViewTopRowAccessibleObject (DataGridView owner)
6374 #region Public Methods
6375 public override AccessibleObject GetChild (int index)
6377 return base.GetChild (index);
6380 public override int GetChildCount ()
6382 return base.GetChildCount ();
6385 public override AccessibleObject Navigate (AccessibleNavigation navigationDirection)
6387 return base.Navigate (navigationDirection);
6391 #region Public Properties
6392 public override Rectangle Bounds {
6393 get { return base.Bounds; }
6396 public override string Name {
6397 get { return base.Name; }
6400 public DataGridView Owner {
6401 get { return (DataGridView)owner; }
6404 throw new InvalidOperationException ("owner has already been set");
6410 public override AccessibleObject Parent {
6411 get { return base.Parent; }
6414 public override AccessibleRole Role {
6415 get { return base.Role; }
6418 public override string Value {
6419 get { return base.Value; }