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>
28 using System.ComponentModel;
29 using System.Runtime.InteropServices;
31 using System.Reflection;
32 using System.Collections;
34 using System.Collections.Generic;
36 namespace System.Windows.Forms {
38 [ComVisibleAttribute(true)]
39 [ClassInterfaceAttribute(ClassInterfaceType.AutoDispatch)]
40 [Designer("System.Windows.Forms.Design.DataGridViewDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
41 [Editor("System.Windows.Forms.Design.DataGridViewComponentEditor, " + Consts.AssemblySystem_Design, typeof (System.ComponentModel.ComponentEditor))]
42 [ComplexBindingProperties ("DataSource", "DataMember")]
43 [DefaultEvent ("CellContentClick")]
44 [Docking (DockingBehavior.Ask)]
45 public class DataGridView : Control, ISupportInitialize, IBindableComponent, IDropTarget
48 private DataGridViewAdvancedBorderStyle adjustedTopLeftHeaderBorderStyle;
49 private DataGridViewAdvancedBorderStyle advancedCellBorderStyle;
50 private DataGridViewAdvancedBorderStyle advancedColumnHeadersBorderStyle;
51 private DataGridViewAdvancedBorderStyle advancedRowHeadersBorderStyle;
52 private bool allowUserToAddRows;
53 private bool allowUserToDeleteRows;
54 private bool allowUserToOrderColumns;
55 private bool allowUserToResizeColumns;
56 private bool allowUserToResizeRows;
57 private DataGridViewCellStyle alternatingRowsDefaultCellStyle;
58 private Point anchor_cell;
59 private bool autoGenerateColumns;
60 private bool autoSize;
61 private DataGridViewAutoSizeColumnsMode autoSizeColumnsMode;
62 private DataGridViewAutoSizeRowsMode autoSizeRowsMode;
63 private Color backColor;
64 private Color backgroundColor;
65 private Image backgroundImage;
66 private BorderStyle borderStyle;
67 private DataGridViewCellBorderStyle cellBorderStyle;
68 private DataGridViewClipboardCopyMode clipboardCopyMode;
69 private DataGridViewHeaderBorderStyle columnHeadersBorderStyle;
70 private DataGridViewCellStyle columnHeadersDefaultCellStyle;
71 private int columnHeadersHeight;
72 private DataGridViewColumnHeadersHeightSizeMode columnHeadersHeightSizeMode;
73 private bool columnHeadersVisible;
74 private DataGridViewColumnCollection columns;
75 private DataGridViewCell currentCell;
76 private Point currentCellAddress;
77 //private DataGridViewRow currentRow;
78 private string dataMember;
79 private object dataSource;
80 private DataGridViewCellStyle defaultCellStyle;
81 //private Control editingControl;
82 private DataGridViewEditMode editMode;
83 private bool enableHeadersVisualStyles = true;
84 private DataGridViewCell firstDisplayedCell;
85 private int firstDisplayedScrollingColumnHiddenWidth;
86 private int firstDisplayedScrollingColumnIndex;
87 private int firstDisplayedScrollingRowIndex;
88 private Color gridColor = Color.FromKnownColor(KnownColor.ControlDark);
89 private int horizontalScrollingOffset;
90 private DataGridViewCell hover_cell = null;
91 private bool isCurrentCellDirty;
92 //private bool isCurrentRowDirty;
93 private bool multiSelect;
94 private bool readOnly;
95 private DataGridViewHeaderBorderStyle rowHeadersBorderStyle;
96 private DataGridViewCellStyle rowHeadersDefaultCellStyle;
97 private bool rowHeadersVisible;
98 private int rowHeadersWidth;
99 private DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode;
100 private DataGridViewRowCollection rows;
101 private DataGridViewCellStyle rowsDefaultCellStyle;
102 private DataGridViewRow rowTemplate;
103 private ScrollBars scrollBars;
104 private DataGridViewSelectionMode selectionMode;
105 private bool showCellErrors;
106 private bool showCellToolTips;
107 private bool showEditingIcon;
108 private bool showRowErrors;
109 private DataGridViewColumn sortedColumn = null;
110 private SortOrder sortOrder;
111 private bool standardTab;
112 private DataGridViewHeaderCell topLeftHeaderCell;
113 private Cursor userSetCursor;
114 private int verticalScrollingOffset;
115 private bool virtualMode;
116 private HScrollBar horizontalScrollBar;
117 private VScrollBar verticalScrollBar;
118 private Control editingControl;
119 private bool is_autogenerating_columns = false;
120 private bool is_binding = false;
121 private bool new_row_editing = false;
123 // These are used to implement selection behaviour with SHIFT pressed.
124 private int selected_row = -1;
125 private int selected_column = -1;
127 // Stuff for error Tooltips
128 private Timer tooltip_timer;
129 private ToolTip tooltip_window;
130 private DataGridViewCell tooltip_currently_showing;
132 private DataGridViewSelectedRowCollection selected_rows;
133 private DataGridViewSelectedColumnCollection selected_columns;
134 private DataGridViewRow editing_row;
136 DataGridViewHeaderCell pressed_header_cell;
137 DataGridViewHeaderCell entered_header_cell;
139 // For column/row resizing via mouse
140 private bool column_resize_active = false;
141 private bool row_resize_active = false;
142 private int resize_band = -1;
143 private int resize_band_start = 0;
144 private int resize_band_delta = 0;
146 public DataGridView ()
148 SetStyle (ControlStyles.Opaque, true);
149 //SetStyle (ControlStyles.UserMouse, true);
150 SetStyle (ControlStyles.OptimizedDoubleBuffer, true);
152 adjustedTopLeftHeaderBorderStyle = new DataGridViewAdvancedBorderStyle();
153 adjustedTopLeftHeaderBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
154 advancedCellBorderStyle = new DataGridViewAdvancedBorderStyle();
155 advancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
156 advancedColumnHeadersBorderStyle = new DataGridViewAdvancedBorderStyle();
157 advancedColumnHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
158 advancedRowHeadersBorderStyle = new DataGridViewAdvancedBorderStyle();
159 advancedRowHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
160 alternatingRowsDefaultCellStyle = new DataGridViewCellStyle();
161 allowUserToAddRows = true;
162 allowUserToDeleteRows = true;
163 allowUserToOrderColumns = false;
164 allowUserToResizeColumns = true;
165 allowUserToResizeRows = true;
166 autoGenerateColumns = true;
167 autoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
168 autoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
169 backColor = Control.DefaultBackColor;
170 backgroundColor = SystemColors.AppWorkspace;
171 borderStyle = BorderStyle.FixedSingle;
172 cellBorderStyle = DataGridViewCellBorderStyle.Single;
173 clipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithAutoHeaderText;
174 columnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
175 columnHeadersDefaultCellStyle = new DataGridViewCellStyle();
176 columnHeadersDefaultCellStyle.BackColor = SystemColors.Control;
177 columnHeadersDefaultCellStyle.ForeColor = SystemColors.WindowText;
178 columnHeadersDefaultCellStyle.SelectionBackColor = SystemColors.Highlight;
179 columnHeadersDefaultCellStyle.SelectionForeColor = SystemColors.HighlightText;
180 columnHeadersDefaultCellStyle.Font = this.Font;
181 columnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
182 columnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.True;
183 columnHeadersHeight = 23;
184 columnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
185 columnHeadersVisible = true;
186 columns = CreateColumnsInstance();
187 columns.CollectionChanged += OnColumnCollectionChanged;
188 currentCellAddress = new Point (-1, -1);
189 dataMember = String.Empty;
190 defaultCellStyle = new DataGridViewCellStyle();
191 defaultCellStyle.BackColor = SystemColors.Window;
192 defaultCellStyle.ForeColor = SystemColors.ControlText;
193 defaultCellStyle.SelectionBackColor = SystemColors.Highlight;
194 defaultCellStyle.SelectionForeColor = SystemColors.HighlightText;
195 defaultCellStyle.Font = this.Font;
196 defaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
197 defaultCellStyle.WrapMode = DataGridViewTriState.False;
198 editMode = DataGridViewEditMode.EditOnKeystrokeOrF2;
199 firstDisplayedScrollingColumnHiddenWidth = 0;
200 isCurrentCellDirty = false;
203 rowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
204 rowHeadersDefaultCellStyle = (DataGridViewCellStyle) columnHeadersDefaultCellStyle.Clone ();
205 rowHeadersVisible = true;
206 rowHeadersWidth = 41;
207 rowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing;
208 rows = CreateRowsInstance();
209 rowsDefaultCellStyle = new DataGridViewCellStyle();
210 selectionMode = DataGridViewSelectionMode.RowHeaderSelect;
211 showCellErrors = true;
212 showEditingIcon = true;
213 scrollBars = ScrollBars.Both;
214 userSetCursor = Cursor.Current;
217 horizontalScrollBar = new HScrollBar();
218 horizontalScrollBar.Scroll += OnHScrollBarScroll;
219 horizontalScrollBar.Visible = false;
221 verticalScrollBar = new VScrollBar();
222 verticalScrollBar.Scroll += OnVScrollBarScroll;
223 verticalScrollBar.Visible = false;
225 Controls.AddRange (new Control[] {horizontalScrollBar, verticalScrollBar});
228 void ISupportInitialize.BeginInit ()
232 void ISupportInitialize.EndInit ()
239 [EditorBrowsable (EditorBrowsableState.Advanced)]
240 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
241 public virtual DataGridViewAdvancedBorderStyle AdjustedTopLeftHeaderBorderStyle {
242 get { return adjustedTopLeftHeaderBorderStyle; }
246 [EditorBrowsable (EditorBrowsableState.Advanced)]
247 public DataGridViewAdvancedBorderStyle AdvancedCellBorderStyle {
248 get { return advancedCellBorderStyle; }
252 [EditorBrowsable (EditorBrowsableState.Advanced)]
253 public DataGridViewAdvancedBorderStyle AdvancedColumnHeadersBorderStyle {
254 get { return advancedColumnHeadersBorderStyle; }
258 [EditorBrowsable (EditorBrowsableState.Advanced)]
259 public DataGridViewAdvancedBorderStyle AdvancedRowHeadersBorderStyle {
260 get { return advancedRowHeadersBorderStyle; }
263 [DefaultValue (true)]
264 public bool AllowUserToAddRows {
266 if (allowUserToAddRows && DataManager != null)
267 return DataManager.AllowNew;
268 return allowUserToAddRows;
271 if (allowUserToAddRows != value) {
272 allowUserToAddRows = value;
278 PrepareEditingRow (false, false);
280 OnAllowUserToAddRowsChanged(EventArgs.Empty);
286 [DefaultValue (true)]
287 public bool AllowUserToDeleteRows {
289 if (allowUserToDeleteRows && DataManager != null)
290 return DataManager.AllowRemove;
291 return allowUserToDeleteRows;
294 if (allowUserToDeleteRows != value) {
295 allowUserToDeleteRows = value;
296 OnAllowUserToDeleteRowsChanged(EventArgs.Empty);
301 [DefaultValue (false)]
302 public bool AllowUserToOrderColumns {
303 get { return allowUserToOrderColumns; }
305 if (allowUserToOrderColumns != value) {
306 allowUserToOrderColumns = value;
307 OnAllowUserToOrderColumnsChanged(EventArgs.Empty);
312 [DefaultValue (true)]
313 public bool AllowUserToResizeColumns {
314 get { return allowUserToResizeColumns; }
316 if (allowUserToResizeColumns != value) {
317 allowUserToResizeColumns = value;
318 OnAllowUserToResizeColumnsChanged(EventArgs.Empty);
323 [DefaultValue (true)]
324 public bool AllowUserToResizeRows {
325 get { return allowUserToResizeRows; }
327 if (allowUserToResizeRows != value) {
328 allowUserToResizeRows = value;
329 OnAllowUserToResizeRowsChanged(EventArgs.Empty);
334 public DataGridViewCellStyle AlternatingRowsDefaultCellStyle {
335 get { return alternatingRowsDefaultCellStyle; }
337 if (alternatingRowsDefaultCellStyle != value) {
338 alternatingRowsDefaultCellStyle = value;
339 OnAlternatingRowsDefaultCellStyleChanged(EventArgs.Empty);
346 [EditorBrowsable (EditorBrowsableState.Advanced)]
347 [DefaultValue (true)]
348 public bool AutoGenerateColumns {
349 get { return autoGenerateColumns; }
351 if (autoGenerateColumns != value) {
352 autoGenerateColumns = value;
353 OnAutoGenerateColumnsChanged(EventArgs.Empty);
358 public override bool AutoSize {
359 get { return autoSize; }
361 if (autoSize != value) {
363 //OnAutoSizeChanged(EventArgs.Empty);
368 [DefaultValue (DataGridViewAutoSizeColumnsMode.None)]
369 public DataGridViewAutoSizeColumnsMode AutoSizeColumnsMode {
370 get { return autoSizeColumnsMode; }
372 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeColumnsMode), value)) {
373 throw new InvalidEnumArgumentException("Value is not valid DataGridViewAutoSizeColumnsMode.");
375 if (value == DataGridViewAutoSizeColumnsMode.ColumnHeader && columnHeadersVisible == false) {
376 foreach (DataGridViewColumn col in columns) {
377 if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet) {
378 throw new InvalidOperationException("Cant set this property to ColumnHeader in this DataGridView.");
382 if (value == DataGridViewAutoSizeColumnsMode.Fill) {
383 foreach (DataGridViewColumn col in columns) {
384 if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet) {
386 throw new InvalidOperationException("Cant set this property to Fill in this DataGridView.");
392 autoSizeColumnsMode = value;
393 AutoResizeColumns (value);
398 [DefaultValue (DataGridViewAutoSizeRowsMode.None)]
399 public DataGridViewAutoSizeRowsMode AutoSizeRowsMode {
400 get { return autoSizeRowsMode; }
402 if (autoSizeRowsMode != value) {
403 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeRowsMode), value)) {
404 throw new InvalidEnumArgumentException("Value is not valid DataGridViewRowsMode.");
406 if ((value == DataGridViewAutoSizeRowsMode.AllHeaders || value == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && rowHeadersVisible == false) {
407 throw new InvalidOperationException("Cant set this property to AllHeaders or DisplayedHeaders in this DataGridView.");
409 autoSizeRowsMode = value;
411 if (value == DataGridViewAutoSizeRowsMode.None)
412 foreach (DataGridViewRow row in Rows)
413 row.ResetToExplicitHeight ();
415 AutoResizeRows (value);
417 OnAutoSizeRowsModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
419 ////////////////////////////////////////////////////////////////
425 [EditorBrowsable (EditorBrowsableState.Never)]
426 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
427 public override Color BackColor {
428 get { return backColor; }
430 if (backColor != value) {
432 OnBackColorChanged(EventArgs.Empty);
437 public Color BackgroundColor {
438 get { return backgroundColor; }
440 if (backgroundColor != value) {
441 if (value == Color.Empty) {
442 throw new ArgumentException("Cant set an Empty color.");
444 backgroundColor = value;
445 OnBackgroundColorChanged(EventArgs.Empty);
451 [EditorBrowsable (EditorBrowsableState.Never)]
452 public override Image BackgroundImage {
453 get { return backgroundImage; }
455 if (backgroundImage != value) {
456 backgroundImage = value;
457 OnBackgroundImageChanged(EventArgs.Empty);
463 [EditorBrowsable (EditorBrowsableState.Never)]
464 public override ImageLayout BackgroundImageLayout {
465 get { return base.BackgroundImageLayout; }
466 set { base.BackgroundImageLayout = value; }
469 [DefaultValue (BorderStyle.FixedSingle)]
470 public BorderStyle BorderStyle {
471 get { return borderStyle; }
473 if (borderStyle != value) {
474 if (!Enum.IsDefined(typeof(BorderStyle), value)) {
475 throw new InvalidEnumArgumentException("Invalid border style.");
478 OnBorderStyleChanged(EventArgs.Empty);
483 internal int BorderWidth {
485 switch (BorderStyle) {
486 case BorderStyle.Fixed3D:
488 case BorderStyle.FixedSingle:
490 case BorderStyle.None:
498 [DefaultValue (DataGridViewCellBorderStyle.Single)]
499 public DataGridViewCellBorderStyle CellBorderStyle {
500 get { return cellBorderStyle; }
502 if (cellBorderStyle != value) {
503 if (value == DataGridViewCellBorderStyle.Custom)
504 throw new ArgumentException ("CellBorderStyle cannot be set to Custom.");
506 cellBorderStyle = value;
508 DataGridViewAdvancedBorderStyle border = new DataGridViewAdvancedBorderStyle ();
510 switch (cellBorderStyle) {
511 case DataGridViewCellBorderStyle.Single:
512 border.All = DataGridViewAdvancedCellBorderStyle.Single;
514 case DataGridViewCellBorderStyle.Raised:
515 case DataGridViewCellBorderStyle.RaisedVertical:
516 border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
517 border.Top = DataGridViewAdvancedCellBorderStyle.None;
518 border.Left = DataGridViewAdvancedCellBorderStyle.Outset;
519 border.Right = DataGridViewAdvancedCellBorderStyle.Outset;
521 case DataGridViewCellBorderStyle.Sunken:
522 border.All = DataGridViewAdvancedCellBorderStyle.Inset;
524 case DataGridViewCellBorderStyle.None:
525 border.All = DataGridViewAdvancedCellBorderStyle.None;
527 case DataGridViewCellBorderStyle.SingleVertical:
528 border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
529 border.Top = DataGridViewAdvancedCellBorderStyle.None;
530 border.Left = DataGridViewAdvancedCellBorderStyle.None;
531 border.Right = DataGridViewAdvancedCellBorderStyle.Single;
533 case DataGridViewCellBorderStyle.SunkenVertical:
534 border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
535 border.Top = DataGridViewAdvancedCellBorderStyle.None;
536 border.Left = DataGridViewAdvancedCellBorderStyle.Inset;
537 border.Right = DataGridViewAdvancedCellBorderStyle.Inset;
539 case DataGridViewCellBorderStyle.SingleHorizontal:
540 case DataGridViewCellBorderStyle.SunkenHorizontal:
541 border.Bottom = DataGridViewAdvancedCellBorderStyle.Inset;
542 border.Top = DataGridViewAdvancedCellBorderStyle.Inset;
543 border.Left = DataGridViewAdvancedCellBorderStyle.None;
544 border.Right = DataGridViewAdvancedCellBorderStyle.None;
546 case DataGridViewCellBorderStyle.RaisedHorizontal:
547 border.Bottom = DataGridViewAdvancedCellBorderStyle.Outset;
548 border.Top = DataGridViewAdvancedCellBorderStyle.Outset;
549 border.Left = DataGridViewAdvancedCellBorderStyle.None;
550 border.Right = DataGridViewAdvancedCellBorderStyle.None;
554 advancedCellBorderStyle = border;
556 OnCellBorderStyleChanged (EventArgs.Empty);
562 [DefaultValue (DataGridViewClipboardCopyMode.EnableWithAutoHeaderText)]
563 public DataGridViewClipboardCopyMode ClipboardCopyMode {
564 get { return clipboardCopyMode; }
565 set { clipboardCopyMode = value; }
569 [EditorBrowsable (EditorBrowsableState.Advanced)]
570 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
572 public int ColumnCount {
573 get { return columns.Count; }
576 throw new ArgumentOutOfRangeException("ColumnCount",
577 "ColumnCount must be >= 0.");
579 if (dataSource != null) {
580 throw new InvalidOperationException("Cant change column count if DataSource is set.");
582 if (value < columns.Count) {
583 for (int i = columns.Count -1; i >= value; i--) {
587 else if (value > columns.Count) {
588 for (int i = columns.Count; i < value; i++) {
589 DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn ();
597 [DefaultValue (DataGridViewHeaderBorderStyle.Raised)]
598 public DataGridViewHeaderBorderStyle ColumnHeadersBorderStyle {
599 get { return columnHeadersBorderStyle; }
601 if (columnHeadersBorderStyle != value) {
602 columnHeadersBorderStyle = value;
603 OnColumnHeadersBorderStyleChanged(EventArgs.Empty);
608 [AmbientValue (null)]
609 public DataGridViewCellStyle ColumnHeadersDefaultCellStyle {
610 get { return columnHeadersDefaultCellStyle; }
612 if (columnHeadersDefaultCellStyle != value) {
613 columnHeadersDefaultCellStyle = value;
614 OnColumnHeadersDefaultCellStyleChanged(EventArgs.Empty);
620 public int ColumnHeadersHeight {
621 get { return columnHeadersHeight; }
623 if (columnHeadersHeight != value) {
625 throw new ArgumentOutOfRangeException("ColumnHeadersHeight",
626 "Column headers height cant be less than 4.");
628 if (value > 32768 ) {
629 throw new ArgumentOutOfRangeException("ColumnHeadersHeight",
630 "Column headers height cannot be more than 32768.");
632 columnHeadersHeight = value;
633 OnColumnHeadersHeightChanged(EventArgs.Empty);
635 if (columnHeadersVisible)
641 [RefreshProperties (RefreshProperties.All)]
642 [DefaultValue (DataGridViewColumnHeadersHeightSizeMode.EnableResizing)]
643 public DataGridViewColumnHeadersHeightSizeMode ColumnHeadersHeightSizeMode {
644 get { return columnHeadersHeightSizeMode; }
646 if (columnHeadersHeightSizeMode != value) {
647 if (!Enum.IsDefined(typeof(DataGridViewColumnHeadersHeightSizeMode), value)) {
648 throw new InvalidEnumArgumentException("Value is not a valid DataGridViewColumnHeadersHeightSizeMode.");
650 columnHeadersHeightSizeMode = value;
651 OnColumnHeadersHeightSizeModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
656 [DefaultValue (true)]
657 public bool ColumnHeadersVisible {
658 get { return columnHeadersVisible; }
660 if (columnHeadersVisible != value) {
661 columnHeadersVisible = value;
667 [MergableProperty (false)]
668 [Editor ("System.Windows.Forms.Design.DataGridViewColumnCollectionEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
669 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
670 public DataGridViewColumnCollection Columns {
671 get { return columns; }
675 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
676 public DataGridViewCell CurrentCell {
677 get { return currentCell; }
679 /////////////////////////////////////////////////////
680 /// *** InvalidOperationException ***
681 /// Changes to the specified cell cannot be committed
682 /// to the data cache, or the new cell is in a hidden
684 /////////////////////////////////////////////////////
686 MoveCurrentCell (-1, -1, true, false, false, true);
687 else if (value.DataGridView != this)
688 throw new ArgumentException("The cell is not in this DataGridView.");
690 MoveCurrentCell (value.OwningColumn.Index, value.OwningRow.Index, true, false, false, true);
695 public Point CurrentCellAddress {
696 get { return currentCellAddress; }
700 public DataGridViewRow CurrentRow {
702 if (currentCell != null)
703 return currentCell.OwningRow;
709 [Editor ("System.Windows.Forms.Design.DataMemberListEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
710 public string DataMember {
711 get { return dataMember; }
713 if (dataMember != value) {
715 if (BindingContext != null)
717 OnDataMemberChanged(EventArgs.Empty);
722 [RefreshProperties (RefreshProperties.Repaint)]
723 [DefaultValue (null)]
724 [AttributeProvider (typeof (IListSource))]
725 public object DataSource {
726 get { return dataSource; }
728 /* The System.Windows.Forms.DataGridView class supports the standard Windows Forms data-binding model. This means the data source can be of any type that implements:
729 - the System.Collections.IList interface, including one-dimensional arrays.
730 - the System.ComponentModel.IListSource interface, such as the System.Data.DataTable and System.Data.DataSet classes.
731 - the System.ComponentModel.IBindingList interface, such as the System.ComponentModel.Collections.BindingList<> class.
732 - the System.ComponentModel.IBindingListView interface, such as the System.Windows.Forms.BindingSource class.
734 if (!(value == null || value is IList || value is IListSource || value is IBindingList || value is IBindingListView))
735 throw new NotSupportedException ("Type cannot be bound.");
737 if (value != DataSource) {
738 if (IsHandleCreated && value != null && BindingContext != null && BindingContext[value] != null)
739 DataMember = String.Empty;
743 // Do not set dataSource prior to the BindingContext check because there is some lazy initialization
744 // code which might result in double call to ReBind here and in OnBindingContextChanged
745 if (BindingContext != null) {
752 OnDataSourceChanged (EventArgs.Empty);
757 internal CurrencyManager DataManager {
759 if (DataSource != null && BindingContext != null) {
760 string dataMember = DataMember;
761 if (dataMember == null)
762 dataMember = String.Empty;
763 return (CurrencyManager) this.BindingContext[DataSource, dataMember];
769 [AmbientValue (null)]
770 public DataGridViewCellStyle DefaultCellStyle {
771 get { return defaultCellStyle; }
773 if (defaultCellStyle != value) {
774 defaultCellStyle = value;
775 OnDefaultCellStyleChanged(EventArgs.Empty);
780 public override Rectangle DisplayRectangle {
781 get { return base.DisplayRectangle; }
785 [EditorBrowsable (EditorBrowsableState.Advanced)]
786 public Control EditingControl {
788 return editingControl;
793 [EditorBrowsable (EditorBrowsableState.Advanced)]
794 public Panel EditingPanel {
795 get { throw new NotImplementedException(); }
798 [DefaultValue (DataGridViewEditMode.EditOnKeystrokeOrF2)]
799 public DataGridViewEditMode EditMode {
800 get { return editMode; }
802 if (editMode != value) {
804 OnEditModeChanged(EventArgs.Empty);
809 [DefaultValue (true)]
810 public bool EnableHeadersVisualStyles {
811 get { return enableHeadersVisualStyles; }
812 set { enableHeadersVisualStyles = value; }
815 internal DataGridViewHeaderCell EnteredHeaderCell {
816 get { return entered_header_cell; }
818 if (entered_header_cell == value)
820 if (ThemeEngine.Current.DataGridViewHeaderCellHasHotStyle (this)) {
821 Region area_to_invalidate = new Region ();
822 area_to_invalidate.MakeEmpty ();
823 if (entered_header_cell != null)
824 area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell));
825 entered_header_cell = value;
826 if (entered_header_cell != null)
827 area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell));
828 Invalidate (area_to_invalidate);
829 area_to_invalidate.Dispose ();
831 entered_header_cell = value;
836 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
837 public DataGridViewCell FirstDisplayedCell {
838 get { return firstDisplayedCell; }
840 if (value.DataGridView != this) {
841 throw new ArgumentException("The cell is not in this DataGridView.");
843 firstDisplayedCell = value;
848 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
849 [EditorBrowsable (EditorBrowsableState.Advanced)]
850 public int FirstDisplayedScrollingColumnHiddenWidth {
851 get { return firstDisplayedScrollingColumnHiddenWidth; }
855 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
856 public int FirstDisplayedScrollingColumnIndex {
857 get { return firstDisplayedScrollingColumnIndex; }
858 set { firstDisplayedScrollingColumnIndex = value; }
862 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
863 public int FirstDisplayedScrollingRowIndex {
864 get { return firstDisplayedScrollingRowIndex; }
865 set { firstDisplayedScrollingRowIndex = value; }
869 [EditorBrowsable (EditorBrowsableState.Advanced)]
870 public override Font Font {
871 get { return base.Font; }
872 set { base.Font = value; }
876 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
877 [EditorBrowsable (EditorBrowsableState.Advanced)]
878 public override Color ForeColor {
879 get { return base.ForeColor; }
880 set { base.ForeColor = value; }
883 public Color GridColor {
884 get { return gridColor; }
886 if (gridColor != value) {
887 if (value == Color.Empty) {
888 throw new ArgumentException("Cant set an Empty color.");
891 OnGridColorChanged(EventArgs.Empty);
897 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
898 public int HorizontalScrollingOffset {
899 get { return horizontalScrollingOffset; }
900 set { horizontalScrollingOffset = value; }
904 public bool IsCurrentCellDirty {
905 get { return isCurrentCellDirty; }
909 public bool IsCurrentCellInEditMode {
911 if (currentCell == null) {
914 return currentCell.IsInEditMode;
919 public bool IsCurrentRowDirty {
922 return IsCurrentCellDirty;
924 QuestionEventArgs args = new QuestionEventArgs ();
925 OnRowDirtyStateNeeded (args);
926 return args.Response;
931 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
932 public DataGridViewCell this [int columnIndex, int rowIndex] {
933 get { return rows[rowIndex].Cells[columnIndex]; }
934 set { rows[rowIndex].Cells[columnIndex] = value; }
938 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
939 public DataGridViewCell this [string columnName, int rowIndex] {
941 int columnIndex = -1;
942 foreach (DataGridViewColumn col in columns) {
943 if (col.Name == columnName) {
944 columnIndex = col.Index;
948 return this[columnIndex, rowIndex];
951 int columnIndex = -1;
952 foreach (DataGridViewColumn col in columns) {
953 if (col.Name == columnName) {
954 columnIndex = col.Index;
958 this[columnIndex, rowIndex] = value;
962 [DefaultValue (true)]
963 public bool MultiSelect {
964 get { return multiSelect; }
966 if (multiSelect != value) {
968 OnMultiSelectChanged(EventArgs.Empty);
974 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
975 public int NewRowIndex {
977 if (!AllowUserToAddRows || ColumnCount == 0) {
980 return rows.Count - 1;
985 [EditorBrowsable (EditorBrowsableState.Never)]
986 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
987 public new Padding Padding {
988 get { return Padding.Empty; }
992 internal DataGridViewHeaderCell PressedHeaderCell {
993 get { return pressed_header_cell; }
997 [DefaultValue (false)]
998 public bool ReadOnly {
999 get { return readOnly; }
1001 if (readOnly != value) {
1003 OnReadOnlyChanged(EventArgs.Empty);
1009 [EditorBrowsable (EditorBrowsableState.Advanced)]
1010 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1012 public int RowCount {
1013 get { return rows.Count; }
1016 throw new ArgumentException("RowCount must be >= 0.");
1018 if (value < 1 && AllowUserToAddRows) {
1019 throw new ArgumentException("RowCount must be >= 1 if AllowUserToAddRows is true.");
1021 if (dataSource != null) {
1022 throw new InvalidOperationException("Cant change row count if DataSource is set.");
1025 if (value < rows.Count) {
1026 int removeRangeEndIndex = rows.Count - 1;
1027 if (AllowUserToAddRows)
1028 removeRangeEndIndex--; // do not remove editing row
1030 int removeRangeStartIndex = value - 1;
1031 if (AllowUserToAddRows)
1032 removeRangeStartIndex--; // remove an extra row before/instead of the editing row
1034 for (int i = removeRangeEndIndex; i > removeRangeStartIndex; i--)
1036 } else if (value > rows.Count) {
1037 // If we need to add rows and don't have any columns,
1038 // we create one column
1039 if (ColumnCount == 0) {
1040 System.Diagnostics.Debug.Assert (rows.Count == 0);
1041 ColumnCount = 1; // this creates the edit row
1043 // update edit row height
1044 UpdateRowHeightInfo (0, false);
1048 List<DataGridViewRow> newRows = new List<DataGridViewRow> (value - rows.Count);
1049 for (int i = rows.Count; i < value; i++)
1050 newRows.Add ((DataGridViewRow) RowTemplateFull);
1051 rows.AddRange (newRows.ToArray());
1057 [DefaultValue (DataGridViewHeaderBorderStyle.Raised)]
1058 public DataGridViewHeaderBorderStyle RowHeadersBorderStyle {
1059 get { return rowHeadersBorderStyle; }
1061 if (rowHeadersBorderStyle != value) {
1062 rowHeadersBorderStyle = value;
1063 OnRowHeadersBorderStyleChanged(EventArgs.Empty);
1068 [AmbientValue (null)]
1069 public DataGridViewCellStyle RowHeadersDefaultCellStyle {
1070 get { return rowHeadersDefaultCellStyle; }
1072 if (rowHeadersDefaultCellStyle != value) {
1073 rowHeadersDefaultCellStyle = value;
1074 OnRowHeadersDefaultCellStyleChanged(EventArgs.Empty);
1079 [DefaultValue (true)]
1080 public bool RowHeadersVisible {
1081 get { return rowHeadersVisible; }
1083 if (rowHeadersVisible != value) {
1084 rowHeadersVisible = value;
1090 [Localizable (true)]
1091 public int RowHeadersWidth {
1092 get { return rowHeadersWidth; }
1094 if (rowHeadersWidth != value) {
1096 throw new ArgumentOutOfRangeException("RowHeadersWidth",
1097 "Row headers width cant be less than 4.");
1099 if (value > 32768 ) {
1100 throw new ArgumentOutOfRangeException("RowHeadersWidth",
1101 "Row headers width cannot be more than 32768.");
1103 rowHeadersWidth = value;
1104 OnRowHeadersWidthChanged(EventArgs.Empty);
1106 if (rowHeadersVisible)
1112 [RefreshProperties (RefreshProperties.All)]
1113 [DefaultValue (DataGridViewRowHeadersWidthSizeMode.EnableResizing)]
1114 public DataGridViewRowHeadersWidthSizeMode RowHeadersWidthSizeMode {
1115 get { return rowHeadersWidthSizeMode; }
1117 if (rowHeadersWidthSizeMode != value) {
1118 if (!Enum.IsDefined(typeof(DataGridViewRowHeadersWidthSizeMode), value)) {
1119 throw new InvalidEnumArgumentException("Value is not valid DataGridViewRowHeadersWidthSizeMode.");
1121 rowHeadersWidthSizeMode = value;
1122 OnRowHeadersWidthSizeModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
1128 public DataGridViewRowCollection Rows {
1129 get { return rows; }
1132 public DataGridViewCellStyle RowsDefaultCellStyle {
1133 get { return rowsDefaultCellStyle; }
1135 if (rowsDefaultCellStyle != value) {
1136 rowsDefaultCellStyle = value;
1137 OnRowsDefaultCellStyleChanged(EventArgs.Empty);
1142 // RowTemplate is just the row, it does not contain Cells
1144 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
1145 public DataGridViewRow RowTemplate {
1147 if (rowTemplate == null)
1148 rowTemplate = new DataGridViewRow ();
1153 rowTemplate = value;
1157 // Take the RowTemplate, clone it, and add Cells
1158 // Note this is not stored, so you don't need to Clone it
1159 internal DataGridViewRow RowTemplateFull {
1161 DataGridViewRow row = (DataGridViewRow) RowTemplate.Clone ();
1163 for (int i = row.Cells.Count; i < Columns.Count; i++) {
1164 DataGridViewCell template = columns [i].CellTemplate;
1166 if (template == null)
1167 throw new InvalidOperationException ("At least one of the DataGridView control's columns has no cell template.");
1169 row.Cells.Add ((DataGridViewCell) template.Clone ());
1176 internal override bool ScaleChildrenInternal {
1177 get { return false; }
1180 [DefaultValue (ScrollBars.Both)]
1181 [Localizable (true)]
1182 public ScrollBars ScrollBars {
1183 get { return scrollBars; }
1185 if (!Enum.IsDefined(typeof(ScrollBars), value)) {
1186 throw new InvalidEnumArgumentException("Invalid ScrollBars value.");
1188 ////////////////////////////////////////////////////////////
1189 /// *** InvalidOperationException ***
1190 /// The System.Windows.Forms.DataGridView is unable to
1191 /// scroll due to a cell change that cannot be committed
1193 ///////////////////////////////////////////////////////////
1201 public DataGridViewSelectedCellCollection SelectedCells {
1203 DataGridViewSelectedCellCollection selectedCells = new DataGridViewSelectedCellCollection();
1204 foreach (DataGridViewRow row in rows) {
1205 foreach (DataGridViewCell cell in row.Cells) {
1206 if (cell.Selected) {
1207 selectedCells.InternalAdd(cell);
1211 return selectedCells;
1216 public DataGridViewSelectedColumnCollection SelectedColumns {
1219 DataGridViewSelectedColumnCollection result = new DataGridViewSelectedColumnCollection ();
1221 if (selectionMode != DataGridViewSelectionMode.FullColumnSelect && selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect)
1224 result.InternalAddRange (selected_columns);
1231 public DataGridViewSelectedRowCollection SelectedRows {
1233 DataGridViewSelectedRowCollection result = new DataGridViewSelectedRowCollection (this);
1235 if (selectionMode != DataGridViewSelectionMode.FullRowSelect && selectionMode != DataGridViewSelectionMode.RowHeaderSelect)
1238 result.InternalAddRange (selected_rows);
1245 [DefaultValue (DataGridViewSelectionMode.RowHeaderSelect)]
1246 public DataGridViewSelectionMode SelectionMode {
1247 get { return selectionMode; }
1249 if (!Enum.IsDefined (typeof(DataGridViewSelectionMode), value))
1250 throw new InvalidEnumArgumentException ("Value is not valid DataGridViewSelectionMode.");
1252 if (value == DataGridViewSelectionMode.ColumnHeaderSelect || value == DataGridViewSelectionMode.FullColumnSelect)
1253 foreach (DataGridViewColumn col in Columns)
1254 if (col.SortMode == DataGridViewColumnSortMode.Automatic)
1255 throw new InvalidOperationException (string.Format ("Cannot set SelectionMode to {0} because there are Automatic sort columns.", value));
1257 selectionMode = value;
1261 [DefaultValue (true)]
1262 public bool ShowCellErrors {
1263 get { return showCellErrors; }
1264 set { showCellErrors = value; }
1267 [DefaultValue (true)]
1268 public bool ShowCellToolTips {
1269 get { return showCellToolTips; }
1270 set { showCellToolTips = value; }
1273 [DefaultValue (true)]
1274 public bool ShowEditingIcon {
1275 get { return showEditingIcon; }
1276 set { showEditingIcon = value; }
1279 [DefaultValue (true)]
1280 public bool ShowRowErrors {
1281 get { return showRowErrors; }
1282 set { showRowErrors = value; }
1286 public DataGridViewColumn SortedColumn {
1287 get { return sortedColumn; }
1291 public SortOrder SortOrder {
1292 get { return sortOrder; }
1295 [DefaultValue (false)]
1296 [EditorBrowsable (EditorBrowsableState.Advanced)]
1297 public bool StandardTab {
1298 get { return standardTab; }
1299 set { standardTab = value; }
1304 [EditorBrowsable (EditorBrowsableState.Never)]
1305 public override string Text {
1306 get { return base.Text; }
1307 set { base.Text = value; }
1311 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1312 public DataGridViewHeaderCell TopLeftHeaderCell {
1314 if (topLeftHeaderCell == null) {
1315 topLeftHeaderCell = new DataGridViewTopLeftHeaderCell ();
1316 topLeftHeaderCell.SetDataGridView (this);
1318 return topLeftHeaderCell;
1321 if (topLeftHeaderCell == value)
1324 if (topLeftHeaderCell != null)
1325 topLeftHeaderCell.SetDataGridView (null);
1327 topLeftHeaderCell = value;
1329 if (topLeftHeaderCell != null)
1330 topLeftHeaderCell.SetDataGridView (this);
1335 [EditorBrowsable (EditorBrowsableState.Advanced)]
1336 public Cursor UserSetCursor {
1337 get { return userSetCursor; }
1341 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1342 public int VerticalScrollingOffset {
1343 get { return verticalScrollingOffset; }
1346 [MonoTODO ("VirtualMode is not supported.")]
1347 [EditorBrowsable (EditorBrowsableState.Advanced)]
1348 [DefaultValue (false)]
1349 public bool VirtualMode {
1350 get { return virtualMode; }
1351 set { virtualMode = value; }
1354 internal Control EditingControlInternal {
1356 return editingControl;
1359 if (value == editingControl)
1362 if (editingControl != null) {
1363 // Can't use Controls.Remove (editingControls), because that method
1364 // is overriden to not remove the editing control.
1365 DataGridView.DataGridViewControlCollection ctrls = Controls as DataGridView.DataGridViewControlCollection;
1366 if (ctrls != null) {
1367 ctrls.RemoveInternal (editingControl);
1369 Controls.Remove (editingControl);
1371 editingControl.Dispose();
1375 if (value != null) {
1376 value.Visible = false;
1377 Controls.Add (value);
1380 editingControl = value;
1384 static object AllowUserToAddRowsChangedEvent = new object ();
1385 static object AllowUserToDeleteRowsChangedEvent = new object ();
1386 static object AllowUserToOrderColumnsChangedEvent = new object ();
1387 static object AllowUserToResizeColumnsChangedEvent = new object ();
1388 static object AllowUserToResizeRowsChangedEvent = new object ();
1389 static object AlternatingRowsDefaultCellStyleChangedEvent = new object ();
1390 static object AutoGenerateColumnsChangedEvent = new object ();
1391 static object AutoSizeColumnModeChangedEvent = new object ();
1392 static object AutoSizeColumnsModeChangedEvent = new object ();
1393 static object AutoSizeRowsModeChangedEvent = new object ();
1394 static object BackgroundColorChangedEvent = new object ();
1395 static object BorderStyleChangedEvent = new object ();
1396 static object CancelRowEditEvent = new object ();
1397 static object CellBeginEditEvent = new object ();
1398 static object CellBorderStyleChangedEvent = new object ();
1399 static object CellClickEvent = new object ();
1400 static object CellContentClickEvent = new object ();
1401 static object CellContentDoubleClickEvent = new object ();
1402 static object CellContextMenuStripChangedEvent = new object ();
1403 static object CellContextMenuStripNeededEvent = new object ();
1404 static object CellDoubleClickEvent = new object ();
1405 static object CellEndEditEvent = new object ();
1406 static object CellEnterEvent = new object ();
1407 static object CellErrorTextChangedEvent = new object ();
1408 static object CellErrorTextNeededEvent = new object ();
1409 static object CellFormattingEvent = new object ();
1410 static object CellLeaveEvent = new object ();
1411 static object CellMouseClickEvent = new object ();
1412 static object CellMouseDoubleClickEvent = new object ();
1413 static object CellMouseDownEvent = new object ();
1414 static object CellMouseEnterEvent = new object ();
1415 static object CellMouseLeaveEvent = new object ();
1416 static object CellMouseMoveEvent = new object ();
1417 static object CellMouseUpEvent = new object ();
1418 static object CellPaintingEvent = new object ();
1419 static object CellParsingEvent = new object ();
1420 static object CellStateChangedEvent = new object ();
1421 static object CellStyleChangedEvent = new object ();
1422 static object CellStyleContentChangedEvent = new object ();
1423 static object CellToolTipTextChangedEvent = new object ();
1424 static object CellToolTipTextNeededEvent = new object ();
1425 static object CellValidatedEvent = new object ();
1426 static object CellValidatingEvent = new object ();
1427 static object CellValueChangedEvent = new object ();
1428 static object CellValueNeededEvent = new object ();
1429 static object CellValuePushedEvent = new object ();
1430 static object ColumnAddedEvent = new object ();
1431 static object ColumnContextMenuStripChangedEvent = new object ();
1432 static object ColumnDataPropertyNameChangedEvent = new object ();
1433 static object ColumnDefaultCellStyleChangedEvent = new object ();
1434 static object ColumnDisplayIndexChangedEvent = new object ();
1435 static object ColumnDividerDoubleClickEvent = new object ();
1436 static object ColumnDividerWidthChangedEvent = new object ();
1437 static object ColumnHeaderCellChangedEvent = new object ();
1438 static object ColumnHeaderMouseClickEvent = new object ();
1439 static object ColumnHeaderMouseDoubleClickEvent = new object ();
1440 static object ColumnHeadersBorderStyleChangedEvent = new object ();
1441 static object ColumnHeadersDefaultCellStyleChangedEvent = new object ();
1442 static object ColumnHeadersHeightChangedEvent = new object ();
1443 static object ColumnHeadersHeightSizeModeChangedEvent = new object ();
1444 static object ColumnMinimumWidthChangedEvent = new object ();
1445 static object ColumnNameChangedEvent = new object ();
1446 static object ColumnRemovedEvent = new object ();
1447 static object ColumnSortModeChangedEvent = new object ();
1448 static object ColumnStateChangedEvent = new object ();
1449 static object ColumnToolTipTextChangedEvent = new object ();
1450 static object ColumnWidthChangedEvent = new object ();
1451 static object CurrentCellChangedEvent = new object ();
1452 static object CurrentCellDirtyStateChangedEvent = new object ();
1453 static object DataBindingCompleteEvent = new object ();
1454 static object DataErrorEvent = new object ();
1455 static object DataMemberChangedEvent = new object ();
1456 static object DataSourceChangedEvent = new object ();
1457 static object DefaultCellStyleChangedEvent = new object ();
1458 static object DefaultValuesNeededEvent = new object ();
1459 static object EditingControlShowingEvent = new object ();
1460 static object EditModeChangedEvent = new object ();
1461 static object GridColorChangedEvent = new object ();
1462 static object MultiSelectChangedEvent = new object ();
1463 static object NewRowNeededEvent = new object ();
1464 static object ReadOnlyChangedEvent = new object ();
1465 static object RowContextMenuStripChangedEvent = new object ();
1466 static object RowContextMenuStripNeededEvent = new object ();
1467 static object RowDefaultCellStyleChangedEvent = new object ();
1468 static object RowDirtyStateNeededEvent = new object ();
1469 static object RowDividerDoubleClickEvent = new object ();
1470 static object RowDividerHeightChangedEvent = new object ();
1471 static object RowEnterEvent = new object ();
1472 static object RowErrorTextChangedEvent = new object ();
1473 static object RowErrorTextNeededEvent = new object ();
1474 static object RowHeaderCellChangedEvent = new object ();
1475 static object RowHeaderMouseClickEvent = new object ();
1476 static object RowHeaderMouseDoubleClickEvent = new object ();
1477 static object RowHeadersBorderStyleChangedEvent = new object ();
1478 static object RowHeadersDefaultCellStyleChangedEvent = new object ();
1479 static object RowHeadersWidthChangedEvent = new object ();
1480 static object RowHeadersWidthSizeModeChangedEvent = new object ();
1481 static object RowHeightChangedEvent = new object ();
1482 static object RowHeightInfoNeededEvent = new object ();
1483 static object RowHeightInfoPushedEvent = new object ();
1484 static object RowLeaveEvent = new object ();
1485 static object RowMinimumHeightChangedEvent = new object ();
1486 static object RowPostPaintEvent = new object ();
1487 static object RowPrePaintEvent = new object ();
1488 static object RowsAddedEvent = new object ();
1489 static object RowsDefaultCellStyleChangedEvent = new object ();
1490 static object RowsRemovedEvent = new object ();
1491 static object RowStateChangedEvent = new object ();
1492 static object RowUnsharedEvent = new object ();
1493 static object RowValidatedEvent = new object ();
1494 static object RowValidatingEvent = new object ();
1495 static object ScrollEvent = new object ();
1496 static object SelectionChangedEvent = new object ();
1497 static object SortCompareEvent = new object ();
1498 static object SortedEvent = new object ();
1499 static object UserAddedRowEvent = new object ();
1500 static object UserDeletedRowEvent = new object ();
1501 static object UserDeletingRowEvent = new object ();
1506 public event EventHandler AllowUserToAddRowsChanged {
1507 add { Events.AddHandler (AllowUserToAddRowsChangedEvent, value); }
1508 remove { Events.RemoveHandler (AllowUserToAddRowsChangedEvent, value); }
1511 public event EventHandler AllowUserToDeleteRowsChanged {
1512 add { Events.AddHandler (AllowUserToDeleteRowsChangedEvent, value); }
1513 remove { Events.RemoveHandler (AllowUserToDeleteRowsChangedEvent, value); }
1516 public event EventHandler AllowUserToOrderColumnsChanged {
1517 add { Events.AddHandler (AllowUserToOrderColumnsChangedEvent, value); }
1518 remove { Events.RemoveHandler (AllowUserToOrderColumnsChangedEvent, value); }
1521 public event EventHandler AllowUserToResizeColumnsChanged {
1522 add { Events.AddHandler (AllowUserToResizeColumnsChangedEvent, value); }
1523 remove { Events.RemoveHandler (AllowUserToResizeColumnsChangedEvent, value); }
1526 public event EventHandler AllowUserToResizeRowsChanged {
1527 add { Events.AddHandler (AllowUserToResizeRowsChangedEvent, value); }
1528 remove { Events.RemoveHandler (AllowUserToResizeRowsChangedEvent, value); }
1531 public event EventHandler AlternatingRowsDefaultCellStyleChanged {
1532 add { Events.AddHandler (AlternatingRowsDefaultCellStyleChangedEvent, value); }
1533 remove { Events.RemoveHandler (AlternatingRowsDefaultCellStyleChangedEvent, value); }
1537 [EditorBrowsable (EditorBrowsableState.Advanced)]
1538 public event EventHandler AutoGenerateColumnsChanged {
1539 add { Events.AddHandler (AutoGenerateColumnsChangedEvent, value); }
1540 remove { Events.RemoveHandler (AutoGenerateColumnsChangedEvent, value); }
1543 public event DataGridViewAutoSizeColumnModeEventHandler AutoSizeColumnModeChanged {
1544 add { Events.AddHandler (AutoSizeColumnModeChangedEvent, value); }
1545 remove { Events.RemoveHandler (AutoSizeColumnModeChangedEvent, value); }
1548 public event DataGridViewAutoSizeColumnsModeEventHandler AutoSizeColumnsModeChanged {
1549 add { Events.AddHandler (AutoSizeColumnsModeChangedEvent, value); }
1550 remove { Events.RemoveHandler (AutoSizeColumnsModeChangedEvent, value); }
1553 public event DataGridViewAutoSizeModeEventHandler AutoSizeRowsModeChanged {
1554 add { Events.AddHandler (AutoSizeRowsModeChangedEvent, value); }
1555 remove { Events.RemoveHandler (AutoSizeRowsModeChangedEvent, value); }
1559 [EditorBrowsable (EditorBrowsableState.Never)]
1560 public new event EventHandler BackColorChanged {
1561 add { base.BackColorChanged += value; }
1562 remove { base.BackColorChanged -= value; }
1565 public event EventHandler BackgroundColorChanged {
1566 add { Events.AddHandler (BackgroundColorChangedEvent, value); }
1567 remove { Events.RemoveHandler (BackgroundColorChangedEvent, value); }
1571 [EditorBrowsable (EditorBrowsableState.Never)]
1572 public new event EventHandler BackgroundImageChanged {
1573 add { base.BackgroundImageChanged += value; }
1574 remove { base.BackgroundImageChanged -= value; }
1578 [EditorBrowsable (EditorBrowsableState.Never)]
1579 public new event EventHandler BackgroundImageLayoutChanged {
1580 add { base.BackgroundImageLayoutChanged += value; }
1581 remove { base.BackgroundImageLayoutChanged -= value; }
1584 public event EventHandler BorderStyleChanged {
1585 add { Events.AddHandler (BorderStyleChangedEvent, value); }
1586 remove { Events.RemoveHandler (BorderStyleChangedEvent, value); }
1589 public event QuestionEventHandler CancelRowEdit {
1590 add { Events.AddHandler (CancelRowEditEvent, value); }
1591 remove { Events.RemoveHandler (CancelRowEditEvent, value); }
1594 public event DataGridViewCellCancelEventHandler CellBeginEdit {
1595 add { Events.AddHandler (CellBeginEditEvent, value); }
1596 remove { Events.RemoveHandler (CellBeginEditEvent, value); }
1599 public event EventHandler CellBorderStyleChanged {
1600 add { Events.AddHandler (CellBorderStyleChangedEvent, value); }
1601 remove { Events.RemoveHandler (CellBorderStyleChangedEvent, value); }
1604 public event DataGridViewCellEventHandler CellClick {
1605 add { Events.AddHandler (CellClickEvent, value); }
1606 remove { Events.RemoveHandler (CellClickEvent, value); }
1609 public event DataGridViewCellEventHandler CellContentClick {
1610 add { Events.AddHandler (CellContentClickEvent, value); }
1611 remove { Events.RemoveHandler (CellContentClickEvent, value); }
1614 public event DataGridViewCellEventHandler CellContentDoubleClick {
1615 add { Events.AddHandler (CellContentDoubleClickEvent, value); }
1616 remove { Events.RemoveHandler (CellContentDoubleClickEvent, value); }
1619 [EditorBrowsable (EditorBrowsableState.Advanced)]
1620 public event DataGridViewCellEventHandler CellContextMenuStripChanged {
1621 add { Events.AddHandler (CellContextMenuStripChangedEvent, value); }
1622 remove { Events.RemoveHandler (CellContextMenuStripChangedEvent, value); }
1625 [EditorBrowsable (EditorBrowsableState.Advanced)]
1626 public event DataGridViewCellContextMenuStripNeededEventHandler CellContextMenuStripNeeded {
1627 add { Events.AddHandler (CellContextMenuStripNeededEvent, value); }
1628 remove { Events.RemoveHandler (CellContextMenuStripNeededEvent, value); }
1631 public event DataGridViewCellEventHandler CellDoubleClick {
1632 add { Events.AddHandler (CellDoubleClickEvent, value); }
1633 remove { Events.RemoveHandler (CellDoubleClickEvent, value); }
1636 public event DataGridViewCellEventHandler CellEndEdit {
1637 add { Events.AddHandler (CellEndEditEvent, value); }
1638 remove { Events.RemoveHandler (CellEndEditEvent, value); }
1641 public event DataGridViewCellEventHandler CellEnter {
1642 add { Events.AddHandler (CellEnterEvent, value); }
1643 remove { Events.RemoveHandler (CellEnterEvent, value); }
1646 public event DataGridViewCellEventHandler CellErrorTextChanged {
1647 add { Events.AddHandler (CellErrorTextChangedEvent, value); }
1648 remove { Events.RemoveHandler (CellErrorTextChangedEvent, value); }
1651 [EditorBrowsable (EditorBrowsableState.Advanced)]
1652 public event DataGridViewCellErrorTextNeededEventHandler CellErrorTextNeeded {
1653 add { Events.AddHandler (CellErrorTextNeededEvent, value); }
1654 remove { Events.RemoveHandler (CellErrorTextNeededEvent, value); }
1657 public event DataGridViewCellFormattingEventHandler CellFormatting {
1658 add { Events.AddHandler (CellFormattingEvent, value); }
1659 remove { Events.RemoveHandler (CellFormattingEvent, value); }
1662 public event DataGridViewCellEventHandler CellLeave {
1663 add { Events.AddHandler (CellLeaveEvent, value); }
1664 remove { Events.RemoveHandler (CellLeaveEvent, value); }
1667 public event DataGridViewCellMouseEventHandler CellMouseClick {
1668 add { Events.AddHandler (CellMouseClickEvent, value); }
1669 remove { Events.RemoveHandler (CellMouseClickEvent, value); }
1672 public event DataGridViewCellMouseEventHandler CellMouseDoubleClick {
1673 add { Events.AddHandler (CellMouseDoubleClickEvent, value); }
1674 remove { Events.RemoveHandler (CellMouseDoubleClickEvent, value); }
1677 public event DataGridViewCellMouseEventHandler CellMouseDown {
1678 add { Events.AddHandler (CellMouseDownEvent, value); }
1679 remove { Events.RemoveHandler (CellMouseDownEvent, value); }
1682 public event DataGridViewCellEventHandler CellMouseEnter {
1683 add { Events.AddHandler (CellMouseEnterEvent, value); }
1684 remove { Events.RemoveHandler (CellMouseEnterEvent, value); }
1687 public event DataGridViewCellEventHandler CellMouseLeave {
1688 add { Events.AddHandler (CellMouseLeaveEvent, value); }
1689 remove { Events.RemoveHandler (CellMouseLeaveEvent, value); }
1692 public event DataGridViewCellMouseEventHandler CellMouseMove {
1693 add { Events.AddHandler (CellMouseMoveEvent, value); }
1694 remove { Events.RemoveHandler (CellMouseMoveEvent, value); }
1697 public event DataGridViewCellMouseEventHandler CellMouseUp {
1698 add { Events.AddHandler (CellMouseUpEvent, value); }
1699 remove { Events.RemoveHandler (CellMouseUpEvent, value); }
1702 public event DataGridViewCellPaintingEventHandler CellPainting {
1703 add { Events.AddHandler (CellPaintingEvent, value); }
1704 remove { Events.RemoveHandler (CellPaintingEvent, value); }
1707 public event DataGridViewCellParsingEventHandler CellParsing {
1708 add { Events.AddHandler (CellParsingEvent, value); }
1709 remove { Events.RemoveHandler (CellParsingEvent, value); }
1712 public event DataGridViewCellStateChangedEventHandler CellStateChanged {
1713 add { Events.AddHandler (CellStateChangedEvent, value); }
1714 remove { Events.RemoveHandler (CellStateChangedEvent, value); }
1717 public event DataGridViewCellEventHandler CellStyleChanged {
1718 add { Events.AddHandler (CellStyleChangedEvent, value); }
1719 remove { Events.RemoveHandler (CellStyleChangedEvent, value); }
1722 public event DataGridViewCellStyleContentChangedEventHandler CellStyleContentChanged {
1723 add { Events.AddHandler (CellStyleContentChangedEvent, value); }
1724 remove { Events.RemoveHandler (CellStyleContentChangedEvent, value); }
1727 public event DataGridViewCellEventHandler CellToolTipTextChanged {
1728 add { Events.AddHandler (CellToolTipTextChangedEvent, value); }
1729 remove { Events.RemoveHandler (CellToolTipTextChangedEvent, value); }
1732 [EditorBrowsable (EditorBrowsableState.Advanced)]
1733 public event DataGridViewCellToolTipTextNeededEventHandler CellToolTipTextNeeded {
1734 add { Events.AddHandler (CellToolTipTextNeededEvent, value); }
1735 remove { Events.RemoveHandler (CellToolTipTextNeededEvent, value); }
1738 public event DataGridViewCellEventHandler CellValidated {
1739 add { Events.AddHandler (CellValidatedEvent, value); }
1740 remove { Events.RemoveHandler (CellValidatedEvent, value); }
1743 public event DataGridViewCellValidatingEventHandler CellValidating {
1744 add { Events.AddHandler (CellValidatingEvent, value); }
1745 remove { Events.RemoveHandler (CellValidatingEvent, value); }
1748 public event DataGridViewCellEventHandler CellValueChanged {
1749 add { Events.AddHandler (CellValueChangedEvent, value); }
1750 remove { Events.RemoveHandler (CellValueChangedEvent, value); }
1753 [EditorBrowsable (EditorBrowsableState.Advanced)]
1754 public event DataGridViewCellValueEventHandler CellValueNeeded {
1755 add { Events.AddHandler (CellValueNeededEvent, value); }
1756 remove { Events.RemoveHandler (CellValueNeededEvent, value); }
1759 [EditorBrowsable (EditorBrowsableState.Advanced)]
1760 public event DataGridViewCellValueEventHandler CellValuePushed {
1761 add { Events.AddHandler (CellValuePushedEvent, value); }
1762 remove { Events.RemoveHandler (CellValuePushedEvent, value); }
1765 public event DataGridViewColumnEventHandler ColumnAdded {
1766 add { Events.AddHandler (ColumnAddedEvent, value); }
1767 remove { Events.RemoveHandler (ColumnAddedEvent, value); }
1770 public event DataGridViewColumnEventHandler ColumnContextMenuStripChanged {
1771 add { Events.AddHandler (ColumnContextMenuStripChangedEvent, value); }
1772 remove { Events.RemoveHandler (ColumnContextMenuStripChangedEvent, value); }
1775 public event DataGridViewColumnEventHandler ColumnDataPropertyNameChanged {
1776 add { Events.AddHandler (ColumnDataPropertyNameChangedEvent, value); }
1777 remove { Events.RemoveHandler (ColumnDataPropertyNameChangedEvent, value); }
1780 public event DataGridViewColumnEventHandler ColumnDefaultCellStyleChanged {
1781 add { Events.AddHandler (ColumnDefaultCellStyleChangedEvent, value); }
1782 remove { Events.RemoveHandler (ColumnDefaultCellStyleChangedEvent, value); }
1785 public event DataGridViewColumnEventHandler ColumnDisplayIndexChanged {
1786 add { Events.AddHandler (ColumnDisplayIndexChangedEvent, value); }
1787 remove { Events.RemoveHandler (ColumnDisplayIndexChangedEvent, value); }
1790 public event DataGridViewColumnDividerDoubleClickEventHandler ColumnDividerDoubleClick {
1791 add { Events.AddHandler (ColumnDividerDoubleClickEvent, value); }
1792 remove { Events.RemoveHandler (ColumnDividerDoubleClickEvent, value); }
1795 public event DataGridViewColumnEventHandler ColumnDividerWidthChanged {
1796 add { Events.AddHandler (ColumnDividerWidthChangedEvent, value); }
1797 remove { Events.RemoveHandler (ColumnDividerWidthChangedEvent, value); }
1800 public event DataGridViewColumnEventHandler ColumnHeaderCellChanged {
1801 add { Events.AddHandler (ColumnHeaderCellChangedEvent, value); }
1802 remove { Events.RemoveHandler (ColumnHeaderCellChangedEvent, value); }
1805 public event DataGridViewCellMouseEventHandler ColumnHeaderMouseClick {
1806 add { Events.AddHandler (ColumnHeaderMouseClickEvent, value); }
1807 remove { Events.RemoveHandler (ColumnHeaderMouseClickEvent, value); }
1810 public event DataGridViewCellMouseEventHandler ColumnHeaderMouseDoubleClick {
1811 add { Events.AddHandler (ColumnHeaderMouseDoubleClickEvent, value); }
1812 remove { Events.RemoveHandler (ColumnHeaderMouseDoubleClickEvent, value); }
1815 public event EventHandler ColumnHeadersBorderStyleChanged {
1816 add { Events.AddHandler (ColumnHeadersBorderStyleChangedEvent, value); }
1817 remove { Events.RemoveHandler (ColumnHeadersBorderStyleChangedEvent, value); }
1820 public event EventHandler ColumnHeadersDefaultCellStyleChanged {
1821 add { Events.AddHandler (ColumnHeadersDefaultCellStyleChangedEvent, value); }
1822 remove { Events.RemoveHandler (ColumnHeadersDefaultCellStyleChangedEvent, value); }
1825 public event EventHandler ColumnHeadersHeightChanged {
1826 add { Events.AddHandler (ColumnHeadersHeightChangedEvent, value); }
1827 remove { Events.RemoveHandler (ColumnHeadersHeightChangedEvent, value); }
1830 public event DataGridViewAutoSizeModeEventHandler ColumnHeadersHeightSizeModeChanged {
1831 add { Events.AddHandler (ColumnHeadersHeightSizeModeChangedEvent, value); }
1832 remove { Events.RemoveHandler (ColumnHeadersHeightSizeModeChangedEvent, value); }
1835 public event DataGridViewColumnEventHandler ColumnMinimumWidthChanged {
1836 add { Events.AddHandler (ColumnMinimumWidthChangedEvent, value); }
1837 remove { Events.RemoveHandler (ColumnMinimumWidthChangedEvent, value); }
1840 public event DataGridViewColumnEventHandler ColumnNameChanged {
1841 add { Events.AddHandler (ColumnNameChangedEvent, value); }
1842 remove { Events.RemoveHandler (ColumnNameChangedEvent, value); }
1845 public event DataGridViewColumnEventHandler ColumnRemoved {
1846 add { Events.AddHandler (ColumnRemovedEvent, value); }
1847 remove { Events.RemoveHandler (ColumnRemovedEvent, value); }
1850 public event DataGridViewColumnEventHandler ColumnSortModeChanged {
1851 add { Events.AddHandler (ColumnSortModeChangedEvent, value); }
1852 remove { Events.RemoveHandler (ColumnSortModeChangedEvent, value); }
1855 public event DataGridViewColumnStateChangedEventHandler ColumnStateChanged {
1856 add { Events.AddHandler (ColumnStateChangedEvent, value); }
1857 remove { Events.RemoveHandler (ColumnStateChangedEvent, value); }
1860 public event DataGridViewColumnEventHandler ColumnToolTipTextChanged {
1861 add { Events.AddHandler (ColumnToolTipTextChangedEvent, value); }
1862 remove { Events.RemoveHandler (ColumnToolTipTextChangedEvent, value); }
1865 public event DataGridViewColumnEventHandler ColumnWidthChanged {
1866 add { Events.AddHandler (ColumnWidthChangedEvent, value); }
1867 remove { Events.RemoveHandler (ColumnWidthChangedEvent, value); }
1870 public event EventHandler CurrentCellChanged {
1871 add { Events.AddHandler (CurrentCellChangedEvent, value); }
1872 remove { Events.RemoveHandler (CurrentCellChangedEvent, value); }
1875 [EditorBrowsable (EditorBrowsableState.Advanced)]
1876 public event EventHandler CurrentCellDirtyStateChanged {
1877 add { Events.AddHandler (CurrentCellDirtyStateChangedEvent, value); }
1878 remove { Events.RemoveHandler (CurrentCellDirtyStateChangedEvent, value); }
1881 public event DataGridViewBindingCompleteEventHandler DataBindingComplete {
1882 add { Events.AddHandler (DataBindingCompleteEvent, value); }
1883 remove { Events.RemoveHandler (DataBindingCompleteEvent, value); }
1886 public event DataGridViewDataErrorEventHandler DataError {
1887 add { Events.AddHandler (DataErrorEvent, value); }
1888 remove { Events.RemoveHandler (DataErrorEvent, value); }
1891 public event EventHandler DataMemberChanged {
1892 add { Events.AddHandler (DataMemberChangedEvent, value); }
1893 remove { Events.RemoveHandler (DataMemberChangedEvent, value); }
1896 public event EventHandler DataSourceChanged {
1897 add { Events.AddHandler (DataSourceChangedEvent, value); }
1898 remove { Events.RemoveHandler (DataSourceChangedEvent, value); }
1901 public event EventHandler DefaultCellStyleChanged {
1902 add { Events.AddHandler (DefaultCellStyleChangedEvent, value); }
1903 remove { Events.RemoveHandler (DefaultCellStyleChangedEvent, value); }
1906 [EditorBrowsable (EditorBrowsableState.Advanced)]
1907 public event DataGridViewRowEventHandler DefaultValuesNeeded {
1908 add { Events.AddHandler (DefaultValuesNeededEvent, value); }
1909 remove { Events.RemoveHandler (DefaultValuesNeededEvent, value); }
1912 public event DataGridViewEditingControlShowingEventHandler EditingControlShowing {
1913 add { Events.AddHandler (EditingControlShowingEvent, value); }
1914 remove { Events.RemoveHandler (EditingControlShowingEvent, value); }
1917 public event EventHandler EditModeChanged {
1918 add { Events.AddHandler (EditModeChangedEvent, value); }
1919 remove { Events.RemoveHandler (EditModeChangedEvent, value); }
1923 [EditorBrowsable (EditorBrowsableState.Advanced)]
1924 public new event EventHandler FontChanged {
1925 add { base.FontChanged += value; }
1926 remove { base.FontChanged -= value; }
1930 [EditorBrowsable (EditorBrowsableState.Advanced)]
1931 public new event EventHandler ForeColorChanged {
1932 add { base.ForeColorChanged += value; }
1933 remove { base.ForeColorChanged -= value; }
1937 [EditorBrowsable (EditorBrowsableState.Never)]
1938 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1939 public new event EventHandler PaddingChanged {
1940 add { base.PaddingChanged += value; }
1941 remove { base.PaddingChanged -= value; }
1944 public event EventHandler GridColorChanged {
1945 add { Events.AddHandler (GridColorChangedEvent, value); }
1946 remove { Events.RemoveHandler (GridColorChangedEvent, value); }
1949 public event EventHandler MultiSelectChanged {
1950 add { Events.AddHandler (MultiSelectChangedEvent, value); }
1951 remove { Events.RemoveHandler (MultiSelectChangedEvent, value); }
1954 public event DataGridViewRowEventHandler NewRowNeeded {
1955 add { Events.AddHandler (NewRowNeededEvent, value); }
1956 remove { Events.RemoveHandler (NewRowNeededEvent, value); }
1959 public event EventHandler ReadOnlyChanged {
1960 add { Events.AddHandler (ReadOnlyChangedEvent, value); }
1961 remove { Events.RemoveHandler (ReadOnlyChangedEvent, value); }
1964 public event DataGridViewRowEventHandler RowContextMenuStripChanged {
1965 add { Events.AddHandler (RowContextMenuStripChangedEvent, value); }
1966 remove { Events.RemoveHandler (RowContextMenuStripChangedEvent, value); }
1969 [EditorBrowsable (EditorBrowsableState.Advanced)]
1970 public event DataGridViewRowContextMenuStripNeededEventHandler RowContextMenuStripNeeded {
1971 add { Events.AddHandler (RowContextMenuStripNeededEvent, value); }
1972 remove { Events.RemoveHandler (RowContextMenuStripNeededEvent, value); }
1975 public event DataGridViewRowEventHandler RowDefaultCellStyleChanged {
1976 add { Events.AddHandler (RowDefaultCellStyleChangedEvent, value); }
1977 remove { Events.RemoveHandler (RowDefaultCellStyleChangedEvent, value); }
1980 [EditorBrowsable (EditorBrowsableState.Advanced)]
1981 public event QuestionEventHandler RowDirtyStateNeeded {
1982 add { Events.AddHandler (RowDirtyStateNeededEvent, value); }
1983 remove { Events.RemoveHandler (RowDirtyStateNeededEvent, value); }
1986 public event DataGridViewRowDividerDoubleClickEventHandler RowDividerDoubleClick {
1987 add { Events.AddHandler (RowDividerDoubleClickEvent, value); }
1988 remove { Events.RemoveHandler (RowDividerDoubleClickEvent, value); }
1991 public event DataGridViewRowEventHandler RowDividerHeightChanged {
1992 add { Events.AddHandler (RowDividerHeightChangedEvent, value); }
1993 remove { Events.RemoveHandler (RowDividerHeightChangedEvent, value); }
1996 public event DataGridViewCellEventHandler RowEnter {
1997 add { Events.AddHandler (RowEnterEvent, value); }
1998 remove { Events.RemoveHandler (RowEnterEvent, value); }
2001 public event DataGridViewRowEventHandler RowErrorTextChanged {
2002 add { Events.AddHandler (RowErrorTextChangedEvent, value); }
2003 remove { Events.RemoveHandler (RowErrorTextChangedEvent, value); }
2006 [EditorBrowsable (EditorBrowsableState.Advanced)]
2007 public event DataGridViewRowErrorTextNeededEventHandler RowErrorTextNeeded {
2008 add { Events.AddHandler (RowErrorTextNeededEvent, value); }
2009 remove { Events.RemoveHandler (RowErrorTextNeededEvent, value); }
2012 public event DataGridViewRowEventHandler RowHeaderCellChanged {
2013 add { Events.AddHandler (RowHeaderCellChangedEvent, value); }
2014 remove { Events.RemoveHandler (RowHeaderCellChangedEvent, value); }
2017 public event DataGridViewCellMouseEventHandler RowHeaderMouseClick {
2018 add { Events.AddHandler (RowHeaderMouseClickEvent, value); }
2019 remove { Events.RemoveHandler (RowHeaderMouseClickEvent, value); }
2022 public event DataGridViewCellMouseEventHandler RowHeaderMouseDoubleClick {
2023 add { Events.AddHandler (RowHeaderMouseDoubleClickEvent, value); }
2024 remove { Events.RemoveHandler (RowHeaderMouseDoubleClickEvent, value); }
2027 public event EventHandler RowHeadersBorderStyleChanged {
2028 add { Events.AddHandler (RowHeadersBorderStyleChangedEvent, value); }
2029 remove { Events.RemoveHandler (RowHeadersBorderStyleChangedEvent, value); }
2032 public event EventHandler RowHeadersDefaultCellStyleChanged {
2033 add { Events.AddHandler (RowHeadersDefaultCellStyleChangedEvent, value); }
2034 remove { Events.RemoveHandler (RowHeadersDefaultCellStyleChangedEvent, value); }
2037 public event EventHandler RowHeadersWidthChanged {
2038 add { Events.AddHandler (RowHeadersWidthChangedEvent, value); }
2039 remove { Events.RemoveHandler (RowHeadersWidthChangedEvent, value); }
2042 public event DataGridViewAutoSizeModeEventHandler RowHeadersWidthSizeModeChanged {
2043 add { Events.AddHandler (RowHeadersWidthSizeModeChangedEvent, value); }
2044 remove { Events.RemoveHandler (RowHeadersWidthSizeModeChangedEvent, value); }
2047 public event DataGridViewRowEventHandler RowHeightChanged {
2048 add { Events.AddHandler (RowHeightChangedEvent, value); }
2049 remove { Events.RemoveHandler (RowHeightChangedEvent, value); }
2052 [EditorBrowsable (EditorBrowsableState.Advanced)]
2053 public event DataGridViewRowHeightInfoNeededEventHandler RowHeightInfoNeeded {
2054 add { Events.AddHandler (RowHeightInfoNeededEvent, value); }
2055 remove { Events.RemoveHandler (RowHeightInfoNeededEvent, value); }
2058 [EditorBrowsable (EditorBrowsableState.Advanced)]
2059 public event DataGridViewRowHeightInfoPushedEventHandler RowHeightInfoPushed {
2060 add { Events.AddHandler (RowHeightInfoPushedEvent, value); }
2061 remove { Events.RemoveHandler (RowHeightInfoPushedEvent, value); }
2064 public event DataGridViewCellEventHandler RowLeave {
2065 add { Events.AddHandler (RowLeaveEvent, value); }
2066 remove { Events.RemoveHandler (RowLeaveEvent, value); }
2069 public event DataGridViewRowEventHandler RowMinimumHeightChanged {
2070 add { Events.AddHandler (RowMinimumHeightChangedEvent, value); }
2071 remove { Events.RemoveHandler (RowMinimumHeightChangedEvent, value); }
2074 public event DataGridViewRowPostPaintEventHandler RowPostPaint {
2075 add { Events.AddHandler (RowPostPaintEvent, value); }
2076 remove { Events.RemoveHandler (RowPostPaintEvent, value); }
2079 public event DataGridViewRowPrePaintEventHandler RowPrePaint {
2080 add { Events.AddHandler (RowPrePaintEvent, value); }
2081 remove { Events.RemoveHandler (RowPrePaintEvent, value); }
2084 public event DataGridViewRowsAddedEventHandler RowsAdded {
2085 add { Events.AddHandler (RowsAddedEvent, value); }
2086 remove { Events.RemoveHandler (RowsAddedEvent, value); }
2089 public event EventHandler RowsDefaultCellStyleChanged {
2090 add { Events.AddHandler (RowsDefaultCellStyleChangedEvent, value); }
2091 remove { Events.RemoveHandler (RowsDefaultCellStyleChangedEvent, value); }
2094 public event DataGridViewRowsRemovedEventHandler RowsRemoved {
2095 add { Events.AddHandler (RowsRemovedEvent, value); }
2096 remove { Events.RemoveHandler (RowsRemovedEvent, value); }
2099 public event DataGridViewRowStateChangedEventHandler RowStateChanged {
2100 add { Events.AddHandler (RowStateChangedEvent, value); }
2101 remove { Events.RemoveHandler (RowStateChangedEvent, value); }
2104 [EditorBrowsable (EditorBrowsableState.Advanced)]
2105 public event DataGridViewRowEventHandler RowUnshared {
2106 add { Events.AddHandler (RowUnsharedEvent, value); }
2107 remove { Events.RemoveHandler (RowUnsharedEvent, value); }
2110 public event DataGridViewCellEventHandler RowValidated {
2111 add { Events.AddHandler (RowValidatedEvent, value); }
2112 remove { Events.RemoveHandler (RowValidatedEvent, value); }
2115 public event DataGridViewCellCancelEventHandler RowValidating {
2116 add { Events.AddHandler (RowValidatingEvent, value); }
2117 remove { Events.RemoveHandler (RowValidatingEvent, value); }
2120 public event ScrollEventHandler Scroll {
2121 add { Events.AddHandler (ScrollEvent, value); }
2122 remove { Events.RemoveHandler (ScrollEvent, value); }
2125 public event EventHandler SelectionChanged {
2126 add { Events.AddHandler (SelectionChangedEvent, value); }
2127 remove { Events.RemoveHandler (SelectionChangedEvent, value); }
2130 [EditorBrowsable (EditorBrowsableState.Advanced)]
2131 public event DataGridViewSortCompareEventHandler SortCompare {
2132 add { Events.AddHandler (SortCompareEvent, value); }
2133 remove { Events.RemoveHandler (SortCompareEvent, value); }
2136 public event EventHandler Sorted {
2137 add { Events.AddHandler (SortedEvent, value); }
2138 remove { Events.RemoveHandler (SortedEvent, value); }
2141 public event DataGridViewRowEventHandler UserAddedRow {
2142 add { Events.AddHandler (UserAddedRowEvent, value); }
2143 remove { Events.RemoveHandler (UserAddedRowEvent, value); }
2146 public event DataGridViewRowEventHandler UserDeletedRow {
2147 add { Events.AddHandler (UserDeletedRowEvent, value); }
2148 remove { Events.RemoveHandler (UserDeletedRowEvent, value); }
2151 public event DataGridViewRowCancelEventHandler UserDeletingRow {
2152 add { Events.AddHandler (UserDeletingRowEvent, value); }
2153 remove { Events.RemoveHandler (UserDeletingRowEvent, value); }
2157 [EditorBrowsable (EditorBrowsableState.Never)]
2158 public new event EventHandler StyleChanged {
2159 add { base.StyleChanged += value; }
2160 remove { base.StyleChanged -= value; }
2164 [EditorBrowsable (EditorBrowsableState.Never)]
2165 public new event EventHandler TextChanged {
2166 add { base.TextChanged += value; }
2167 remove { base.TextChanged -= value; }
2170 [EditorBrowsable (EditorBrowsableState.Advanced)]
2171 public virtual DataGridViewAdvancedBorderStyle AdjustColumnHeaderBorderStyle (DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStyleInput, DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStylePlaceholder, bool isFirstDisplayedColumn, bool isLastVisibleColumn) {
2172 return (DataGridViewAdvancedBorderStyle) ((ICloneable)dataGridViewAdvancedBorderStyleInput).Clone();
2175 public bool AreAllCellsSelected (bool includeInvisibleCells) {
2176 foreach (DataGridViewRow row in rows) {
2177 foreach (DataGridViewCell cell in row.Cells) {
2178 if (includeInvisibleCells == false && cell.Visible == false) {
2181 if (!cell.Selected) {
2189 public void AutoResizeColumn (int columnIndex) {
2190 AutoResizeColumn (columnIndex, DataGridViewAutoSizeColumnMode.AllCells);
2193 public void AutoResizeColumn (int columnIndex, DataGridViewAutoSizeColumnMode autoSizeColumnMode)
2195 AutoResizeColumnInternal (columnIndex, autoSizeColumnMode);
2198 public void AutoResizeColumnHeadersHeight ()
2202 foreach (DataGridViewColumn col in Columns)
2203 new_height = Math.Max (new_height, col.HeaderCell.PreferredSize.Height);
2205 if (ColumnHeadersHeight != new_height)
2206 ColumnHeadersHeight = new_height;
2209 [MonoTODO ("columnIndex parameter is not used")]
2210 public void AutoResizeColumnHeadersHeight (int columnIndex)
2212 AutoResizeColumnHeadersHeight ();
2215 public void AutoResizeColumns () {
2216 AutoResizeColumns (DataGridViewAutoSizeColumnsMode.AllCells);
2219 public void AutoResizeColumns (DataGridViewAutoSizeColumnsMode autoSizeColumnsMode) {
2220 AutoResizeColumns (autoSizeColumnsMode, true);
2223 public void AutoResizeRow (int rowIndex)
2225 AutoResizeRow (rowIndex, DataGridViewAutoSizeRowMode.AllCells, true);
2228 public void AutoResizeRow (int rowIndex, DataGridViewAutoSizeRowMode autoSizeRowMode)
2230 AutoResizeRow (rowIndex, autoSizeRowMode, true);
2233 public void AutoResizeRowHeadersWidth (DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode)
2235 if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToFirstHeader) {
2236 RowHeadersWidth = GetRowInternal (0).HeaderCell.PreferredSize.Width;
2242 if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders) {
2243 bool anyRowsDisplayed = false;
2244 foreach(DataGridViewRow row in Rows)
2246 anyRowsDisplayed = true;
2247 new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
2250 // if there are no rows which are displayed, we still have to set new_width
2251 // to a value >= 4 as RowHeadersWidth will throw an exception otherwise
2252 if(!anyRowsDisplayed) {
2253 foreach (DataGridViewRow row in Rows)
2254 new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
2257 if (RowHeadersWidth != new_width)
2258 RowHeadersWidth = new_width;
2263 if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders) {
2264 foreach (DataGridViewRow row in Rows)
2265 new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
2267 if (RowHeadersWidth != new_width)
2268 RowHeadersWidth = new_width;
2274 [MonoTODO ("Does not use rowIndex parameter.")]
2275 public void AutoResizeRowHeadersWidth (int rowIndex, DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode)
2277 AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
2280 public void AutoResizeRows ()
2282 AutoResizeRows (0, Rows.Count, DataGridViewAutoSizeRowMode.AllCells, false);
2285 public void AutoResizeRows (DataGridViewAutoSizeRowsMode autoSizeRowsMode)
2287 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeRowsMode), autoSizeRowsMode))
2288 throw new InvalidEnumArgumentException ("Parameter autoSizeRowsMode is not a valid DataGridViewRowsMode.");
2289 if ((autoSizeRowsMode == DataGridViewAutoSizeRowsMode.AllHeaders || autoSizeRowsMode == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && rowHeadersVisible == false)
2290 throw new InvalidOperationException ("Parameter autoSizeRowsMode cannot be AllHeaders or DisplayedHeaders in this DataGridView.");
2291 if (autoSizeRowsMode == DataGridViewAutoSizeRowsMode.None)
2292 throw new ArgumentException ("Parameter autoSizeRowsMode cannot be None.");
2294 AutoResizeRows (autoSizeRowsMode, false);
2297 public virtual bool BeginEdit (bool selectAll) {
2298 if (currentCell == null || currentCell.IsInEditMode)
2301 if (currentCell.RowIndex >= 0) {
2302 if ((currentCell.InheritedState & DataGridViewElementStates.ReadOnly) == DataGridViewElementStates.ReadOnly) {
2307 DataGridViewCell cell = currentCell;
2308 Type editType = cell.EditType;
2310 if (editType == null && !(cell is IDataGridViewEditingCell))
2313 // Give user a chance to cancel the edit
2314 DataGridViewCellCancelEventArgs e = new DataGridViewCellCancelEventArgs (cell.ColumnIndex, cell.RowIndex);
2315 OnCellBeginEdit (e);
2320 cell.SetIsInEditMode (true);
2322 // The cell has an editing control we need to setup
2323 if (editType != null) {
2324 Control ctrl = EditingControlInternal;
2326 // Check if we can reuse the one we already have
2327 bool isCorrectType = ctrl != null && ctrl.GetType () == editType;
2332 // We couldn't use the existing one, create a new one
2334 ctrl = (Control) Activator.CreateInstance (editType);
2335 EditingControlInternal = ctrl;
2338 // Call some functions that allows the editing control to get setup
2339 DataGridViewCellStyle style = cell.RowIndex == -1 ? DefaultCellStyle : cell.InheritedStyle;
2340 cell.InitializeEditingControl (cell.RowIndex, cell.FormattedValue, style);
2341 OnEditingControlShowing (new DataGridViewEditingControlShowingEventArgs (EditingControlInternal, style));
2342 cell.PositionEditingControl (true, true, this.GetCellDisplayRectangle (cell.ColumnIndex, cell.RowIndex, false), bounds, style, false, false, (columns [cell.ColumnIndex].DisplayIndex == 0), (cell.RowIndex == 0));
2344 // Show the editing control
2345 if (EditingControlInternal != null)
2346 EditingControlInternal.Visible = true;
2348 IDataGridViewEditingControl dgvEditingControl = (IDataGridViewEditingControl) EditingControlInternal;
2349 if (dgvEditingControl != null) {
2350 dgvEditingControl.EditingControlDataGridView = this;
2351 dgvEditingControl.EditingControlRowIndex = currentCell.OwningRow.Index;
2352 dgvEditingControl.ApplyCellStyleToEditingControl (style);
2353 dgvEditingControl.PrepareEditingControlForEdit (selectAll);
2354 dgvEditingControl.EditingControlFormattedValue = currentCell.EditedFormattedValue;
2359 // If we are here, it means we have a cell that does not have an editing control
2360 // and simply implements IDataGridViewEditingCell itself.
2361 (cell as IDataGridViewEditingCell).PrepareEditingCellForEdit (selectAll);
2366 public bool CancelEdit ()
2368 if (currentCell != null) {
2369 if (currentCell.IsInEditMode) {
2370 currentCell.SetIsInEditMode (false);
2371 currentCell.DetachEditingControl ();
2374 if (currentCell.RowIndex == NewRowIndex) {
2375 if (DataManager != null)
2376 DataManager.CancelCurrentEdit ();
2378 new_row_editing = false;
2379 PrepareEditingRow (false, false);
2380 MoveCurrentCell (currentCell.ColumnIndex, NewRowIndex, true, false, false, true);
2381 OnUserDeletedRow (new DataGridViewRowEventArgs (EditingRow));
2388 public void ClearSelection ()
2390 foreach (DataGridViewColumn col in SelectedColumns)
2391 col.Selected = false;
2392 foreach (DataGridViewRow row in SelectedRows)
2393 row.Selected = false;
2394 foreach (DataGridViewCell cell in SelectedCells)
2395 cell.Selected = false;
2398 public bool CommitEdit (DataGridViewDataErrorContexts context)
2400 if (currentCell == null)
2405 object newValue = currentCell.ParseFormattedValue (currentCell.EditedFormattedValue,
2406 currentCell.InheritedStyle, null, null);
2408 DataGridViewCellValidatingEventArgs validateArgs = new DataGridViewCellValidatingEventArgs (currentCell.ColumnIndex,
2409 currentCell.RowIndex,
2412 OnCellValidating (validateArgs);
2413 if (validateArgs.Cancel)
2415 OnCellValidated (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
2418 currentCell.Value = newValue;
2420 } catch (Exception e) {
2421 DataGridViewDataErrorEventArgs args = new DataGridViewDataErrorEventArgs (e, currentCell.ColumnIndex, currentCell.RowIndex,
2422 DataGridViewDataErrorContexts.Commit);
2423 OnDataError (false, args);
2424 if (args.ThrowException)
2431 public int DisplayedColumnCount (bool includePartialColumns)
2436 if (RowHeadersVisible)
2437 columnLeft += RowHeadersWidth;
2439 Size visibleClientArea = ClientSize;
2440 if (verticalScrollBar.Visible)
2441 visibleClientArea.Width -= verticalScrollBar.Width;
2442 if (horizontalScrollBar.Visible)
2443 visibleClientArea.Height -= horizontalScrollBar.Height;
2445 for (int index = first_col_index; index < Columns.Count; index++) {
2446 DataGridViewColumn column = Columns[ColumnDisplayIndexToIndex (index)];
2447 if (columnLeft + column.Width <= visibleClientArea.Width) {
2449 columnLeft += column.Width;
2451 if (includePartialColumns)
2460 public int DisplayedRowCount (bool includePartialRow)
2465 if (ColumnHeadersVisible)
2466 rowTop += ColumnHeadersHeight;
2468 Size visibleClientArea = ClientSize;
2469 if (verticalScrollBar.Visible)
2470 visibleClientArea.Width -= verticalScrollBar.Width;
2471 if (horizontalScrollBar.Visible)
2472 visibleClientArea.Height -= horizontalScrollBar.Height;
2474 for (int index = first_row_index; index < Rows.Count; index++) {
2475 DataGridViewRow row = GetRowInternal (index);
2476 if (rowTop + row.Height <= visibleClientArea.Height) {
2478 rowTop += row.Height;
2480 if (includePartialRow)
2489 public bool EndEdit ()
2491 return EndEdit (DataGridViewDataErrorContexts.Commit);
2494 [MonoTODO ("Does not use context parameter")]
2495 public bool EndEdit (DataGridViewDataErrorContexts context)
2497 if (currentCell == null || !currentCell.IsInEditMode)
2500 if (!CommitEdit (context)) {
2501 if (DataManager != null)
2502 DataManager.EndCurrentEdit ();
2503 if (EditingControl != null)
2504 EditingControl.Focus ();
2508 currentCell.SetIsInEditMode (false);
2509 currentCell.DetachEditingControl ();
2510 OnCellEndEdit (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
2511 if (context != DataGridViewDataErrorContexts.LeaveControl)
2513 if (currentCell.RowIndex == NewRowIndex) {
2514 new_row_editing = false;
2515 editing_row = null; // editing row becomes a real row
2516 PrepareEditingRow (true, false); // add a new editing row
2517 MoveCurrentCell (currentCell.ColumnIndex, NewRowIndex, true, false, false, true);
2522 public int GetCellCount (DataGridViewElementStates includeFilter) {
2524 foreach (DataGridViewRow row in rows) {
2525 foreach (DataGridViewCell cell in row.Cells) {
2526 if ((cell.State & includeFilter) != 0) {
2534 internal DataGridViewRow GetRowInternal (int rowIndex)
2536 return Rows.SharedRow (rowIndex);
2539 internal DataGridViewCell GetCellInternal (int colIndex, int rowIndex)
2541 return GetRowInternal (rowIndex).Cells.GetCellInternal (colIndex);
2544 public Rectangle GetCellDisplayRectangle (int columnIndex, int rowIndex, bool cutOverflow) {
2545 // Allow the column and row headers (index == -1).
2546 if (columnIndex < -1 || columnIndex >= columns.Count) {
2547 throw new ArgumentOutOfRangeException ("Column index is out of range.");
2549 if (rowIndex < -1 || (rowIndex > 0 && rowIndex >= rows.Count)) {
2550 throw new ArgumentOutOfRangeException ("Row index is out of range.");
2553 int x = 0, y = 0, w = 0, h = 0;
2558 if (ColumnHeadersVisible)
2559 y += ColumnHeadersHeight;
2561 if (RowHeadersVisible)
2562 x += RowHeadersWidth;
2564 // Handle the top left cell when both column and row headers are showing.
2565 if (columnIndex == -1 && rowIndex == -1)
2566 return new Rectangle (BorderWidth, BorderWidth, RowHeadersWidth, ColumnHeadersHeight);
2568 if (columnIndex >= 0)
2570 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2572 for (int i = first_col_index; i < cols.Count; i++) {
2573 if (!cols[i].Visible)
2576 if (cols[i].Index == columnIndex) {
2585 // Handle a cell in the header row.
2587 return new Rectangle (x, BorderWidth, w, ColumnHeadersHeight);
2589 for (int i = first_row_index; i < Rows.Count; i++) {
2590 if (!rows[i].Visible)
2593 if (rows[i].Index == rowIndex) {
2594 h = rows [i].Height;
2598 y += rows [i].Height;
2601 // Handle a cell in the header column.
2602 if (columnIndex == -1)
2603 return new Rectangle (BorderWidth, y, RowHeadersWidth, h);
2605 return new Rectangle (x, y, w, h);
2608 public virtual DataObject GetClipboardContent () {
2610 if (clipboardCopyMode == DataGridViewClipboardCopyMode.Disable)
2611 throw new InvalidOperationException ("Generating Clipboard content is not supported when the ClipboardCopyMode property is Disable.");
2613 int start_row = int.MaxValue, end_row = int.MinValue;
2614 int start_col = int.MaxValue, end_col = int.MinValue;
2616 bool include_row_headers = false;
2617 bool include_col_headers = false;
2618 bool only_included_headers = false;
2619 bool headers_includable = false;
2621 switch (ClipboardCopyMode) {
2622 case DataGridViewClipboardCopyMode.EnableWithoutHeaderText:
2624 case DataGridViewClipboardCopyMode.EnableWithAutoHeaderText:
2625 // Headers are included if not selection mode is CellSelect, and any header is selected.
2626 headers_includable = selectionMode != DataGridViewSelectionMode.CellSelect;
2628 case DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText:
2629 include_col_headers = include_row_headers = true;
2633 BitArray included_rows = new BitArray (RowCount);
2634 BitArray included_cols = new BitArray (ColumnCount);
2636 // If there are any selected columns,
2637 // include the column headers (if headers are to be shown).
2638 if (headers_includable && !include_col_headers) {
2639 for (int c = 0; c < ColumnCount; c++) {
2640 if (Columns [c].Selected) {
2641 include_col_headers = true;
2647 // Find the smallest rectangle that encompasses all selected cells.
2648 for (int r = 0; r < RowCount; r++) {
2649 DataGridViewRow row = Rows [r];
2651 if (headers_includable && !include_row_headers && row.Selected) {
2652 include_row_headers = true;
2655 for (int c = 0; c < ColumnCount; c++) {
2656 DataGridViewCell cell = row.Cells [c];
2658 if (cell == null || !cell.Selected)
2661 included_cols [c] = true;
2662 included_rows [r] = true;
2664 start_row = Math.Min (start_row, r);
2665 start_col = Math.Min (start_col, c);
2666 end_row = Math.Max (end_row, r);
2667 end_col = Math.Max (end_col, c);
2671 // Mark rows/columns in between selected cells as included if the selection mode isn't FullHeaderSelect.
2672 switch (selectionMode){
2673 case DataGridViewSelectionMode.CellSelect:
2674 case DataGridViewSelectionMode.ColumnHeaderSelect:
2675 case DataGridViewSelectionMode.RowHeaderSelect:
2676 if (selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect) {
2677 for (int r = start_row; r <= end_row; r++) {
2678 included_rows.Set (r, true);
2680 } else if (start_row <= end_row) {
2681 included_rows.SetAll (true);
2683 if (selectionMode != DataGridViewSelectionMode.RowHeaderSelect) {
2684 for (int c = start_col; c <= end_col; c++) {
2685 included_cols.Set (c, true);
2689 case DataGridViewSelectionMode.FullColumnSelect:
2690 case DataGridViewSelectionMode.FullRowSelect:
2691 only_included_headers = true;
2695 if (start_row > end_row)
2698 if (start_col > end_col)
2701 DataObject result = new DataObject ();
2703 StringBuilder text_builder = new StringBuilder ();
2704 StringBuilder utext_builder = new StringBuilder ();
2705 StringBuilder html_builder = new StringBuilder ();
2706 StringBuilder csv_builder = new StringBuilder ();
2708 // Loop through all rows and columns to create the content.
2709 // -1 is the header row/column.
2710 int first_row = start_row;
2711 int first_col = start_col;
2712 if (include_col_headers) {
2715 for (int r = first_row; r <= end_row; r++) {
2716 DataGridViewRow row = null;
2719 if (!included_rows [r])
2725 if (include_row_headers) {
2729 for (int c = first_col; c <= end_col; c++) {
2730 DataGridViewCell cell = null;
2732 if (c >= 0 && only_included_headers && !included_cols [c])
2737 cell = TopLeftHeaderCell;
2739 cell = Columns [c].HeaderCell;
2743 cell = row.HeaderCell;
2745 cell = row.Cells [c];
2749 string text, utext, html, csv;
2750 bool is_first_cell = (c == first_col);
2751 bool is_last_cell = (c == end_col);
2752 bool is_first_row = (r == first_row);
2753 bool is_last_row = (r == end_row);
2756 text = string.Empty;
2757 utext = string.Empty;
2758 html = string.Empty;
2761 text = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.Text) as string;
2762 utext = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.UnicodeText) as string;
2763 html = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.Html) as string;
2764 csv = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.CommaSeparatedValue) as string;
2767 text_builder.Append (text);
2768 utext_builder.Append (utext);
2769 html_builder.Append (html);
2770 csv_builder.Append (csv);
2772 if (c == -1) { // If we just did the row header, jump to the first column.
2777 if (r == -1) {// If we just did the column header, jump to the first row.
2783 // Html content always get the \r\n newline
2784 // It's valid html anyway, and it eases testing quite a bit
2785 // (since otherwise we'd have to change the start indices
2786 // in the added prologue/epilogue text)
2788 int fragment_end = 135 + html_builder.Length;
2789 int html_end = fragment_end + 36;
2792 "StartHTML:00000097{0}" +
2793 "EndHTML:{1:00000000}{0}" +
2794 "StartFragment:00000133{0}" +
2795 "EndFragment:{2:00000000}{0}" +
2798 "<!--StartFragment-->";
2800 html_start = string.Format (html_start, "\r\n", html_end, fragment_end);
2801 html_builder.Insert (0, html_start);
2802 html_builder.AppendFormat ("{0}<!--EndFragment-->{0}</BODY>{0}</HTML>", "\r\n");
2804 result.SetData (DataFormats.CommaSeparatedValue, false, csv_builder.ToString ());
2805 result.SetData (DataFormats.Html, false, html_builder.ToString ());
2806 result.SetData (DataFormats.UnicodeText, false, utext_builder.ToString ());
2807 result.SetData (DataFormats.Text, false, text_builder.ToString ());
2812 [MonoTODO ("Does not use cutOverflow parameter")]
2813 public Rectangle GetColumnDisplayRectangle (int columnIndex, bool cutOverflow)
2815 if (columnIndex < 0 || columnIndex > Columns.Count - 1)
2816 throw new ArgumentOutOfRangeException ("columnIndex");
2823 if (RowHeadersVisible)
2824 x += RowHeadersWidth;
2826 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2828 for (int i = first_col_index; i < cols.Count; i++) {
2829 if (!cols[i].Visible)
2832 if (cols[i].Index == columnIndex) {
2840 return new Rectangle (x, 0, w, Height);
2843 [MonoTODO ("Does not use cutOverflow parameter")]
2844 public Rectangle GetRowDisplayRectangle (int rowIndex, bool cutOverflow)
2846 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
2847 throw new ArgumentOutOfRangeException ("rowIndex");
2854 if (ColumnHeadersVisible)
2855 y += ColumnHeadersHeight;
2858 for (int i = first_row_index; i < Rows.Count; i++) {
2859 if (!rows[i].Visible)
2862 if (rows[i].Index == rowIndex) {
2863 h = rows [i].Height;
2867 y += rows [i].Height;
2870 return new Rectangle (0, y, Width, h);
2873 public HitTestInfo HitTest (int x, int y) {
2874 ///////////////////////////////////////////////////////
2875 //Console.WriteLine ("HitTest ({0}, {1})", x, y);
2876 bool isInColHeader = columnHeadersVisible && y >= 0 && y <= ColumnHeadersHeight;
2877 bool isInRowHeader = rowHeadersVisible && x >= 0 && x <= RowHeadersWidth;
2880 if (isInColHeader && isInRowHeader)
2881 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.TopLeftHeader);
2883 // HorizontalScrollBar
2884 if (horizontalScrollBar.Visible && horizontalScrollBar.Bounds.Contains (x, y))
2885 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.HorizontalScrollBar);
2887 // VerticalScrollBar
2888 if (verticalScrollBar.Visible && verticalScrollBar.Bounds.Contains (x, y))
2889 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.VerticalScrollBar);
2891 // The little box in the bottom right if both scrollbars are shown is None
2892 if (verticalScrollBar.Visible && horizontalScrollBar.Visible)
2893 if (new Rectangle (verticalScrollBar.Left, horizontalScrollBar.Top, verticalScrollBar.Width, horizontalScrollBar.Height).Contains (x, y))
2894 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.None);
2899 int top = columnHeadersVisible ? columnHeadersHeight : 0;
2901 for (int i = first_row_index; i < Rows.Count; i++) {
2902 DataGridViewRow row = Rows[i];
2906 if (y > top && y <= (top + row.Height)) {
2914 int left = rowHeadersVisible ? RowHeadersWidth : 0;
2916 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2918 for (int i = first_col_index; i < cols.Count; i++) {
2919 if (!cols[i].Visible)
2922 if (x > left && x <= (left + cols[i].Width)) {
2923 colindex = cols[i].Index;
2927 left += cols[i].Width;
2930 if (colindex >= 0 && rowindex >= 0)
2931 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.Cell);
2933 if (isInColHeader && colindex > -1)
2934 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.ColumnHeader);
2936 if (isInRowHeader && rowindex > -1)
2937 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.RowHeader);
2939 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.None);
2942 public void InvalidateCell (DataGridViewCell dataGridViewCell)
2944 if (dataGridViewCell == null)
2945 throw new ArgumentNullException ("Cell is null");
2947 if (dataGridViewCell.DataGridView != this)
2948 throw new ArgumentException ("The specified cell does not belong to this DataGridView.");
2950 InvalidateCell (dataGridViewCell.ColumnIndex, dataGridViewCell.RowIndex);
2953 public void InvalidateCell (int columnIndex, int rowIndex)
2955 // Allow the header column (columnIndex == -1).
2956 if (columnIndex < -1 || columnIndex >= columns.Count)
2957 throw new ArgumentOutOfRangeException ("Column index is out of range.");
2959 // Allow the header row (rowIndex == -1).
2960 if (rowIndex < -1 || rowIndex >= rows.Count)
2961 throw new ArgumentOutOfRangeException ("Row index is out of range.");
2964 Invalidate (GetCellDisplayRectangle (columnIndex, rowIndex, true));
2967 public void InvalidateColumn (int columnIndex)
2969 if (columnIndex < 0 || columnIndex >= columns.Count)
2970 throw new ArgumentOutOfRangeException ("Column index is out of range.");
2973 Invalidate (GetColumnDisplayRectangle (columnIndex, true));
2976 public void InvalidateRow (int rowIndex)
2978 if (rowIndex < 0 || rowIndex >= rows.Count)
2979 throw new ArgumentOutOfRangeException ("Row index is out of range.");
2982 Invalidate (GetRowDisplayRectangle (rowIndex, true));
2985 public virtual void NotifyCurrentCellDirty (bool dirty) {
2986 if (currentCell != null)
2987 InvalidateCell (currentCell);
2990 public bool RefreshEdit ()
2992 if (IsCurrentCellInEditMode) {
2993 currentCell.InitializeEditingControl (currentCell.RowIndex, currentCell.FormattedValue, currentCell.InheritedStyle);
3000 [EditorBrowsable (EditorBrowsableState.Never)]
3001 public override void ResetText ()
3003 Text = string.Empty;
3006 public void SelectAll () {
3007 switch (selectionMode) {
3008 case DataGridViewSelectionMode.FullRowSelect:
3009 foreach (DataGridViewRow row in rows) {
3010 (row as DataGridViewBand).Selected = true;
3013 case DataGridViewSelectionMode.FullColumnSelect:
3014 foreach (DataGridViewColumn col in columns) {
3015 (col as DataGridViewBand).Selected = true;
3019 foreach (DataGridViewRow row in rows) {
3020 foreach (DataGridViewCell cell in row.Cells) {
3021 cell.Selected = true;
3030 public virtual void Sort (IComparer comparer)
3032 if (comparer == null)
3033 throw new ArgumentNullException ("comparer");
3034 if (VirtualMode || DataSource != null)
3035 throw new InvalidOperationException ();
3037 if (SortedColumn != null)
3038 SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
3042 Rows.Sort (comparer);
3044 sortedColumn = null;
3045 sortOrder = SortOrder.None;
3051 OnSorted (EventArgs.Empty);
3054 public virtual void Sort (DataGridViewColumn dataGridViewColumn, ListSortDirection direction)
3056 if (dataGridViewColumn == null)
3057 throw new ArgumentNullException ("dataGridViewColumn");
3058 if (dataGridViewColumn.DataGridView != this)
3059 throw new ArgumentException ("dataGridViewColumn");
3064 if (SortedColumn != null)
3065 SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
3067 sortedColumn = dataGridViewColumn;
3068 sortOrder = direction == ListSortDirection.Ascending ? SortOrder.Ascending : SortOrder.Descending;
3070 if (Rows.Count == 0)
3073 if (dataGridViewColumn.IsDataBound) {
3074 IBindingList bindingList = DataManager.List as IBindingList;
3075 if (bindingList != null && bindingList.SupportsSorting) {
3076 bindingList.ApplySort (DataManager.GetItemProperties()[dataGridViewColumn.DataPropertyName], direction);
3077 dataGridViewColumn.HeaderCell.SortGlyphDirection = sortOrder;
3080 // Figure out if this is a numeric sort or text sort
3081 bool is_numeric = true;
3084 foreach (DataGridViewRow row in Rows) {
3085 object val = row.Cells[dataGridViewColumn.Index].Value;
3087 if (val != null && !double.TryParse (val.ToString (), out n)) {
3093 ColumnSorter sorter = new ColumnSorter (dataGridViewColumn, direction, is_numeric);
3095 dataGridViewColumn.HeaderCell.SortGlyphDirection = sortOrder;
3099 OnSorted (EventArgs.Empty);
3102 public void UpdateCellErrorText (int columnIndex, int rowIndex)
3104 if (columnIndex < 0 || columnIndex > Columns.Count - 1)
3105 throw new ArgumentOutOfRangeException ("columnIndex");
3106 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3107 throw new ArgumentOutOfRangeException ("rowIndex");
3109 InvalidateCell (columnIndex, rowIndex);
3112 public void UpdateCellValue (int columnIndex, int rowIndex)
3114 if (columnIndex < 0 || columnIndex > Columns.Count - 1)
3115 throw new ArgumentOutOfRangeException ("columnIndex");
3116 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3117 throw new ArgumentOutOfRangeException ("rowIndex");
3119 InvalidateCell (columnIndex, rowIndex);
3122 public void UpdateRowErrorText (int rowIndex)
3124 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3125 throw new ArgumentOutOfRangeException ("rowIndex");
3127 InvalidateRow (rowIndex);
3130 public void UpdateRowErrorText (int rowIndexStart, int rowIndexEnd)
3132 if (rowIndexStart < 0 || rowIndexStart > Rows.Count - 1)
3133 throw new ArgumentOutOfRangeException ("rowIndexStart");
3134 if (rowIndexEnd < 0 || rowIndexEnd > Rows.Count - 1)
3135 throw new ArgumentOutOfRangeException ("rowIndexEnd");
3136 if (rowIndexEnd < rowIndexStart)
3137 throw new ArgumentOutOfRangeException ("rowIndexEnd", "rowIndexEnd must be greater than rowIndexStart");
3139 for (int i = rowIndexStart; i <= rowIndexEnd; i++)
3143 public void UpdateRowHeightInfo (int rowIndex, bool updateToEnd)
3145 if (rowIndex < 0 && updateToEnd)
3146 throw new ArgumentOutOfRangeException ("rowIndex");
3147 if (rowIndex < -1 && !updateToEnd)
3148 throw new ArgumentOutOfRangeException ("rowIndex");
3149 if (rowIndex >= Rows.Count)
3150 throw new ArgumentOutOfRangeException ("rowIndex");
3152 if (!VirtualMode && DataManager == null)
3155 if (rowIndex == -1) {
3161 for (int i = rowIndex; i < Rows.Count; i++) {
3162 DataGridViewRow row = Rows[i];
3166 DataGridViewRowHeightInfoNeededEventArgs rowInfo =
3167 new DataGridViewRowHeightInfoNeededEventArgs (row.Index, row.Height, row.MinimumHeight);
3168 OnRowHeightInfoNeeded (rowInfo);
3170 if (row.Height != rowInfo.Height || row.MinimumHeight != rowInfo.MinimumHeight) {
3171 row.Height = rowInfo.Height;
3172 row.MinimumHeight = rowInfo.MinimumHeight;
3173 OnRowHeightInfoPushed (new DataGridViewRowHeightInfoPushedEventArgs (row.Index, rowInfo.Height,
3174 rowInfo.MinimumHeight));
3178 DataGridViewRow row = Rows[rowIndex];
3179 DataGridViewRowHeightInfoNeededEventArgs rowInfo =
3180 new DataGridViewRowHeightInfoNeededEventArgs (row.Index, row.Height, row.MinimumHeight);
3181 OnRowHeightInfoNeeded (rowInfo);
3183 if (row.Height != rowInfo.Height || row.MinimumHeight != rowInfo.MinimumHeight) {
3184 row.Height = rowInfo.Height;
3185 row.MinimumHeight = rowInfo.MinimumHeight;
3186 OnRowHeightInfoPushed (new DataGridViewRowHeightInfoPushedEventArgs (row.Index, rowInfo.Height,
3187 rowInfo.MinimumHeight));
3192 protected override bool CanEnableIme {
3194 if (CurrentCell != null && CurrentCell.EditType != null)
3201 protected override Size DefaultSize {
3202 get { return new Size (240, 150); }
3205 protected ScrollBar HorizontalScrollBar {
3206 get { return horizontalScrollBar; }
3209 protected ScrollBar VerticalScrollBar {
3210 get { return verticalScrollBar; }
3213 protected virtual void AccessibilityNotifyCurrentCellChanged (Point cellAddress)
3215 throw new NotImplementedException ();
3218 [MonoTODO ("Does not use fixedHeight parameter")]
3219 protected void AutoResizeColumn (int columnIndex, DataGridViewAutoSizeColumnMode autoSizeColumnMode, bool fixedHeight)
3221 AutoResizeColumn (columnIndex, autoSizeColumnMode);
3224 [MonoTODO ("Does not use fixedRowHeadersWidth or fixedColumnsWidth parameters")]
3225 protected void AutoResizeColumnHeadersHeight (bool fixedRowHeadersWidth, bool fixedColumnsWidth)
3227 AutoResizeColumnHeadersHeight ();
3230 [MonoTODO ("Does not use columnIndex or fixedRowHeadersWidth or fixedColumnsWidth parameters")]
3231 protected void AutoResizeColumnHeadersHeight (int columnIndex, bool fixedRowHeadersWidth, bool fixedColumnWidth)
3233 AutoResizeColumnHeadersHeight (columnIndex);
3236 protected void AutoResizeColumns (DataGridViewAutoSizeColumnsMode autoSizeColumnsMode, bool fixedHeight) {
3237 for (int i = 0; i < Columns.Count; i++) {
3238 AutoResizeColumn (i, (DataGridViewAutoSizeColumnMode) autoSizeColumnsMode, fixedHeight);
3242 [MonoTODO ("Does not use fixedWidth parameter")]
3243 protected void AutoResizeRow (int rowIndex, DataGridViewAutoSizeRowMode autoSizeRowMode, bool fixedWidth)
3245 if (autoSizeRowMode == DataGridViewAutoSizeRowMode.RowHeader && !rowHeadersVisible)
3246 throw new InvalidOperationException ("row headers are not visible");
3247 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3248 throw new ArgumentOutOfRangeException ("rowIndex");
3250 DataGridViewRow row = GetRowInternal (rowIndex);
3252 int new_height = row.GetPreferredHeight (rowIndex, autoSizeRowMode, true);
3254 if (row.Height != new_height)
3255 row.SetAutoSizeHeight (new_height);
3258 [MonoTODO ("Does not use fixedColumnHeadersHeight or fixedRowsHeight parameter")]
3259 protected void AutoResizeRowHeadersWidth (DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode, bool fixedColumnHeadersHeight, bool fixedRowsHeight)
3261 AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
3264 [MonoTODO ("Does not use rowIndex or fixedColumnHeadersHeight or fixedRowsHeight parameter")]
3265 protected void AutoResizeRowHeadersWidth (int rowIndex, DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode, bool fixedColumnHeadersHeight, bool fixedRowHeight)
3267 AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
3270 [MonoTODO ("Does not use fixedWidth parameter")]
3271 protected void AutoResizeRows (DataGridViewAutoSizeRowsMode autoSizeRowsMode, bool fixedWidth)
3273 if (autoSizeRowsMode == DataGridViewAutoSizeRowsMode.None)
3276 bool displayed_only = false;
3277 DataGridViewAutoSizeRowMode mode = DataGridViewAutoSizeRowMode.AllCells;
3279 switch (autoSizeRowsMode) {
3280 case DataGridViewAutoSizeRowsMode.AllHeaders:
3281 mode = DataGridViewAutoSizeRowMode.RowHeader;
3283 case DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders:
3284 mode = DataGridViewAutoSizeRowMode.AllCellsExceptHeader;
3286 case DataGridViewAutoSizeRowsMode.AllCells:
3287 mode = DataGridViewAutoSizeRowMode.AllCells;
3289 case DataGridViewAutoSizeRowsMode.DisplayedHeaders:
3290 mode = DataGridViewAutoSizeRowMode.RowHeader;
3291 displayed_only = true;
3293 case DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders:
3294 mode = DataGridViewAutoSizeRowMode.AllCellsExceptHeader;
3295 displayed_only = true;
3297 case DataGridViewAutoSizeRowsMode.DisplayedCells:
3298 mode = DataGridViewAutoSizeRowMode.AllCells;
3299 displayed_only = true;
3303 foreach (DataGridViewRow row in Rows) {
3306 if (!displayed_only || row.Displayed) {
3307 int new_height = row.GetPreferredHeight (row.Index, mode, fixedWidth);
3309 if (row.Height != new_height)
3310 row.SetAutoSizeHeight (new_height);
3315 [MonoTODO ("Does not use fixedMode parameter")]
3316 protected void AutoResizeRows (int rowIndexStart, int rowsCount, DataGridViewAutoSizeRowMode autoSizeRowMode, bool fixedWidth)
3318 for (int i = rowIndexStart; i < rowIndexStart + rowsCount; i++)
3319 AutoResizeRow (i, autoSizeRowMode, fixedWidth);
3322 protected void ClearSelection (int columnIndexException, int rowIndexException, bool selectExceptionElement) {
3323 if (columnIndexException >= columns.Count) {
3324 throw new ArgumentOutOfRangeException("ColumnIndexException is greater than the highest column index.");
3326 if (selectionMode == DataGridViewSelectionMode.FullRowSelect) {
3327 if (columnIndexException < -1) {
3328 throw new ArgumentOutOfRangeException("ColumnIndexException is less than -1.");
3332 if (columnIndexException < 0) {
3333 throw new ArgumentOutOfRangeException("ColumnIndexException is less than 0.");
3336 if (rowIndexException >= rows.Count) {
3337 throw new ArgumentOutOfRangeException("RowIndexException is greater than the highest row index.");
3339 if (selectionMode == DataGridViewSelectionMode.FullColumnSelect) {
3340 if (rowIndexException < -1) {
3341 throw new ArgumentOutOfRangeException("RowIndexException is less than -1.");
3345 if (rowIndexException < 0) {
3346 throw new ArgumentOutOfRangeException("RowIndexException is less than 0.");
3349 switch (selectionMode) {
3350 case DataGridViewSelectionMode.FullRowSelect:
3351 foreach (DataGridViewRow row in rows) {
3352 if (selectExceptionElement && row.Index == rowIndexException) {
3355 SetSelectedRowCore (row.Index, false);
3358 case DataGridViewSelectionMode.FullColumnSelect:
3359 foreach (DataGridViewColumn col in columns) {
3360 if (selectExceptionElement && col.Index == columnIndexException) {
3363 SetSelectedColumnCore (col.Index, false);
3367 foreach (DataGridViewCell cell in SelectedCells) {
3368 if (selectExceptionElement && cell.RowIndex == rowIndexException && cell.ColumnIndex == columnIndexException) {
3371 SetSelectedCellCore (cell.ColumnIndex, cell.RowIndex, false);
3377 protected override AccessibleObject CreateAccessibilityInstance ()
3379 return new DataGridViewAccessibleObject(this);
3382 [EditorBrowsable (EditorBrowsableState.Advanced)]
3383 protected virtual DataGridViewColumnCollection CreateColumnsInstance ()
3385 return new DataGridViewColumnCollection(this);
3388 protected override Control.ControlCollection CreateControlsInstance ()
3390 return new DataGridViewControlCollection (this);
3393 [EditorBrowsable (EditorBrowsableState.Advanced)]
3394 protected virtual DataGridViewRowCollection CreateRowsInstance ()
3396 return new DataGridViewRowCollection(this);
3399 protected override void Dispose (bool disposing) {
3402 foreach (DataGridViewColumn column in Columns)
3405 foreach (DataGridViewRow row in Rows)
3409 editingControl = null;
3411 base.Dispose(disposing);
3414 protected override AccessibleObject GetAccessibilityObjectById (int objectId)
3416 throw new NotImplementedException();
3419 protected override bool IsInputChar (char charCode)
3424 protected override bool IsInputKey (Keys keyData)
3426 // Don't look at the modifiers
3427 keyData = keyData & ~Keys.Modifiers;
3449 protected virtual void OnAllowUserToAddRowsChanged (EventArgs e)
3451 EventHandler eh = (EventHandler)(Events [AllowUserToAddRowsChangedEvent]);
3456 protected virtual void OnAllowUserToDeleteRowsChanged (EventArgs e)
3458 EventHandler eh = (EventHandler)(Events [AllowUserToDeleteRowsChangedEvent]);
3463 protected virtual void OnAllowUserToOrderColumnsChanged (EventArgs e)
3465 EventHandler eh = (EventHandler)(Events [AllowUserToOrderColumnsChangedEvent]);
3470 protected virtual void OnAllowUserToResizeColumnsChanged (EventArgs e)
3472 EventHandler eh = (EventHandler)(Events [AllowUserToResizeColumnsChangedEvent]);
3477 protected virtual void OnAllowUserToResizeRowsChanged (EventArgs e)
3479 EventHandler eh = (EventHandler)(Events [AllowUserToResizeRowsChangedEvent]);
3484 protected virtual void OnAlternatingRowsDefaultCellStyleChanged (EventArgs e)
3486 EventHandler eh = (EventHandler)(Events [AlternatingRowsDefaultCellStyleChangedEvent]);
3491 protected virtual void OnAutoGenerateColumnsChanged (EventArgs e)
3493 EventHandler eh = (EventHandler)(Events [AutoGenerateColumnsChangedEvent]);
3498 protected internal virtual void OnAutoSizeColumnModeChanged (DataGridViewAutoSizeColumnModeEventArgs e)
3500 DataGridViewAutoSizeColumnModeEventHandler eh = (DataGridViewAutoSizeColumnModeEventHandler)(Events [AutoSizeColumnModeChangedEvent]);
3505 protected virtual void OnAutoSizeColumnsModeChanged (DataGridViewAutoSizeColumnsModeEventArgs e)
3507 DataGridViewAutoSizeColumnsModeEventHandler eh = (DataGridViewAutoSizeColumnsModeEventHandler)(Events [AutoSizeColumnsModeChangedEvent]);
3512 protected virtual void OnAutoSizeRowsModeChanged (DataGridViewAutoSizeModeEventArgs e)
3514 DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [AutoSizeRowsModeChangedEvent]);
3519 protected virtual void OnBackgroundColorChanged (EventArgs e)
3521 EventHandler eh = (EventHandler)(Events [BackgroundColorChangedEvent]);
3526 protected override void OnBindingContextChanged (EventArgs e)
3528 base.OnBindingContextChanged(e);
3532 protected virtual void OnBorderStyleChanged (EventArgs e)
3534 EventHandler eh = (EventHandler)(Events [BorderStyleChangedEvent]);
3539 protected virtual void OnCancelRowEdit (QuestionEventArgs e) {
3540 QuestionEventHandler eh = (QuestionEventHandler)(Events [CancelRowEditEvent]);
3545 protected virtual void OnCellBeginEdit (DataGridViewCellCancelEventArgs e)
3547 DataGridViewCellCancelEventHandler eh = (DataGridViewCellCancelEventHandler)(Events [CellBeginEditEvent]);
3552 protected virtual void OnCellBorderStyleChanged (EventArgs e)
3554 EventHandler eh = (EventHandler)(Events [CellBorderStyleChangedEvent]);
3559 protected virtual void OnCellClick (DataGridViewCellEventArgs e)
3561 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3563 cell.OnClickInternal (e);
3565 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellClickEvent]);
3570 protected virtual void OnCellContentClick (DataGridViewCellEventArgs e)
3572 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3574 cell.OnContentClickInternal (e);
3576 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContentClickEvent]);
3581 protected virtual void OnCellContentDoubleClick (DataGridViewCellEventArgs e)
3583 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3585 cell.OnContentDoubleClickInternal (e);
3587 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContentDoubleClickEvent]);
3592 protected virtual void OnCellContextMenuStripChanged (DataGridViewCellEventArgs e)
3594 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContextMenuStripChangedEvent]);
3599 protected virtual void OnCellContextMenuStripNeeded (DataGridViewCellContextMenuStripNeededEventArgs e)
3601 DataGridViewCellContextMenuStripNeededEventHandler eh = (DataGridViewCellContextMenuStripNeededEventHandler)(Events [CellContextMenuStripNeededEvent]);
3606 protected virtual void OnCellDoubleClick (DataGridViewCellEventArgs e)
3608 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3610 cell.OnDoubleClickInternal (e);
3611 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellDoubleClickEvent]);
3616 protected virtual void OnCellEndEdit (DataGridViewCellEventArgs e)
3618 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellEndEditEvent]);
3623 protected virtual void OnCellEnter (DataGridViewCellEventArgs e)
3625 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3626 cell.OnEnterInternal (e.RowIndex, true);
3628 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellEnterEvent]);
3633 protected internal virtual void OnCellErrorTextChanged (DataGridViewCellEventArgs e)
3635 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellErrorTextChangedEvent]);
3640 protected virtual void OnCellErrorTextNeeded (DataGridViewCellErrorTextNeededEventArgs e)
3642 DataGridViewCellErrorTextNeededEventHandler eh = (DataGridViewCellErrorTextNeededEventHandler)(Events [CellErrorTextNeededEvent]);
3647 internal void OnCellFormattingInternal (DataGridViewCellFormattingEventArgs e)
3649 OnCellFormatting (e);
3652 protected virtual void OnCellFormatting (DataGridViewCellFormattingEventArgs e)
3654 DataGridViewCellFormattingEventHandler eh = (DataGridViewCellFormattingEventHandler)(Events [CellFormattingEvent]);
3659 protected virtual void OnCellLeave (DataGridViewCellEventArgs e)
3661 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3662 cell.OnLeaveInternal (e.RowIndex, true);
3664 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellLeaveEvent]);
3669 protected virtual void OnCellMouseClick (DataGridViewCellMouseEventArgs e)
3671 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3673 cell.OnMouseClickInternal (e);
3675 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseClickEvent]);
3680 protected virtual void OnCellMouseDoubleClick (DataGridViewCellMouseEventArgs e)
3682 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3684 cell.OnMouseDoubleClickInternal (e);
3686 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseDoubleClickEvent]);
3691 protected virtual void OnCellMouseDown (DataGridViewCellMouseEventArgs e)
3694 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3696 cell.OnMouseDownInternal (e);
3698 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseDownEvent]);
3703 protected virtual void OnCellMouseEnter (DataGridViewCellEventArgs e)
3705 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3707 cell.OnMouseEnterInternal (e.RowIndex);
3709 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellMouseEnterEvent]);
3714 protected virtual void OnCellMouseLeave (DataGridViewCellEventArgs e)
3716 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3718 cell.OnMouseLeaveInternal (e.RowIndex);
3720 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellMouseLeaveEvent]);
3725 protected virtual void OnCellMouseMove (DataGridViewCellMouseEventArgs e)
3727 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3729 cell.OnMouseMoveInternal (e);
3731 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseMoveEvent]);
3736 protected virtual void OnCellMouseUp (DataGridViewCellMouseEventArgs e)
3738 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3740 cell.OnMouseUpInternal (e);
3742 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseUpEvent]);
3747 internal void OnCellPaintingInternal (DataGridViewCellPaintingEventArgs e)
3752 protected virtual void OnCellPainting (DataGridViewCellPaintingEventArgs e)
3754 DataGridViewCellPaintingEventHandler eh = (DataGridViewCellPaintingEventHandler)(Events [CellPaintingEvent]);
3759 protected internal virtual void OnCellParsing (DataGridViewCellParsingEventArgs e)
3761 DataGridViewCellParsingEventHandler eh = (DataGridViewCellParsingEventHandler)(Events [CellParsingEvent]);
3766 internal void OnCellStateChangedInternal (DataGridViewCellStateChangedEventArgs e) {
3767 this.OnCellStateChanged (e);
3770 protected virtual void OnCellStateChanged (DataGridViewCellStateChangedEventArgs e)
3772 DataGridViewCellStateChangedEventHandler eh = (DataGridViewCellStateChangedEventHandler)(Events [CellStateChangedEvent]);
3777 protected virtual void OnCellStyleChanged (DataGridViewCellEventArgs e)
3779 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellStyleChangedEvent]);
3784 protected virtual void OnCellStyleContentChanged (DataGridViewCellStyleContentChangedEventArgs e) {
3785 DataGridViewCellStyleContentChangedEventHandler eh = (DataGridViewCellStyleContentChangedEventHandler)(Events [CellStyleContentChangedEvent]);
3790 protected virtual void OnCellToolTipTextChanged (DataGridViewCellEventArgs e) {
3791 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellToolTipTextChangedEvent]);
3796 protected virtual void OnCellToolTipTextNeeded (DataGridViewCellToolTipTextNeededEventArgs e)
3798 DataGridViewCellToolTipTextNeededEventHandler eh = (DataGridViewCellToolTipTextNeededEventHandler)(Events [CellToolTipTextNeededEvent]);
3803 protected virtual void OnCellValidated (DataGridViewCellEventArgs e)
3805 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellValidatedEvent]);
3810 protected virtual void OnCellValidating (DataGridViewCellValidatingEventArgs e)
3812 DataGridViewCellValidatingEventHandler eh = (DataGridViewCellValidatingEventHandler)(Events [CellValidatingEvent]);
3817 protected virtual void OnCellValueChanged (DataGridViewCellEventArgs e)
3819 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellValueChangedEvent]);
3824 protected internal virtual void OnCellValueNeeded (DataGridViewCellValueEventArgs e)
3826 DataGridViewCellValueEventHandler eh = (DataGridViewCellValueEventHandler)(Events [CellValueNeededEvent]);
3831 protected internal virtual void OnCellValuePushed (DataGridViewCellValueEventArgs e)
3833 DataGridViewCellValueEventHandler eh = (DataGridViewCellValueEventHandler)(Events [CellValuePushedEvent]);
3838 internal void OnColumnAddedInternal (DataGridViewColumnEventArgs e)
3840 e.Column.DataColumnIndex = FindDataColumnIndex (e.Column);
3842 if (e.Column.CellTemplate != null) {
3843 // The first column has just been added programatically instead of
3844 // autogenerated so we need to create the rows for the first time.
3846 if (!is_autogenerating_columns && columns.Count == 1)
3849 // Add/Remove/Update the cells in the existing rows
3850 foreach (DataGridViewRow row in Rows) {
3851 if (row.Index == NewRowIndex)
3854 DataGridViewCell newCell = (DataGridViewCell)e.Column.CellTemplate.Clone ();
3855 if (row.Cells.Count == columns.Count) {
3856 DataGridViewCell oldCell = row.Cells[e.Column.Index];
3857 if (currentCell != null && oldCell == currentCell)
3858 currentCell = newCell;
3859 // copy the value only if the cell is not-databound
3860 if (!e.Column.IsDataBound && oldCell.OwningRow.DataBoundItem == null)
3861 newCell.Value = oldCell.Value;
3862 row.Cells.Replace (e.Column.Index, newCell);
3863 } else if (e.Column.Index >= row.Cells.Count)
3864 row.Cells.Add (newCell);
3866 row.Cells.Insert (e.Column.Index, newCell);
3870 AutoResizeColumnsInternal ();
3872 PrepareEditingRow (false, true);
3875 private int FindDataColumnIndex (DataGridViewColumn column)
3877 if (column != null && DataManager != null) {
3878 PropertyDescriptorCollection properties = DataManager.GetItemProperties();
3879 for (int i = 0; i < properties.Count; i++) {
3880 if (String.Compare (column.DataPropertyName, properties[i].Name, true) == 0)
3888 protected virtual void OnColumnAdded (DataGridViewColumnEventArgs e)
3890 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnAddedEvent]);
3895 protected internal virtual void OnColumnContextMenuStripChanged (DataGridViewColumnEventArgs e)
3897 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnContextMenuStripChangedEvent]);
3902 protected internal virtual void OnColumnDataPropertyNameChanged (DataGridViewColumnEventArgs e)
3904 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDataPropertyNameChangedEvent]);
3909 protected internal virtual void OnColumnDefaultCellStyleChanged (DataGridViewColumnEventArgs e)
3911 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDefaultCellStyleChangedEvent]);
3916 protected internal virtual void OnColumnDisplayIndexChanged (DataGridViewColumnEventArgs e)
3918 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDisplayIndexChangedEvent]);
3923 protected virtual void OnColumnDividerDoubleClick (DataGridViewColumnDividerDoubleClickEventArgs e)
3925 DataGridViewColumnDividerDoubleClickEventHandler eh = (DataGridViewColumnDividerDoubleClickEventHandler)(Events [ColumnDividerDoubleClickEvent]);
3930 protected internal virtual void OnColumnDividerWidthChanged (DataGridViewColumnEventArgs e)
3932 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDividerWidthChangedEvent]);
3937 protected internal virtual void OnColumnHeaderCellChanged (DataGridViewColumnEventArgs e)
3939 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnHeaderCellChangedEvent]);
3944 protected virtual void OnColumnHeaderMouseClick (DataGridViewCellMouseEventArgs e)
3946 DataGridViewColumn col = Columns[e.ColumnIndex];
3948 if (col.SortMode == DataGridViewColumnSortMode.Automatic) {
3949 ListSortDirection new_order;
3951 // Always use ascending unless we are clicking on a
3952 // column that is already sorted ascending.
3953 if (SortedColumn != col || sortOrder != SortOrder.Ascending)
3954 new_order = ListSortDirection.Ascending;
3956 new_order = ListSortDirection.Descending;
3958 Sort (col, new_order);
3961 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [ColumnHeaderMouseClickEvent]);
3966 protected virtual void OnColumnHeaderMouseDoubleClick (DataGridViewCellMouseEventArgs e)
3968 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [ColumnHeaderMouseDoubleClickEvent]);
3973 protected virtual void OnColumnHeadersBorderStyleChanged (EventArgs e)
3975 EventHandler eh = (EventHandler)(Events [ColumnHeadersBorderStyleChangedEvent]);
3980 protected virtual void OnColumnHeadersDefaultCellStyleChanged (EventArgs e)
3982 EventHandler eh = (EventHandler)(Events [ColumnHeadersDefaultCellStyleChangedEvent]);
3987 protected virtual void OnColumnHeadersHeightChanged (EventArgs e)
3989 EventHandler eh = (EventHandler)(Events [ColumnHeadersHeightChangedEvent]);
3994 protected virtual void OnColumnHeadersHeightSizeModeChanged (DataGridViewAutoSizeModeEventArgs e)
3996 DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [ColumnHeadersHeightSizeModeChangedEvent]);
4001 protected internal virtual void OnColumnMinimumWidthChanged (DataGridViewColumnEventArgs e)
4003 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnMinimumWidthChangedEvent]);
4008 protected internal virtual void OnColumnNameChanged (DataGridViewColumnEventArgs e)
4010 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnNameChangedEvent]);
4015 internal void OnColumnPreRemovedInternal (DataGridViewColumnEventArgs e)
4017 // The removed column should be removed from the selection too.
4018 if (selected_columns != null)
4019 SetSelectedColumnCore (e.Column.Index, false);
4021 if (Columns.Count - 1 == 0) {
4022 MoveCurrentCell (-1, -1, true, false, false, true);
4023 rows.ClearInternal ();
4024 } else if (currentCell != null && CurrentCell.ColumnIndex == e.Column.Index) {
4025 int nextColumnIndex = e.Column.Index;
4026 if (nextColumnIndex >= Columns.Count - 1)
4027 nextColumnIndex = Columns.Count - 1 - 1;
4028 MoveCurrentCell (nextColumnIndex, currentCell.RowIndex, true, false, false, true);
4029 if (hover_cell != null && hover_cell.ColumnIndex >= e.Column.Index)
4034 private void OnColumnPostRemovedInternal (DataGridViewColumnEventArgs e)
4036 if (e.Column.CellTemplate != null) {
4037 int index = e.Column.Index;
4039 foreach (DataGridViewRow row in Rows)
4040 row.Cells.RemoveAt (index);
4043 AutoResizeColumnsInternal ();
4044 PrepareEditingRow (false, true);
4046 OnColumnRemoved (e);
4049 protected virtual void OnColumnRemoved (DataGridViewColumnEventArgs e)
4051 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnRemovedEvent]);
4056 protected internal virtual void OnColumnSortModeChanged (DataGridViewColumnEventArgs e)
4058 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnSortModeChangedEvent]);
4063 protected internal virtual void OnColumnStateChanged (DataGridViewColumnStateChangedEventArgs e)
4065 DataGridViewColumnStateChangedEventHandler eh = (DataGridViewColumnStateChangedEventHandler)(Events [ColumnStateChangedEvent]);
4070 protected internal virtual void OnColumnToolTipTextChanged (DataGridViewColumnEventArgs e)
4072 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnToolTipTextChangedEvent]);
4077 protected internal virtual void OnColumnWidthChanged (DataGridViewColumnEventArgs e)
4079 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnWidthChangedEvent]);
4084 protected virtual void OnCurrentCellChanged (EventArgs e)
4086 EventHandler eh = (EventHandler)(Events [CurrentCellChangedEvent]);
4091 protected virtual void OnCurrentCellDirtyStateChanged (EventArgs e)
4093 EventHandler eh = (EventHandler)(Events [CurrentCellDirtyStateChangedEvent]);
4098 protected override void OnCursorChanged (EventArgs e)
4100 base.OnCursorChanged (e);
4103 protected virtual void OnDataBindingComplete (DataGridViewBindingCompleteEventArgs e)
4105 DataGridViewBindingCompleteEventHandler eh = (DataGridViewBindingCompleteEventHandler)(Events [DataBindingCompleteEvent]);
4110 protected virtual void OnDataError (bool displayErrorDialogIfNoHandler, DataGridViewDataErrorEventArgs e)
4112 DataGridViewDataErrorEventHandler eh = (DataGridViewDataErrorEventHandler)(Events [DataErrorEvent]);
4116 else if (displayErrorDialogIfNoHandler)
4117 MessageBox.Show (e.ToString ());
4119 protected virtual void OnDataMemberChanged (EventArgs e) {
4120 EventHandler eh = (EventHandler)(Events [DataMemberChangedEvent]);
4125 protected virtual void OnDataSourceChanged (EventArgs e) {
4126 EventHandler eh = (EventHandler)(Events [DataSourceChangedEvent]);
4131 protected virtual void OnDefaultCellStyleChanged (EventArgs e) {
4132 EventHandler eh = (EventHandler)(Events [DefaultCellStyleChangedEvent]);
4137 protected virtual void OnDefaultValuesNeeded (DataGridViewRowEventArgs e) {
4138 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [DefaultValuesNeededEvent]);
4143 protected override void OnDoubleClick (EventArgs e) {
4144 base.OnDoubleClick(e);
4146 Point mouseLocation = this.PointToClient (Control.MousePosition);
4147 HitTestInfo hitInfo = HitTest (mouseLocation.X, mouseLocation.Y);
4148 if (hitInfo.Type == DataGridViewHitTestType.Cell)
4149 OnCellDoubleClick (new DataGridViewCellEventArgs (hitInfo.ColumnIndex, hitInfo.RowIndex));
4152 protected virtual void OnEditingControlShowing (DataGridViewEditingControlShowingEventArgs e) {
4153 DataGridViewEditingControlShowingEventHandler eh = (DataGridViewEditingControlShowingEventHandler)(Events [EditingControlShowingEvent]);
4158 protected virtual void OnEditModeChanged (EventArgs e)
4160 EventHandler eh = (EventHandler)(Events [EditModeChangedEvent]);
4165 protected override void OnEnabledChanged (EventArgs e)
4167 base.OnEnabledChanged(e);
4170 protected override void OnEnter (EventArgs e )
4175 protected override void OnGotFocus(EventArgs e)
4177 base.OnGotFocus (e);
4179 // To add focus rectangle if needed
4180 if (currentCell != null && ShowFocusCues)
4181 InvalidateCell (currentCell);
4184 protected override void OnFontChanged (EventArgs e)
4186 base.OnFontChanged(e);
4189 protected override void OnForeColorChanged (EventArgs e)
4191 base.OnForeColorChanged(e);
4194 protected virtual void OnGridColorChanged (EventArgs e)
4196 EventHandler eh = (EventHandler)(Events [GridColorChangedEvent]);
4201 protected override void OnHandleCreated (EventArgs e)
4203 base.OnHandleCreated(e);
4206 if (DataManager == null && CurrentCell == null && Rows.Count > 0 && Columns.Count > 0)
4207 MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, false, false, false);
4210 protected override void OnHandleDestroyed(EventArgs e)
4212 base.OnHandleDestroyed (e);
4215 [EditorBrowsable (EditorBrowsableState.Advanced)]
4216 protected override void OnKeyDown (KeyEventArgs e)
4220 e.Handled = ProcessDataGridViewKey (e);
4223 [EditorBrowsable (EditorBrowsableState.Advanced)]
4224 protected override void OnKeyPress (KeyPressEventArgs e)
4229 [EditorBrowsable (EditorBrowsableState.Advanced)]
4230 protected override void OnKeyUp (KeyEventArgs e)
4235 protected override void OnLayout (LayoutEventArgs e)
4237 if (horizontalScrollBar.Visible && verticalScrollBar.Visible) {
4238 horizontalScrollBar.Bounds = new Rectangle (BorderWidth, Height - BorderWidth - horizontalScrollBar.Height, Width - (2 * BorderWidth) - verticalScrollBar.Width, horizontalScrollBar.Height);
4239 verticalScrollBar.Bounds = new Rectangle (Width - BorderWidth - verticalScrollBar.Width, BorderWidth, verticalScrollBar.Width, Height - (2 * BorderWidth) - horizontalScrollBar.Height);
4240 } else if (horizontalScrollBar.Visible)
4241 horizontalScrollBar.Bounds = new Rectangle (BorderWidth, Height - BorderWidth - horizontalScrollBar.Height, Width - (2 * BorderWidth), horizontalScrollBar.Height);
4242 else if (verticalScrollBar.Visible)
4243 verticalScrollBar.Bounds = new Rectangle (Width - BorderWidth - verticalScrollBar.Width, BorderWidth, verticalScrollBar.Width, Height - (2 * BorderWidth));
4245 AutoResizeColumnsInternal ();
4249 protected override void OnLeave (EventArgs e)
4251 EndEdit (DataGridViewDataErrorContexts.LeaveControl);
4255 protected override void OnLostFocus(EventArgs e)
4257 base.OnLostFocus (e);
4259 // To remove focus rectangle if needed
4260 if (currentCell != null && ShowFocusCues)
4261 InvalidateCell (currentCell);
4264 protected override void OnMouseClick (MouseEventArgs e)
4266 base.OnMouseClick(e);
4268 if (column_resize_active || row_resize_active)
4271 //Console.WriteLine("Mouse: Clicks: {0}; Delta: {1}; X: {2}; Y: {3};", e.Clicks, e.Delta, e.X, e.Y);
4272 HitTestInfo hit = HitTest (e.X, e.Y);
4275 case DataGridViewHitTestType.Cell:
4276 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4277 Point cellpoint = new Point (e.X - display.X, e.Y - display.Y);
4279 OnCellMouseClick (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, cellpoint.X, cellpoint.Y, e));
4281 DataGridViewCell cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex);
4283 if (cell.GetContentBounds (hit.RowIndex).Contains (cellpoint)) {
4284 DataGridViewCellEventArgs dgvcea = new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex);
4285 OnCellContentClick (dgvcea);
4289 case DataGridViewHitTestType.ColumnHeader:
4290 Rectangle display2 = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4291 Point cellpoint2 = new Point (e.X - display2.X, e.Y - display2.Y);
4293 OnColumnHeaderMouseClick (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, cellpoint2.X, cellpoint2.Y, e));
4298 protected override void OnMouseDoubleClick (MouseEventArgs e)
4300 base.OnMouseDoubleClick(e);
4302 HitTestInfo hitInfo = HitTest (e.X, e.Y);
4303 if (hitInfo.Type == DataGridViewHitTestType.Cell)
4304 OnCellMouseDoubleClick (new DataGridViewCellMouseEventArgs (hitInfo.ColumnIndex, hitInfo.RowIndex,
4305 hitInfo.ColumnX, hitInfo.RowY, e));
4308 private void DoSelectionOnMouseDown (HitTestInfo hitTest)
4310 Keys modifiers = Control.ModifierKeys;
4311 bool isControl = (modifiers & Keys.Control) != 0;
4312 bool isShift = (modifiers & Keys.Shift) != 0;
4313 //bool isRowHeader = hitTest.Type == DataGridViewHitTestType.RowHeader;
4314 //bool isColHeader = hitTest.Type == DataGridViewHitTestType.ColumnHeader;
4315 DataGridViewSelectionMode mode;
4317 switch (hitTest.Type) {
4318 case DataGridViewHitTestType.Cell:
4319 mode = selectionMode;
4321 case DataGridViewHitTestType.ColumnHeader:
4322 mode = selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect ? DataGridViewSelectionMode.FullColumnSelect : selectionMode;
4324 if (mode != DataGridViewSelectionMode.FullColumnSelect)
4327 case DataGridViewHitTestType.RowHeader:
4328 mode = selectionMode == DataGridViewSelectionMode.RowHeaderSelect ? DataGridViewSelectionMode.FullRowSelect : selectionMode;
4330 if (mode != DataGridViewSelectionMode.FullRowSelect)
4332 break; // Handled below
4338 // If SHIFT is pressed:
4339 // Select all from selected_row/column/cell to current row/column/cell, unselect everything else
4341 // Unselect all rows/columns/cells, select the clicked one
4342 int min_row, max_row;
4343 int min_col, max_col;
4345 selected_row = hitTest.RowIndex;
4346 selected_column = hitTest.ColumnIndex;
4349 if (selected_row != -1)
4350 selected_row = hitTest.RowIndex;
4351 if (selected_column != -1)
4352 selected_column = hitTest.ColumnIndex;
4354 if (selected_row >= hitTest.RowIndex) {
4355 min_row = hitTest.RowIndex;
4356 max_row = isShift ? selected_row : min_row;
4358 max_row = hitTest.RowIndex;
4359 min_row = isShift ? selected_row : max_row;
4361 if (selected_column >= hitTest.ColumnIndex) {
4362 min_col = hitTest.ColumnIndex;
4363 max_col = isShift ? selected_column : min_col;
4365 max_col = hitTest.ColumnIndex;
4366 min_col = isShift ? selected_column : max_col;
4370 case DataGridViewSelectionMode.FullRowSelect:
4371 for (int i = 0; i < RowCount; i++) {
4372 bool select = i >= min_row && i <= max_row;
4374 for (int c = 0; c < ColumnCount; c++) {
4375 if (Rows [i].Cells [c].Selected) {
4376 SetSelectedCellCore (c, i, false);
4380 if (select != Rows [i].Selected) {
4381 SetSelectedRowCore (i, select);
4385 case DataGridViewSelectionMode.FullColumnSelect:
4386 for (int i = 0; i < ColumnCount; i++) {
4387 bool select = i >= min_col && i <= max_col;
4389 for (int r = 0; r < RowCount; r++) {
4390 if (Rows [r].Cells [i].Selected) {
4391 SetSelectedCellCore (i, r, false);
4395 if (select != Columns [i].Selected) {
4396 SetSelectedColumnCore (i, select);
4400 case DataGridViewSelectionMode.ColumnHeaderSelect:
4401 case DataGridViewSelectionMode.RowHeaderSelect:
4403 case DataGridViewSelectionMode.CellSelect:
4405 for (int c = 0; c < ColumnCount; c++) {
4406 if (columns [c].Selected)
4407 SetSelectedColumnCore (c, false);
4410 for (int r = 0; r < RowCount; r++) {
4411 if (rows [r].Selected)
4412 SetSelectedRowCore (r, false);
4415 for (int r = 0; r < RowCount; r++) {
4416 for (int c = 0; c < ColumnCount; c++) {
4417 bool select = (r >= min_row && r <= max_row) && (c >= min_col && c <= max_col);
4418 if (select != Rows [r].Cells [c].Selected)
4419 SetSelectedCellCore (c, r, select);
4425 } else if (isControl) {
4426 // Switch the selected state of the row.
4428 case DataGridViewSelectionMode.FullRowSelect:
4429 SetSelectedRowCore (hitTest.RowIndex, !rows [hitTest.RowIndex].Selected);
4431 case DataGridViewSelectionMode.FullColumnSelect:
4432 SetSelectedColumnCore (hitTest.ColumnIndex, !columns [hitTest.ColumnIndex].Selected);
4434 case DataGridViewSelectionMode.ColumnHeaderSelect:
4435 case DataGridViewSelectionMode.RowHeaderSelect:
4437 case DataGridViewSelectionMode.CellSelect:
4438 if (hitTest.ColumnIndex >= 0 && hitTest.RowIndex >= 0) {
4439 SetSelectedCellCore (hitTest.ColumnIndex, hitTest.RowIndex, !Rows [hitTest.RowIndex].Cells [hitTest.ColumnIndex].Selected);
4447 protected override void OnMouseDown (MouseEventArgs e)
4449 base.OnMouseDown(e);
4454 HitTestInfo hitTest = HitTest(e.X, e.Y);
4456 DataGridViewCell cell = null;
4457 DataGridViewRow row = null;
4458 Rectangle cellBounds;
4460 if ((hitTest.Type == DataGridViewHitTestType.ColumnHeader ||
4461 (hitTest.Type == DataGridViewHitTestType.Cell && !ColumnHeadersVisible))
4462 && MouseOverColumnResize (hitTest.ColumnIndex, e.X)) {
4463 if (e.Clicks == 2) {
4464 AutoResizeColumn (hitTest.ColumnIndex);
4468 resize_band = hitTest.ColumnIndex;
4469 column_resize_active = true;
4470 resize_band_start = e.X;
4471 resize_band_delta = 0;
4472 DrawVerticalResizeLine (resize_band_start);
4476 if ((hitTest.Type == DataGridViewHitTestType.RowHeader ||
4477 (hitTest.Type == DataGridViewHitTestType.Cell && !RowHeadersVisible))
4478 && MouseOverRowResize (hitTest.RowIndex, e.Y)) {
4479 if (e.Clicks == 2) {
4480 AutoResizeRow (hitTest.RowIndex);
4484 resize_band = hitTest.RowIndex;
4485 row_resize_active = true;
4486 resize_band_start = e.Y;
4487 resize_band_delta = 0;
4488 DrawHorizontalResizeLine (resize_band_start);
4492 if (hitTest.Type == DataGridViewHitTestType.Cell) {
4493 row = rows [hitTest.RowIndex];
4494 cell = row.Cells [hitTest.ColumnIndex];
4495 SetCurrentCellAddressCore (cell.ColumnIndex, cell.RowIndex, false, true, true);
4496 cellBounds = GetCellDisplayRectangle (hitTest.ColumnIndex, hitTest.RowIndex, false);
4497 OnCellMouseDown (new DataGridViewCellMouseEventArgs (hitTest.ColumnIndex, hitTest.RowIndex, e.X - cellBounds.X, e.Y - cellBounds.Y, e));
4498 OnCellClick (new DataGridViewCellEventArgs (hitTest.ColumnIndex, hitTest.RowIndex));
4501 DoSelectionOnMouseDown (hitTest);
4503 if (hitTest.Type != DataGridViewHitTestType.Cell) {
4504 if (hitTest.Type == DataGridViewHitTestType.ColumnHeader)
4505 pressed_header_cell = columns [hitTest.ColumnIndex].HeaderCell;
4506 else if (hitTest.Type == DataGridViewHitTestType.RowHeader)
4507 pressed_header_cell = rows [hitTest.RowIndex].HeaderCell;
4516 private void UpdateBindingPosition (int position)
4518 if (DataManager != null)
4519 DataManager.Position = position;
4522 protected override void OnMouseEnter (EventArgs e)
4524 base.OnMouseEnter(e);
4527 protected override void OnMouseLeave (EventArgs e)
4529 base.OnMouseLeave (e);
4531 if (hover_cell != null) {
4532 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4536 EnteredHeaderCell = null;
4539 protected override void OnMouseMove (MouseEventArgs e)
4541 base.OnMouseMove (e);
4543 if (column_resize_active) {
4544 // Erase the old line
4545 DrawVerticalResizeLine (resize_band_start + resize_band_delta);
4547 resize_band_delta = e.X - resize_band_start;
4549 // Draw the new line
4550 DrawVerticalResizeLine (resize_band_start + resize_band_delta);
4554 if (row_resize_active) {
4555 // Erase the old line
4556 DrawHorizontalResizeLine (resize_band_start + resize_band_delta);
4558 resize_band_delta = e.Y - resize_band_start;
4560 // Draw the new line
4561 DrawHorizontalResizeLine (resize_band_start + resize_band_delta);
4565 Cursor new_cursor = Cursors.Default;
4566 HitTestInfo hit = this.HitTest (e.X, e.Y);
4568 if (hit.Type == DataGridViewHitTestType.ColumnHeader ||
4569 (!ColumnHeadersVisible && hit.Type == DataGridViewHitTestType.Cell && MouseOverColumnResize (hit.ColumnIndex, e.X))) {
4570 EnteredHeaderCell = Columns [hit.ColumnIndex].HeaderCell;
4571 if (MouseOverColumnResize (hit.ColumnIndex, e.X))
4572 new_cursor = Cursors.VSplit;
4573 } else if (!RowHeadersVisible && hit.Type == DataGridViewHitTestType.Cell && MouseOverRowResize (hit.RowIndex, e.Y)) {
4574 EnteredHeaderCell = Rows[hit.RowIndex].HeaderCell;
4575 new_cursor = Cursors.HSplit;
4576 } else if (hit.Type == DataGridViewHitTestType.Cell) {
4577 EnteredHeaderCell = null;
4579 DataGridViewCell new_cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex);
4581 // Check if we have moved into an error icon area
4582 Rectangle icon = new_cell.ErrorIconBounds;
4584 if (!icon.IsEmpty) {
4585 Point loc = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false).Location;
4590 if (icon.Contains (e.X, e.Y)) {
4591 if (tooltip_currently_showing != new_cell)
4592 MouseEnteredErrorIcon (new_cell);
4594 MouseLeftErrorIcon (new_cell);
4597 Cursor = new_cursor;
4599 // We have never been in a cell before
4600 if (hover_cell == null) {
4601 hover_cell = new_cell;
4602 OnCellMouseEnter (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex));
4604 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4605 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4610 // Were we already in this cell?
4611 if (hover_cell.RowIndex == hit.RowIndex && hover_cell.ColumnIndex == hit.ColumnIndex) {
4612 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4613 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4618 // We are changing cells
4619 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4621 hover_cell = new_cell;
4623 OnCellMouseEnter (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex));
4625 Rectangle display2 = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4626 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display2.X, e.Y - display2.Y, e));
4629 } else if (hit.Type == DataGridViewHitTestType.RowHeader) {
4630 DataGridViewRowHeaderCell new_cell = Rows[hit.RowIndex].HeaderCell;
4632 EnteredHeaderCell = new_cell;
4634 if (MouseOverRowResize (hit.RowIndex, e.Y))
4635 new_cursor = Cursors.HSplit;
4637 // Check if we have moved into an error icon area
4638 Rectangle icon = new_cell.InternalErrorIconsBounds;
4640 if (!icon.IsEmpty) {
4641 Point loc = GetCellDisplayRectangle (0, hit.RowIndex, false).Location;
4643 icon.X += BorderWidth;
4646 if (icon.Contains (e.X, e.Y)) {
4647 if (tooltip_currently_showing != new_cell)
4648 MouseEnteredErrorIcon (new_cell);
4650 MouseLeftErrorIcon (new_cell);
4652 } else if (hit.Type == DataGridViewHitTestType.TopLeftHeader) {
4653 EnteredHeaderCell = null;
4655 DataGridViewTopLeftHeaderCell new_cell = (DataGridViewTopLeftHeaderCell)TopLeftHeaderCell;
4657 // Check if we have moved into an error icon area
4658 Rectangle icon = new_cell.InternalErrorIconsBounds;
4660 if (!icon.IsEmpty) {
4661 Point loc = Point.Empty;
4663 icon.X += BorderWidth;
4666 if (icon.Contains (e.X, e.Y)) {
4667 if (tooltip_currently_showing != new_cell)
4668 MouseEnteredErrorIcon (new_cell);
4670 MouseLeftErrorIcon (new_cell);
4674 EnteredHeaderCell = null;
4676 // We have left the cell area
4677 if (hover_cell != null) {
4678 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4683 Cursor = new_cursor;
4686 protected override void OnMouseUp (MouseEventArgs e)
4690 if (column_resize_active) {
4691 column_resize_active = false;
4693 if (resize_band_delta + Columns[resize_band].Width < 0)
4694 resize_band_delta = -Columns[resize_band].Width;
4696 Columns[resize_band].Width = Math.Max (resize_band_delta + Columns[resize_band].Width, Columns[resize_band].MinimumWidth);
4701 if (row_resize_active) {
4702 row_resize_active = false;
4704 if (resize_band_delta + Rows[resize_band].Height < 0)
4705 resize_band_delta = -Rows[resize_band].Height;
4707 Rows[resize_band].Height = Math.Max (resize_band_delta + Rows[resize_band].Height, Rows[resize_band].MinimumHeight);
4712 HitTestInfo hit = this.HitTest (e.X, e.Y);
4714 if (hit.Type == DataGridViewHitTestType.Cell) {
4715 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4716 OnCellMouseUp (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4719 if (pressed_header_cell != null) {
4720 DataGridViewHeaderCell cell = pressed_header_cell;
4721 pressed_header_cell = null;
4722 if (ThemeEngine.Current.DataGridViewHeaderCellHasPressedStyle (this))
4723 Invalidate (GetHeaderCellBounds (cell));
4727 protected override void OnMouseWheel (MouseEventArgs e)
4729 base.OnMouseWheel(e);
4731 int delta = SystemInformation.MouseWheelScrollLines * verticalScrollBar.SmallChange;
4733 verticalScrollBar.SafeValueSet (verticalScrollBar.Value + delta);
4735 verticalScrollBar.SafeValueSet (verticalScrollBar.Value - delta);
4737 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
4740 protected virtual void OnMultiSelectChanged (EventArgs e)
4742 EventHandler eh = (EventHandler)(Events [MultiSelectChangedEvent]);
4743 if (eh != null) eh (this, e);
4746 protected virtual void OnNewRowNeeded (DataGridViewRowEventArgs e) {
4747 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [NewRowNeededEvent]);
4748 if (eh != null) eh (this, e);
4751 int first_row_index = 0;
4752 internal int first_col_index = 0;
4754 protected override void OnPaint (PaintEventArgs e)
4756 Graphics g = e.Graphics;
4757 Rectangle bounds = ClientRectangle;
4759 // Paint the background
4760 PaintBackground (g, e.ClipRectangle, bounds);
4762 List<DataGridViewColumn> sortedColumns = columns.ColumnDisplayIndexSortedArrayList;
4764 // Take borders into account
4765 bounds.Inflate (-BorderWidth, -BorderWidth);
4767 // Paint the top left cell
4768 if (rowHeadersVisible && columnHeadersVisible && ColumnCount > 0) {
4769 Rectangle topleftbounds = new Rectangle (bounds.X, bounds.Y, rowHeadersWidth, columnHeadersHeight);
4771 TopLeftHeaderCell.PaintWork (g, e.ClipRectangle, topleftbounds, -1, TopLeftHeaderCell.State, ColumnHeadersDefaultCellStyle, AdvancedColumnHeadersBorderStyle, DataGridViewPaintParts.All);
4774 // Paint the column headers
4775 if (columnHeadersVisible) {
4776 Rectangle headerBounds = bounds;
4777 headerBounds.Height = columnHeadersHeight;
4779 if (rowHeadersVisible)
4780 headerBounds.X += rowHeadersWidth;
4782 for (int index = first_col_index; index < sortedColumns.Count; index++) {
4783 DataGridViewColumn col = sortedColumns[index];
4788 headerBounds.Width = col.Width;
4789 DataGridViewCell cell = col.HeaderCell;
4791 DataGridViewAdvancedBorderStyle intermediateBorderStyle = (DataGridViewAdvancedBorderStyle)((ICloneable)this.AdvancedColumnHeadersBorderStyle).Clone ();
4792 DataGridViewAdvancedBorderStyle borderStyle = AdjustColumnHeaderBorderStyle (this.AdvancedColumnHeadersBorderStyle, intermediateBorderStyle, cell.ColumnIndex == 0, cell.ColumnIndex == columns.Count - 1);
4794 cell.PaintWork (g, e.ClipRectangle, headerBounds, -1, cell.State, cell.InheritedStyle, borderStyle, DataGridViewPaintParts.All);
4796 headerBounds.X += col.Width;
4799 bounds.Y += columnHeadersHeight;
4802 // Reset not displayed columns to !Displayed
4803 for (int i = 0; i < first_col_index; i++)
4804 Columns[i].DisplayedInternal = false;
4806 int gridWidth = rowHeadersVisible ? rowHeadersWidth : 0;
4808 // Set Displayed columns
4809 for (int i = first_col_index; i < Columns.Count; i++) {
4810 DataGridViewColumn col = Columns.ColumnDisplayIndexSortedArrayList[i];
4815 col.DisplayedInternal = true;
4816 gridWidth += col.Width;
4817 if (gridWidth >= Width)
4821 // Reset all not displayed rows to !Displayed
4822 for (int i = 0; i < first_row_index; i++)
4823 GetRowInternal (i).DisplayedInternal = false;
4826 for (int index = first_row_index; index < Rows.Count; index++) {
4827 DataGridViewRow row = Rows[index];
4830 GetRowInternal (index).DisplayedInternal = true;
4832 bounds.Height = row.Height;
4833 bool is_first = row.Index == 0;
4834 bool is_last = row.Index == rows.Count - 1;
4836 row.Paint (g, e.ClipRectangle, bounds, row.Index, row.GetState (row.Index), is_first, is_last);
4838 bounds.Y += bounds.Height;
4839 bounds.X = BorderWidth;
4841 if (bounds.Y >= ClientSize.Height - (horizontalScrollBar.Visible ? horizontalScrollBar.Height : 0))
4845 RefreshScrollBars ();
4847 // Paint the bottom right square if both scrollbars are displayed
4848 if (horizontalScrollBar.Visible && verticalScrollBar.Visible)
4849 g.FillRectangle (SystemBrushes.Control, new Rectangle (horizontalScrollBar.Right, verticalScrollBar.Bottom, verticalScrollBar.Width, horizontalScrollBar.Height));
4852 bounds = ClientRectangle;
4854 switch (BorderStyle) {
4855 case BorderStyle.FixedSingle:
4856 g.DrawRectangle (Pens.Black, new Rectangle (bounds.Left, bounds.Top, bounds.Width - 1, bounds.Height - 1));
4858 case BorderStyle.Fixed3D:
4859 ControlPaint.DrawBorder3D (g, bounds, Border3DStyle.Sunken);
4863 // Call the base impl at the end.
4867 private void RefreshScrollBars ()
4872 foreach (DataGridViewColumn col in columns.ColumnDisplayIndexSortedArrayList)
4874 gridWidth += col.Width;
4876 foreach (DataGridViewRow row in Rows)
4878 gridHeight += row.Height;
4880 if (rowHeadersVisible)
4881 gridWidth += rowHeadersWidth;
4882 if (columnHeadersVisible)
4883 gridHeight += columnHeadersHeight;
4885 bool horizontalVisible = false;
4886 bool verticalVisible = false;
4889 if (gridWidth > Size.Width || gridHeight > Size.Height)
4890 Size = new Size(gridWidth, gridHeight);
4893 if (gridWidth > Size.Width)
4894 horizontalVisible = true;
4895 if (gridHeight > Size.Height)
4896 verticalVisible = true;
4898 if (horizontalScrollBar.Visible && (gridHeight + horizontalScrollBar.Height) > Size.Height)
4899 verticalVisible = true;
4900 if (verticalScrollBar.Visible && (gridWidth + verticalScrollBar.Width) > Size.Width)
4901 horizontalVisible = true;
4903 if (horizontalVisible) {
4904 horizontalScrollBar.Minimum = 0;
4905 horizontalScrollBar.Maximum = gridWidth;
4906 horizontalScrollBar.SmallChange = Columns[first_col_index].Width;
4907 int largeChange = ClientSize.Width - rowHeadersWidth - horizontalScrollBar.Height;
4908 if (largeChange <= 0)
4909 largeChange = ClientSize.Width;
4910 horizontalScrollBar.LargeChange = largeChange;
4913 if (verticalVisible) {
4914 verticalScrollBar.Minimum = 0;
4915 verticalScrollBar.Maximum = gridHeight;
4916 int first_row_height = Rows.Count > 0 ? Rows[Math.Min (Rows.Count - 1, first_row_index)].Height : 0;
4917 verticalScrollBar.SmallChange = first_row_height + 1;
4918 int largeChange = ClientSize.Height - columnHeadersHeight - verticalScrollBar.Width;
4919 if (largeChange <= 0)
4920 largeChange = ClientSize.Height;
4921 verticalScrollBar.LargeChange = largeChange;
4924 // Force the visibility of the scrollbars *after* computing the scrolling values,
4925 // as we need them *always* for navigation purposes.
4926 if (scrollBars != ScrollBars.Vertical && scrollBars != ScrollBars.Both)
4927 verticalVisible = false;
4928 if (scrollBars != ScrollBars.Horizontal && scrollBars != ScrollBars.Both)
4929 horizontalVisible = false;
4931 // MSNET compatibility here
4933 verticalVisible = false;
4938 horizontalScrollBar.Visible = horizontalVisible;
4939 verticalScrollBar.Visible = verticalVisible;
4942 protected virtual void OnReadOnlyChanged (EventArgs e) {
4943 EventHandler eh = (EventHandler)(Events [ReadOnlyChangedEvent]);
4948 protected override void OnResize (EventArgs e) {
4950 AutoResizeColumnsInternal ();
4952 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
4953 OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
4956 protected override void OnRightToLeftChanged (EventArgs e) {
4957 base.OnRightToLeftChanged(e);
4960 // In MSDN2 documentation there's no internal here
4961 protected internal virtual void OnRowContextMenuStripChanged (DataGridViewRowEventArgs e)
4963 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowContextMenuStripChangedEvent]);
4964 if (eh != null) eh (this, e);
4967 protected virtual void OnRowContextMenuStripNeeded (DataGridViewRowContextMenuStripNeededEventArgs e)
4969 DataGridViewRowContextMenuStripNeededEventHandler eh = (DataGridViewRowContextMenuStripNeededEventHandler)(Events [RowContextMenuStripNeededEvent]);
4970 if (eh != null) eh (this, e);
4973 protected internal virtual void OnRowDefaultCellStyleChanged (DataGridViewRowEventArgs e)
4975 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowDefaultCellStyleChangedEvent]);
4976 if (eh != null) eh (this, e);
4979 protected virtual void OnRowDirtyStateNeeded (QuestionEventArgs e)
4981 QuestionEventHandler eh = (QuestionEventHandler)(Events [RowDirtyStateNeededEvent]);
4982 if (eh != null) eh (this, e);
4985 protected virtual void OnRowDividerDoubleClick (DataGridViewRowDividerDoubleClickEventArgs e)
4987 DataGridViewRowDividerDoubleClickEventHandler eh = (DataGridViewRowDividerDoubleClickEventHandler)(Events [RowDividerDoubleClickEvent]);
4988 if (eh != null) eh (this, e);
4991 protected virtual void OnRowDividerHeightChanged (DataGridViewRowEventArgs e)
4993 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowDividerHeightChangedEvent]);
4994 if (eh != null) eh (this, e);
4997 protected virtual void OnRowEnter (DataGridViewCellEventArgs e)
4999 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowEnterEvent]);
5000 if (eh != null) eh (this, e);
5003 protected internal virtual void OnRowErrorTextChanged (DataGridViewRowEventArgs e)
5005 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowErrorTextChangedEvent]);
5006 if (eh != null) eh (this, e);
5009 protected virtual void OnRowErrorTextNeeded (DataGridViewRowErrorTextNeededEventArgs e)
5011 DataGridViewRowErrorTextNeededEventHandler eh = (DataGridViewRowErrorTextNeededEventHandler)(Events [RowErrorTextNeededEvent]);
5012 if (eh != null) eh (this, e);
5015 protected internal virtual void OnRowHeaderCellChanged (DataGridViewRowEventArgs e)
5017 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowHeaderCellChangedEvent]);
5018 if (eh != null) eh (this, e);
5021 protected virtual void OnRowHeaderMouseClick (DataGridViewCellMouseEventArgs e)
5023 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [RowHeaderMouseClickEvent]);
5024 if (eh != null) eh (this, e);
5027 protected virtual void OnRowHeaderMouseDoubleClick (DataGridViewCellMouseEventArgs e)
5029 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [RowHeaderMouseDoubleClickEvent]);
5030 if (eh != null) eh (this, e);
5033 protected virtual void OnRowHeadersBorderStyleChanged (EventArgs e)
5035 EventHandler eh = (EventHandler)(Events [RowHeadersBorderStyleChangedEvent]);
5036 if (eh != null) eh (this, e);
5039 protected virtual void OnRowHeadersDefaultCellStyleChanged (EventArgs e)
5041 EventHandler eh = (EventHandler)(Events [RowHeadersDefaultCellStyleChangedEvent]);
5042 if (eh != null) eh (this, e);
5045 protected virtual void OnRowHeadersWidthChanged (EventArgs e)
5047 EventHandler eh = (EventHandler)(Events [RowHeadersWidthChangedEvent]);
5048 if (eh != null) eh (this, e);
5051 protected virtual void OnRowHeadersWidthSizeModeChanged (DataGridViewAutoSizeModeEventArgs e)
5053 DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [RowHeadersWidthSizeModeChangedEvent]);
5054 if (eh != null) eh (this, e);
5057 protected internal virtual void OnRowHeightChanged (DataGridViewRowEventArgs e)
5059 UpdateRowHeightInfo (e.Row.Index, false);
5060 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowHeightChangedEvent]);
5061 if (eh != null) eh (this, e);
5064 protected virtual void OnRowHeightInfoNeeded (DataGridViewRowHeightInfoNeededEventArgs e)
5066 DataGridViewRowHeightInfoNeededEventHandler eh = (DataGridViewRowHeightInfoNeededEventHandler)(Events [RowHeightInfoNeededEvent]);
5067 if (eh != null) eh (this, e);
5070 protected virtual void OnRowHeightInfoPushed (DataGridViewRowHeightInfoPushedEventArgs e)
5072 DataGridViewRowHeightInfoPushedEventHandler eh = (DataGridViewRowHeightInfoPushedEventHandler)(Events [RowHeightInfoPushedEvent]);
5073 if (eh != null) eh (this, e);
5076 protected virtual void OnRowLeave (DataGridViewCellEventArgs e)
5078 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowLeaveEvent]);
5079 if (eh != null) eh (this, e);
5082 protected internal virtual void OnRowMinimumHeightChanged (DataGridViewRowEventArgs e)
5084 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowMinimumHeightChangedEvent]);
5085 if (eh != null) eh (this, e);
5088 protected internal virtual void OnRowPostPaint (DataGridViewRowPostPaintEventArgs e)
5090 DataGridViewRowPostPaintEventHandler eh = (DataGridViewRowPostPaintEventHandler)(Events [RowPostPaintEvent]);
5091 if (eh != null) eh (this, e);
5094 protected internal virtual void OnRowPrePaint (DataGridViewRowPrePaintEventArgs e)
5096 DataGridViewRowPrePaintEventHandler eh = (DataGridViewRowPrePaintEventHandler)(Events [RowPrePaintEvent]);
5097 if (eh != null) eh (this, e);
5100 internal void OnRowsAddedInternal (DataGridViewRowsAddedEventArgs e)
5102 if (hover_cell != null && hover_cell.RowIndex >= e.RowIndex)
5105 // Select the first row if we are not databound.
5106 // If we are databound selection is managed by the data manager.
5107 if (IsHandleCreated && DataManager == null && CurrentCell == null && Rows.Count > 0 && Columns.Count > 0)
5108 MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, false, false, true);
5110 AutoResizeColumnsInternal ();
5112 for (int i = 0; i < e.RowCount; i++)
5113 UpdateRowHeightInfo (e.RowIndex + i, false);
5120 protected virtual void OnRowsAdded (DataGridViewRowsAddedEventArgs e)
5122 DataGridViewRowsAddedEventHandler eh = (DataGridViewRowsAddedEventHandler)(Events [RowsAddedEvent]);
5123 if (eh != null) eh (this, e);
5126 protected virtual void OnRowsDefaultCellStyleChanged (EventArgs e)
5128 EventHandler eh = (EventHandler)(Events [RowsDefaultCellStyleChangedEvent]);
5129 if (eh != null) eh (this, e);
5132 internal void OnRowsPreRemovedInternal (DataGridViewRowsRemovedEventArgs e)
5134 // All removed rows should be removed from the selection too.
5135 if (selected_rows != null)
5137 int lastRowIndex = e.RowIndex + e.RowCount;
5138 for (int rowIndex = e.RowIndex; rowIndex < lastRowIndex; ++rowIndex)
5139 SetSelectedRowCore (rowIndex, false);
5142 if (Rows.Count - e.RowCount <= 0) {
5143 MoveCurrentCell (-1, -1, true, false, false, true);
5145 } else if (Columns.Count == 0) {
5146 MoveCurrentCell (-1, -1, true, false, false, true);
5148 } else if (currentCell != null && currentCell.RowIndex == e.RowIndex) {
5149 int nextRowIndex = e.RowIndex;
5150 if (nextRowIndex >= Rows.Count - e.RowCount)
5151 nextRowIndex = Rows.Count - 1 - e.RowCount;
5152 MoveCurrentCell (currentCell != null ? currentCell.ColumnIndex : 0, nextRowIndex,
5153 true, false, false, true);
5154 if (hover_cell != null && hover_cell.RowIndex >= e.RowIndex)
5159 internal void OnRowsPostRemovedInternal (DataGridViewRowsRemovedEventArgs e)
5165 protected virtual void OnRowsRemoved (DataGridViewRowsRemovedEventArgs e)
5167 DataGridViewRowsRemovedEventHandler eh = (DataGridViewRowsRemovedEventHandler)(Events [RowsRemovedEvent]);
5168 if (eh != null) eh (this, e);
5171 protected internal virtual void OnRowStateChanged (int rowIndex, DataGridViewRowStateChangedEventArgs e)
5173 DataGridViewRowStateChangedEventHandler eh = (DataGridViewRowStateChangedEventHandler)(Events [RowStateChangedEvent]);
5174 if (eh != null) eh (this, e);
5177 protected virtual void OnRowUnshared (DataGridViewRowEventArgs e)
5179 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowUnsharedEvent]);
5180 if (eh != null) eh (this, e);
5183 protected virtual void OnRowValidated (DataGridViewCellEventArgs e)
5185 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowValidatedEvent]);
5186 if (eh != null) eh (this, e);
5189 protected virtual void OnRowValidating (DataGridViewCellCancelEventArgs e)
5191 DataGridViewCellCancelEventHandler eh = (DataGridViewCellCancelEventHandler)(Events [RowValidatingEvent]);
5192 if (eh != null) eh (this, e);
5195 protected virtual void OnScroll (ScrollEventArgs e)
5197 ScrollEventHandler eh = (ScrollEventHandler)(Events [ScrollEvent]);
5198 if (eh != null) eh (this, e);
5201 protected virtual void OnSelectionChanged (EventArgs e)
5203 EventHandler eh = (EventHandler)(Events [SelectionChangedEvent]);
5204 if (eh != null) eh (this, e);
5207 protected virtual void OnSortCompare (DataGridViewSortCompareEventArgs e) {
5208 DataGridViewSortCompareEventHandler eh = (DataGridViewSortCompareEventHandler)(Events [SortCompareEvent]);
5209 if (eh != null) eh (this, e);
5212 protected virtual void OnSorted (EventArgs e)
5214 EventHandler eh = (EventHandler)(Events [SortedEvent]);
5215 if (eh != null) eh (this, e);
5218 protected virtual void OnUserAddedRow (DataGridViewRowEventArgs e)
5220 PrepareEditingRow (false, false);
5222 new_row_editing = true;
5223 if (DataManager != null) {
5224 // Switch the current editing row with a real one
5225 if (editing_row != null) {
5226 Rows.RemoveInternal (editing_row);
5229 DataManager.AddNew (); // will raise OnListPositionChanged
5232 e = new DataGridViewRowEventArgs (Rows[NewRowIndex]);
5233 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [UserAddedRowEvent]);
5234 if (eh != null) eh (this, e);
5237 protected virtual void OnUserDeletedRow (DataGridViewRowEventArgs e)
5239 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [UserDeletedRowEvent]);
5240 if (eh != null) eh (this, e);
5243 protected virtual void OnUserDeletingRow (DataGridViewRowCancelEventArgs e)
5245 DataGridViewRowCancelEventHandler eh = (DataGridViewRowCancelEventHandler)(Events [UserDeletingRowEvent]);
5246 if (eh != null) eh (this, e);
5249 protected override void OnValidating (CancelEventArgs e)
5251 base.OnValidating(e);
5254 protected override void OnVisibleChanged (EventArgs e)
5256 base.OnVisibleChanged(e);
5259 protected virtual void PaintBackground (Graphics graphics, Rectangle clipBounds, Rectangle gridBounds)
5261 graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (backgroundColor), gridBounds);
5264 protected bool ProcessAKey (Keys keyData)
5269 if ((keyData & Keys.Control) == Keys.Control) {
5277 protected virtual bool ProcessDataGridViewKey (KeyEventArgs e)
5279 switch (e.KeyData & ~Keys.Modifiers) {
5281 return ProcessAKey (e.KeyData);
5283 return ProcessDeleteKey (e.KeyData);
5285 return ProcessDownKey (e.KeyData);
5287 return ProcessEscapeKey (e.KeyData);
5289 return ProcessEndKey (e.KeyData);
5291 return ProcessEnterKey (e.KeyData);
5293 return ProcessF2Key (e.KeyData);
5295 return ProcessHomeKey (e.KeyData);
5297 return ProcessLeftKey (e.KeyData);
5299 return ProcessNextKey (e.KeyData);
5301 return ProcessPriorKey (e.KeyData);
5303 return ProcessRightKey (e.KeyData);
5305 return ProcessSpaceKey (e.KeyData);
5307 return ProcessTabKey (e.KeyData);
5309 return ProcessUpKey (e.KeyData);
5312 return ProcessZeroKey (e.KeyData);
5318 protected bool ProcessDeleteKey (Keys keyData)
5320 if (!AllowUserToDeleteRows || SelectedRows.Count == 0)
5323 for (int i = SelectedRows.Count - 1; i >= 0; i--) {
5324 DataGridViewRow row = SelectedRows[i];
5329 if (hover_cell != null && hover_cell.OwningRow == row)
5332 if (DataManager != null)
5333 DataManager.RemoveAt (row.Index);
5335 Rows.RemoveAt (row.Index);
5341 protected override bool ProcessDialogKey (Keys keyData)
5345 case Keys.Shift | Keys.Tab:
5347 return base.ProcessDialogKey (keyData & ~Keys.Control);
5349 if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
5353 case Keys.Control | Keys.Tab:
5354 case Keys.Control | Keys.Shift | Keys.Tab:
5356 return base.ProcessDialogKey (keyData & ~Keys.Control);
5358 if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
5364 if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
5370 return base.ProcessDialogKey(keyData);
5373 protected bool ProcessDownKey (Keys keyData)
5375 int current_row = CurrentCellAddress.Y;
5377 if (current_row < Rows.Count - 1) {
5378 // Move to the last cell in the column
5379 if ((keyData & Keys.Control) == Keys.Control)
5380 MoveCurrentCell (CurrentCellAddress.X, Rows.Count - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5381 // Move one cell down
5383 MoveCurrentCell (CurrentCellAddress.X, current_row + 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5391 protected bool ProcessEndKey (Keys keyData)
5393 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5395 // Move to the last cell in the control
5396 if ((keyData & Keys.Control) == Keys.Control) {
5397 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), Rows.Count - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5401 // Move to the last cell in the row
5402 if (disp_index < Columns.Count - 1) {
5403 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5410 protected bool ProcessEnterKey (Keys keyData)
5412 if (ProcessDownKey (keyData))
5415 // ProcessDown may fail if we are on the last row,
5416 // but Enter should still EndEdit if this is the last row
5421 protected bool ProcessEscapeKey (Keys keyData)
5423 if (!IsCurrentCellInEditMode)
5430 protected bool ProcessF2Key (Keys keyData)
5432 if (editMode == DataGridViewEditMode.EditOnF2 || editMode == DataGridViewEditMode.EditOnKeystrokeOrF2) {
5440 protected bool ProcessHomeKey (Keys keyData)
5442 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5444 // Move to the first cell in the control
5445 if ((keyData & Keys.Control) == Keys.Control) {
5446 MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5450 // Move to the first cell in the row
5451 if (disp_index > 0) {
5452 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5459 [MonoInternalNote ("What does insert do?")]
5460 protected bool ProcessInsertKey (Keys keyData)
5465 protected override bool ProcessKeyEventArgs (ref Message m)
5467 DataGridViewCell cell = CurrentCell;
5470 if (cell.KeyEntersEditMode (new KeyEventArgs (((Keys)m.WParam.ToInt32 ()) | XplatUI.State.ModifierKeys)))
5472 if (EditingControl != null && ((Msg)m.Msg == Msg.WM_KEYDOWN || (Msg)m.Msg == Msg.WM_CHAR))
5473 XplatUI.SendMessage (EditingControl.Handle, (Msg)m.Msg, m.WParam, m.LParam);
5476 return base.ProcessKeyEventArgs (ref m);
5479 protected override bool ProcessKeyPreview (ref Message m)
5481 if ((Msg)m.Msg == Msg.WM_KEYDOWN && (IsCurrentCellInEditMode || m.HWnd == horizontalScrollBar.Handle || m.HWnd == verticalScrollBar.Handle)) {
5482 KeyEventArgs e = new KeyEventArgs (((Keys)m.WParam.ToInt32 ()) | XplatUI.State.ModifierKeys);
5484 IDataGridViewEditingControl ctrl = (IDataGridViewEditingControl)EditingControlInternal;
5487 if (ctrl.EditingControlWantsInputKey (e.KeyData, false))
5490 switch (e.KeyData) {
5499 return ProcessDataGridViewKey (e);
5503 return base.ProcessKeyPreview (ref m);
5506 protected bool ProcessLeftKey (Keys keyData)
5508 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5510 if (disp_index > 0) {
5511 // Move to the first cell in the row
5512 if ((keyData & Keys.Control) == Keys.Control)
5513 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5514 // Move one cell to the left
5516 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5525 protected bool ProcessNextKey (Keys keyData)
5527 int current_row = CurrentCellAddress.Y;
5529 if (current_row < Rows.Count - 1) {
5530 // Move one "page" of cells down
5531 int new_row = Math.Min (Rows.Count - 1, current_row + DisplayedRowCount (false));
5533 MoveCurrentCell (CurrentCellAddress.X, new_row, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5542 protected bool ProcessPriorKey (Keys keyData)
5544 int current_row = CurrentCellAddress.Y;
5546 if (current_row > 0) {
5547 // Move one "page" of cells up
5548 int new_row = Math.Max (0, current_row - DisplayedRowCount (false));
5550 MoveCurrentCell (CurrentCellAddress.X, new_row, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5558 protected bool ProcessRightKey (Keys keyData)
5560 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5562 if (disp_index < Columns.Count - 1) {
5563 // Move to the last cell in the row
5564 if ((keyData & Keys.Control) == Keys.Control)
5565 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5566 // Move one cell to the right
5568 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index + 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5576 protected bool ProcessSpaceKey (Keys keyData)
5578 if ((keyData & Keys.Shift) == Keys.Shift) {
5579 if (selectionMode == DataGridViewSelectionMode.RowHeaderSelect) {
5580 SetSelectedRowCore (CurrentCellAddress.Y, true);
5581 InvalidateRow (CurrentCellAddress.Y);
5584 if (selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect) {
5585 SetSelectedColumnCore (CurrentCellAddress.X, true);
5586 InvalidateColumn (CurrentCellAddress.X);
5591 if (CurrentCell is DataGridViewButtonCell || CurrentCell is DataGridViewLinkCell || CurrentCell is DataGridViewCheckBoxCell) {
5592 DataGridViewCellEventArgs e = new DataGridViewCellEventArgs (CurrentCell.ColumnIndex, CurrentCell.RowIndex);
5595 OnCellContentClick (e);
5597 if (CurrentCell is DataGridViewButtonCell)
5598 (CurrentCell as DataGridViewButtonCell).OnClickInternal (e);
5599 if (CurrentCell is DataGridViewCheckBoxCell)
5600 (CurrentCell as DataGridViewCheckBoxCell).OnClickInternal (e);
5608 protected bool ProcessTabKey (Keys keyData)
5610 Form f = FindForm ();
5613 f.ActivateFocusCues ();
5615 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5618 // Shift-tab goes backwards
5619 if ((keyData & Keys.Shift) == Keys.Shift) {
5620 if (disp_index > 0) {
5621 // Move one cell to the left
5622 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, false, true);
5624 } else if (currentCellAddress.Y > 0) {
5625 // Move to the last cell in the previous row
5626 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y - 1, true, false, false, true);
5631 if (disp_index < Columns.Count - 1) {
5632 // Move one cell to the right
5633 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index + 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, false, true);
5636 } else if (currentCellAddress.Y < Rows.Count - 1) {
5637 // Move to the first cell in the next row
5638 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y + 1, true, false, false, true);
5648 protected bool ProcessUpKey (Keys keyData)
5650 int current_row = CurrentCellAddress.Y;
5652 if (current_row > 0) {
5653 // Move to the first cell in the column
5654 if ((keyData & Keys.Control) == Keys.Control)
5655 MoveCurrentCell (CurrentCellAddress.X, 0, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5658 MoveCurrentCell (CurrentCellAddress.X, current_row - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5666 protected bool ProcessZeroKey (Keys keyData)
5668 if ((keyData & Keys.Control) == Keys.Control && CurrentCell.EditType != null) {
5669 CurrentCell.Value = DBNull.Value;
5670 InvalidateCell (CurrentCell);
5677 protected override void SetBoundsCore (int x, int y, int width, int height, BoundsSpecified specified) {
5678 base.SetBoundsCore(x, y, width, height, specified);
5681 [MonoTODO ("Does not use validateCurrentCell")]
5682 protected virtual bool SetCurrentCellAddressCore (int columnIndex, int rowIndex, bool setAnchorCellAddress, bool validateCurrentCell, bool throughMouseClick)
5684 if ((columnIndex < 0 || columnIndex > Columns.Count - 1) && rowIndex != -1)
5685 throw new ArgumentOutOfRangeException ("columnIndex");
5686 if ((rowIndex < 0 || rowIndex > Rows.Count - 1) && columnIndex != -1)
5687 throw new ArgumentOutOfRangeException ("rowIndex");
5689 DataGridViewCell cell;
5691 if (columnIndex == -1 && rowIndex == -1)
5694 cell = Rows.SharedRow (rowIndex).Cells[columnIndex];
5696 if (cell != null && !cell.Visible)
5697 throw new InvalidOperationException ("cell is not visible");
5699 // Always update the current cell address property
5700 // If the row has moved it would be out of date.
5701 if (currentCell != null) {
5702 if (setAnchorCellAddress) {
5703 anchor_cell.X = currentCell.ColumnIndex;
5704 anchor_cell.Y = currentCell.RowIndex;
5706 currentCellAddress.X = currentCell.ColumnIndex;
5707 currentCellAddress.Y = currentCell.RowIndex;
5710 if (cell != currentCell) {
5711 if (currentCell != null) {
5712 if (currentCell.IsInEditMode) {
5715 else if (currentCell.RowIndex == NewRowIndex && new_row_editing)
5718 // CancelEdit will replace the uncommited real editing row with a place holder row
5719 if (new_row_editing && currentCell.RowIndex == NewRowIndex)
5722 OnCellLeave (new DataGridViewCellEventArgs(currentCell.ColumnIndex, currentCell.RowIndex));
5723 OnRowLeave (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
5727 if (setAnchorCellAddress)
5728 anchor_cell = new Point (columnIndex, rowIndex);
5729 currentCellAddress = new Point (columnIndex, rowIndex);
5732 UpdateBindingPosition (cell.RowIndex);
5733 OnRowEnter (new DataGridViewCellEventArgs (cell.ColumnIndex, cell.RowIndex));
5734 OnCellEnter (new DataGridViewCellEventArgs(cell.ColumnIndex, cell.RowIndex));
5736 OnCurrentCellChanged (EventArgs.Empty);
5739 // If the user begins an edit in the NewRow, add a new real row
5740 if (AllowUserToAddRows && cell.RowIndex == NewRowIndex && !is_binding && !new_row_editing) {
5741 // OnUserAddedRow will add a real row and reset the current cell
5742 OnUserAddedRow (new DataGridViewRowEventArgs (Rows[NewRowIndex]));
5744 if (editMode == DataGridViewEditMode.EditOnEnter)
5749 if (cell != null && throughMouseClick)
5756 protected virtual void SetSelectedCellCore (int columnIndex, int rowIndex, bool selected) {
5757 rows [rowIndex].Cells [columnIndex].Selected = selected;
5759 OnSelectionChanged (EventArgs.Empty);
5762 internal void SetSelectedColumnCoreInternal (int columnIndex, bool selected) {
5763 SetSelectedColumnCore (columnIndex, selected);
5766 protected virtual void SetSelectedColumnCore (int columnIndex, bool selected) {
5767 if (selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect && selectionMode != DataGridViewSelectionMode.FullColumnSelect)
5770 DataGridViewColumn col = columns [columnIndex];
5772 col.SelectedInternal = selected;
5774 if (selected_columns == null)
5775 selected_columns = new DataGridViewSelectedColumnCollection ();
5777 bool selectionChanged = false;
5778 if (!selected && selected_columns.Contains (col)) {
5779 selected_columns.InternalRemove (col);
5780 selectionChanged = true;
5781 } else if (selected && !selected_columns.Contains (col)) {
5782 selected_columns.InternalAdd (col);
5783 selectionChanged = true;
5786 if (selectionChanged)
5787 OnSelectionChanged (EventArgs.Empty);
5792 internal void SetSelectedRowCoreInternal (int rowIndex, bool selected) {
5793 if (rowIndex >= 0 && rowIndex < Rows.Count)
5794 SetSelectedRowCore (rowIndex, selected);
5797 protected virtual void SetSelectedRowCore (int rowIndex, bool selected) {
5798 DataGridViewRow row = rows [rowIndex];
5800 row.SelectedInternal = selected;
5802 if (selected_rows == null)
5803 selected_rows = new DataGridViewSelectedRowCollection (this);
5805 bool selectionChanged = false;
5806 if (!selected && selected_rows.Contains (row)) {
5807 selected_rows.InternalRemove (row);
5808 selectionChanged = true;
5809 } else if (selected && !selected_rows.Contains (row)) {
5810 selected_rows.InternalAdd (row);
5811 selectionChanged = true;
5814 if (selectionChanged)
5815 OnSelectionChanged (EventArgs.Empty);
5820 protected override void WndProc (ref Message m)
5822 base.WndProc (ref m);
5825 internal void InternalOnCellClick (DataGridViewCellEventArgs e)
5830 internal void InternalOnCellContentClick (DataGridViewCellEventArgs e)
5832 OnCellContentClick (e);
5835 internal void InternalOnCellContentDoubleClick (DataGridViewCellEventArgs e)
5837 OnCellContentDoubleClick (e);
5840 internal void InternalOnCellValueChanged (DataGridViewCellEventArgs e)
5842 OnCellValueChanged (e);
5845 internal void InternalOnDataError (DataGridViewDataErrorEventArgs e)
5847 /////////////// false? ////////////
5848 OnDataError (false, e);
5851 internal void InternalOnMouseWheel (MouseEventArgs e)
5856 internal void OnHScrollBarScroll (object sender, ScrollEventArgs e)
5858 int lastRightVisibleColumntIndex = Columns.Count - DisplayedColumnCount (false);
5859 horizontalScrollingOffset = e.NewValue;
5862 for (int index = 0; index < Columns.Count; index++) {
5863 DataGridViewColumn col = Columns[index];
5865 if (col.Index >= lastRightVisibleColumntIndex) {
5866 first_col_index = lastRightVisibleColumntIndex;
5869 } else if (e.NewValue < left + col.Width) {
5870 if (first_col_index != index) {
5871 first_col_index = index;
5883 internal void OnVScrollBarScroll (object sender, ScrollEventArgs e)
5885 verticalScrollingOffset = e.NewValue;
5886 if (Rows.Count == 0)
5890 int lastTopVisibleRowIndex = Rows.Count - DisplayedRowCount (false);
5892 for (int index = 0; index < Rows.Count; index++) {
5893 DataGridViewRow row = Rows[index];
5897 if (row.Index >= lastTopVisibleRowIndex) {
5898 first_row_index = lastTopVisibleRowIndex;
5901 } else if (e.NewValue < top + row.Height) {
5902 if (first_row_index != index) {
5903 first_row_index = index;
5914 first_row_index = lastTopVisibleRowIndex;
5919 internal void RaiseCellStyleChanged (DataGridViewCellEventArgs e) {
5920 OnCellStyleChanged(e);
5923 internal void OnColumnCollectionChanged (object sender, CollectionChangeEventArgs e) {
5925 case CollectionChangeAction.Add:
5926 OnColumnAddedInternal(new DataGridViewColumnEventArgs(e.Element as DataGridViewColumn));
5928 case CollectionChangeAction.Remove:
5929 OnColumnPostRemovedInternal(new DataGridViewColumnEventArgs(e.Element as DataGridViewColumn));
5931 case CollectionChangeAction.Refresh:
5933 MoveCurrentCell (-1, -1, true, false, false, true);
5938 // Resizes all columns according to their AutoResizeMode property.
5939 // First all the columns that aren't Filled are resized, then we resize all the Filled columns.
5940 internal void AutoResizeColumnsInternal ()
5942 for (int i = 0; i < Columns.Count; i++)
5943 AutoResizeColumnInternal (i, Columns [i].InheritedAutoSizeMode);
5945 AutoFillColumnsInternal ();
5948 internal void AutoFillColumnsInternal ()
5950 float totalFillWeight = 0;
5951 int FillCount = 0; // The number of columns that has AutoSizeMode.Fill set
5952 int spaceLeft = ClientSize.Width - (verticalScrollBar.VisibleInternal ? verticalScrollBar.Width : 0);
5954 if (RowHeadersVisible) {
5955 spaceLeft -= RowHeadersWidth;
5957 spaceLeft -= BorderWidth * 2;
5959 int [] fixed_widths = new int [Columns.Count];
5960 int [] new_widths = new int [Columns.Count];
5961 bool fixed_any = false;
5963 for (int i = 0; i < Columns.Count; i++) {
5964 DataGridViewColumn col = Columns [i];
5969 switch (col.InheritedAutoSizeMode) {
5970 case DataGridViewAutoSizeColumnMode.Fill:
5972 totalFillWeight += col.FillWeight;
5974 case DataGridViewAutoSizeColumnMode.AllCellsExceptHeader:
5975 case DataGridViewAutoSizeColumnMode.AllCells:
5976 case DataGridViewAutoSizeColumnMode.DisplayedCells:
5977 case DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader:
5978 case DataGridViewAutoSizeColumnMode.None:
5979 case DataGridViewAutoSizeColumnMode.NotSet:
5980 spaceLeft -= Columns [i].Width;
5985 spaceLeft = Math.Max (0, spaceLeft);
5989 for (int i = 0; i < columns.Count; i++) {
5990 DataGridViewColumn col = Columns [i];
5993 if (col.InheritedAutoSizeMode != DataGridViewAutoSizeColumnMode.Fill)
5999 if (fixed_widths [i] != 0)
6002 width = (totalFillWeight == 0) ? 0 : (int) Math.Round (spaceLeft * (col.FillWeight / totalFillWeight), 0);
6007 if (width < col.MinimumWidth) {
6008 width = col.MinimumWidth;
6009 fixed_widths [i] = width;
6012 totalFillWeight -= col.FillWeight;
6015 new_widths [i] = width;
6017 } while (fixed_any);
6019 for (int i = 0; i < columns.Count; i++) {
6020 if (Columns [i].InheritedAutoSizeMode != DataGridViewAutoSizeColumnMode.Fill)
6023 if (!Columns[i].Visible)
6026 Columns [i].Width = new_widths [i];
6030 internal void AutoResizeColumnInternal (int columnIndex, DataGridViewAutoSizeColumnMode mode)
6032 // http://msdn2.microsoft.com/en-us/library/ms171605.aspx
6035 DataGridViewColumn col = Columns [columnIndex];
6038 case DataGridViewAutoSizeColumnMode.Fill:
6040 case DataGridViewAutoSizeColumnMode.AllCellsExceptHeader:
6041 case DataGridViewAutoSizeColumnMode.AllCells:
6042 case DataGridViewAutoSizeColumnMode.DisplayedCells:
6043 case DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader:
6044 size = Math.Max (CalculateColumnCellWidth (columnIndex, col.InheritedAutoSizeMode),
6045 col.HeaderCell.ContentBounds.Width);
6047 case DataGridViewAutoSizeColumnMode.ColumnHeader:
6048 size = col.HeaderCell.ContentBounds.Width;
6057 if (size < col.MinimumWidth)
6058 size = col.MinimumWidth;
6063 internal int CalculateColumnCellWidth (int index, DataGridViewAutoSizeColumnMode mode)
6066 int last_row = Rows.Count;
6069 if (mode == DataGridViewAutoSizeColumnMode.DisplayedCells ||
6070 mode == DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader) {
6071 first_row = first_row_index;
6072 last_row = DisplayedRowCount (true);;
6075 for (int i = first_row; i < last_row; i++) {
6076 if (!Rows[i].Visible)
6079 int cell_width = Rows[i].Cells[index].PreferredSize.Width;
6080 result = Math.Max (result, cell_width);
6086 Rectangle GetHeaderCellBounds (DataGridViewHeaderCell cell)
6088 Rectangle bounds = new Rectangle (ClientRectangle.Location, cell.Size);
6089 if (cell is DataGridViewColumnHeaderCell) {
6090 if (RowHeadersVisible)
6091 bounds.X += RowHeadersWidth;
6092 List<DataGridViewColumn> sortedColumns = columns.ColumnDisplayIndexSortedArrayList;
6093 for (int index = first_col_index; index < sortedColumns.Count; index++) {
6094 DataGridViewColumn column = sortedColumns [index];
6095 if (column.Index == cell.ColumnIndex)
6097 bounds.X += column.Width;
6100 if (ColumnHeadersVisible)
6101 bounds.Y += ColumnHeadersHeight;
6102 for (int index = first_row_index; index < Rows.Count; index++) {
6103 DataGridViewRow row = GetRowInternal (index);
6104 if (row.HeaderCell == cell)
6106 bounds.Y += row.Height;
6112 private void PrepareEditingRow (bool cell_changed, bool column_changed)
6114 if (new_row_editing)
6119 show = ColumnCount > 0 && AllowUserToAddRows;
6122 RemoveEditingRow ();
6124 if (editing_row != null && (cell_changed || column_changed)) {
6125 // The row changed, it's no longer an editing row.
6127 // The number of columns has changed, we need a new editing row.
6128 RemoveEditingRow ();
6130 if (editing_row == null) {
6131 editing_row = RowTemplateFull;
6132 Rows.AddInternal (editing_row, false);
6137 internal void RemoveEditingRow ()
6139 if (editing_row != null) {
6140 if (Rows.Contains (editing_row))
6141 Rows.RemoveInternal (editing_row);
6146 internal DataGridViewRow EditingRow {
6147 get { return editing_row; }
6150 private void AddBoundRow (object element)
6152 // Don't add rows if there are no columns
6153 if (ColumnCount == 0)
6156 DataGridViewRow row = (DataGridViewRow)RowTemplateFull;
6157 rows.AddInternal (row, false);
6160 private bool IsColumnAlreadyBound (string name)
6162 foreach (DataGridViewColumn col in Columns)
6163 if (String.Compare (col.DataPropertyName, name, true) == 0)
6169 private DataGridViewColumn CreateColumnByType (Type type)
6171 if (type == typeof (bool))
6172 return new DataGridViewCheckBoxColumn ();
6173 else if (typeof(Bitmap).IsAssignableFrom (type))
6174 return new DataGridViewImageColumn ();
6176 return new DataGridViewTextBoxColumn ();
6179 private void ClearBinding ()
6181 if (IsCurrentCellInEditMode && !EndEdit ())
6183 MoveCurrentCell (-1, -1, false, false, false, true);
6185 if (DataManager != null) {
6186 DataManager.ListChanged -= OnListChanged;
6187 DataManager.PositionChanged -= OnListPositionChanged;
6188 columns.ClearAutoGeneratedColumns ();
6190 RemoveEditingRow ();
6194 private void ResetRows ()
6197 RemoveEditingRow ();
6198 if (DataManager != null) {
6199 foreach (object element in DataManager.List)
6200 AddBoundRow (element);
6202 PrepareEditingRow (false, true);
6203 OnListPositionChanged (this, EventArgs.Empty);
6206 private void DoBinding ()
6208 /* 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:
6209 - the System.Collections.IList interface, including one-dimensional arrays.
6210 - the System.ComponentModel.IListSource interface, such as the System.Data.DataTable and System.Data.DataSet classes.
6211 - the System.ComponentModel.IBindingList interface, such as the System.ComponentModel.Collections.BindingList<> class.
6212 - the System.ComponentModel.IBindingListView interface, such as the System.Windows.Forms.BindingSource class.
6215 if (dataSource != null && DataManager != null) {
6216 if (autoGenerateColumns) {
6217 is_autogenerating_columns = true;
6219 foreach (PropertyDescriptor property in DataManager.GetItemProperties()) {
6220 // This keeps out things like arrays
6221 if ((typeof(ICollection).IsAssignableFrom (property.PropertyType)))
6223 if (!property.IsBrowsable)
6226 if (IsColumnAlreadyBound (property.Name))
6229 DataGridViewColumn col = CreateColumnByType (property.PropertyType);
6230 col.Name = property.DisplayName;
6231 col.DataPropertyName = property.Name;
6232 col.ReadOnly = !DataManager.AllowEdit || property.IsReadOnly;
6233 col.ValueType = property.PropertyType;
6234 col.AutoGenerated = true;
6238 is_autogenerating_columns = false;
6241 // DataBind both autogenerated and not columns if there is a matching property
6242 foreach (DataGridViewColumn column in columns)
6243 column.DataColumnIndex = FindDataColumnIndex (column);
6245 foreach (object element in DataManager.List)
6246 AddBoundRow (element);
6248 DataManager.ListChanged += OnListChanged;
6249 DataManager.PositionChanged += OnListPositionChanged;
6250 OnDataBindingComplete (new DataGridViewBindingCompleteEventArgs (ListChangedType.Reset));
6251 OnListPositionChanged (this, EventArgs.Empty);
6253 if (Rows.Count > 0 && Columns.Count > 0)
6254 MoveCurrentCell (0, 0, true, false, false, false);
6257 PrepareEditingRow (false, true);
6260 private void MoveCurrentCell (int x, int y, bool select, bool isControl, bool isShift, bool scroll)
6262 if (x == -1 || y == -1)
6265 if (x < 0 || x > Columns.Count - 1)
6266 throw new ArgumentOutOfRangeException ("x");
6267 if (y < 0 || y > Rows.Count - 1)
6268 throw new ArgumentOutOfRangeException ("y");
6270 if (!Rows[y].Visible) {
6271 for (int i = y; i < Rows.Count; i++) {
6272 if (Rows[i].Visible) {
6279 if (!Columns[x].Visible) {
6280 for (int i = x; i < Columns.Count; i++) {
6281 if (Columns[i].Visible) {
6288 // in case either no visible columns or rows
6289 if (!Rows[y].Visible || !Columns[x].Visible)
6293 if (!SetCurrentCellAddressCore (x, y, true, false, false)) {
6297 if (x == -1 && y == -1) {
6302 bool full_row_selected = Rows.SharedRow(CurrentCellAddress.Y).Selected;
6303 bool full_col_selected = Columns[CurrentCellAddress.X].Selected;
6306 DataGridViewSelectionMode mode = selectionMode;
6308 // If we are row header select and we clicked a row header, use full row
6309 if (mode == DataGridViewSelectionMode.RowHeaderSelect && (x == -1 || (full_row_selected && CurrentCellAddress.X == x)))
6310 mode = DataGridViewSelectionMode.FullRowSelect;
6311 else if (mode == DataGridViewSelectionMode.RowHeaderSelect)
6312 mode = DataGridViewSelectionMode.CellSelect;
6314 // If we are col header select and we clicked a col header, use full col
6315 if (mode == DataGridViewSelectionMode.ColumnHeaderSelect && (y == -1 || (full_col_selected && CurrentCellAddress.Y == y)))
6316 mode = DataGridViewSelectionMode.FullColumnSelect;
6317 else if (mode == DataGridViewSelectionMode.ColumnHeaderSelect)
6318 mode = DataGridViewSelectionMode.CellSelect;
6320 // If the current cell isn't visible, scroll to it
6322 int disp_x = ColumnIndexToDisplayIndex (x);
6323 bool scrollbarsRefreshed = false;
6324 int displayedColumnsCount = DisplayedColumnCount (false);
6327 // The trick here is that in order to avoid unnecessary calculations each time a row/column
6328 // is added/removed we recalculate the whole grid size just before the scroll to selection.
6329 if (disp_x < first_col_index) {
6330 RefreshScrollBars ();
6331 scrollbarsRefreshed = true;
6334 delta_x = horizontalScrollBar.Value;
6336 // in case the column got removed
6337 if (first_col_index >= ColumnCount)
6338 first_col_index = ColumnCount - 1;
6339 for (int i = disp_x; i < first_col_index; i++)
6340 delta_x += Columns[ColumnDisplayIndexToIndex (i)].Width;
6343 horizontalScrollBar.SafeValueSet (horizontalScrollBar.Value - delta_x);
6344 OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
6345 } else if (disp_x > first_col_index + displayedColumnsCount - 1 && disp_x != 0) {
6346 RefreshScrollBars ();
6347 scrollbarsRefreshed = true;
6349 if (disp_x == Columns.Count - 1)
6350 delta_x = horizontalScrollBar.Maximum - horizontalScrollBar.Value;
6352 for (int i = first_col_index + displayedColumnsCount - 1; i < disp_x && i != -1; i++)
6353 delta_x += Columns[ColumnDisplayIndexToIndex (i)].Width;
6355 horizontalScrollBar.SafeValueSet (horizontalScrollBar.Value + delta_x);
6356 OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
6360 int displayedRowsCount = DisplayedRowCount (false);
6363 if (disp_y < first_row_index) {
6364 if (!scrollbarsRefreshed)
6365 RefreshScrollBars ();
6368 delta_y = verticalScrollBar.Value;
6370 // in case the row got removed
6371 if (first_row_index >= RowCount)
6372 first_row_index = RowCount - 1;
6373 for (int i = disp_y; i < first_row_index; i++)
6374 delta_y += GetRowInternal (i).Height;
6377 verticalScrollBar.SafeValueSet (verticalScrollBar.Value - delta_y);
6378 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
6379 } else if (disp_y > first_row_index + displayedRowsCount - 1 && disp_y != 0) {
6380 if (!scrollbarsRefreshed)
6381 RefreshScrollBars ();
6383 if (disp_y == Rows.Count - 1)
6384 delta_y = verticalScrollBar.Maximum - verticalScrollBar.Value;
6386 for (int i = first_row_index + displayedRowsCount - 1; i < disp_y; i++)
6387 delta_y += GetRowInternal (i).Height;
6389 verticalScrollBar.SafeValueSet (verticalScrollBar.Value + delta_y);
6390 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
6397 // Clear old selection unless multi-selecting
6402 case DataGridViewSelectionMode.CellSelect:
6403 SetSelectedCellCore (x, y, true);
6405 case DataGridViewSelectionMode.FullRowSelect:
6406 SetSelectedRowCore (y, true);
6408 case DataGridViewSelectionMode.FullColumnSelect:
6409 SetSelectedColumnCore (x, true);
6416 private int ColumnIndexToDisplayIndex (int index)
6420 return Columns[index].DisplayIndex;
6423 private int ColumnDisplayIndexToIndex (int index)
6425 return Columns.ColumnDisplayIndexSortedArrayList[index].Index;
6428 private void OnListChanged (object sender, ListChangedEventArgs args)
6430 switch (args.ListChangedType) {
6431 case ListChangedType.ItemAdded:
6432 AddBoundRow (DataManager[args.NewIndex]);
6434 case ListChangedType.ItemDeleted:
6435 Rows.RemoveAtInternal (args.NewIndex);
6437 case ListChangedType.ItemChanged:
6447 private void OnListPositionChanged (object sender, EventArgs args)
6449 if (Rows.Count > 0 && Columns.Count > 0 && DataManager.Position != -1)
6450 MoveCurrentCell (currentCell != null ? currentCell.ColumnIndex : 0, DataManager.Position,
6451 true, false, false, true);
6453 MoveCurrentCell (-1, -1, true, false, false, true);
6456 private void ReBind ()
6466 ResumeLayout (true);
6471 private bool MouseOverColumnResize (int col, int mousex)
6473 if (!allowUserToResizeColumns)
6476 Rectangle col_bounds = GetCellDisplayRectangle (col, 0, false);
6478 if (mousex >= col_bounds.Right - 4 && mousex <= col_bounds.Right)
6484 private bool MouseOverRowResize (int row, int mousey)
6486 if (!allowUserToResizeRows)
6489 Rectangle row_bounds = GetCellDisplayRectangle (0, row, false);
6491 if (mousey >= row_bounds.Bottom - 4 && mousey <= row_bounds.Bottom)
6497 private void DrawVerticalResizeLine (int x)
6499 Rectangle splitter = new Rectangle (x, Bounds.Y + 3 + (ColumnHeadersVisible ? ColumnHeadersHeight : 0), 1, Bounds.Height - 3 - (ColumnHeadersVisible ? ColumnHeadersHeight : 0));
6500 XplatUI.DrawReversibleRectangle (Handle, splitter, 2);
6503 private void DrawHorizontalResizeLine (int y)
6505 Rectangle splitter = new Rectangle (Bounds.X + 3 + (RowHeadersVisible ? RowHeadersWidth : 0), y, Bounds.Width - 3 + (RowHeadersVisible ? RowHeadersWidth : 0), 1);
6506 XplatUI.DrawReversibleRectangle (Handle, splitter, 2);
6509 #region Stuff for ToolTips
6510 private void MouseEnteredErrorIcon (DataGridViewCell item)
6512 tooltip_currently_showing = item;
6513 ToolTipTimer.Start ();
6516 private void MouseLeftErrorIcon (DataGridViewCell item)
6518 ToolTipTimer.Stop ();
6519 ToolTipWindow.Hide (this);
6520 tooltip_currently_showing = null;
6523 private Timer ToolTipTimer {
6525 if (tooltip_timer == null) {
6526 tooltip_timer = new Timer ();
6527 tooltip_timer.Enabled = false;
6528 tooltip_timer.Interval = 500;
6529 tooltip_timer.Tick += new EventHandler (ToolTipTimer_Tick);
6532 return tooltip_timer;
6536 private ToolTip ToolTipWindow {
6538 if (tooltip_window == null)
6539 tooltip_window = new ToolTip ();
6541 return tooltip_window;
6545 private void ToolTipTimer_Tick (object o, EventArgs args)
6547 string tooltip = tooltip_currently_showing.ErrorText;
6549 if (!string.IsNullOrEmpty (tooltip))
6550 ToolTipWindow.Present (this, tooltip);
6552 ToolTipTimer.Stop ();
6556 private class ColumnSorter : IComparer
6562 public ColumnSorter (DataGridViewColumn column, ListSortDirection direction, bool numeric)
6564 this.column = column.Index;
6565 this.numeric_sort = numeric;
6567 if (direction == ListSortDirection.Descending)
6568 this.direction = -1;
6571 #region IComparer Members
6572 public int Compare (object x, object y)
6574 DataGridViewRow row1 = (DataGridViewRow)x;
6575 DataGridViewRow row2 = (DataGridViewRow)y;
6577 if (row1.Cells[column].ValueType == typeof (DateTime) && row2.Cells[column].ValueType == typeof (DateTime))
6578 return DateTime.Compare ((DateTime)row1.Cells[column].Value, (DateTime)row2.Cells[column].Value) * direction;
6580 object val1 = row1.Cells[column].FormattedValue;
6581 object val2 = row2.Cells[column].FormattedValue;
6582 object val1NullValue = row1.Cells[column].InheritedStyle.NullValue;
6583 object val2NullValue = row2.Cells[column].InheritedStyle.NullValue;
6585 if (val1 == val1NullValue && val2 == val2NullValue)
6587 if (val1 == val1NullValue)
6589 if (val2 == val2NullValue)
6590 return -1 * direction;
6593 return (int)(double.Parse (val1.ToString ()) - double.Parse (val2.ToString ())) * direction;
6595 return string.Compare (val1.ToString (), val2.ToString ()) * direction;
6600 public sealed class HitTestInfo {
6602 public static readonly HitTestInfo Nowhere = new HitTestInfo(-1, -1, -1, -1, DataGridViewHitTestType.None);
6604 private int columnIndex;
6605 private int columnX;
6606 private int rowIndex;
6608 private DataGridViewHitTestType type;
6610 internal HitTestInfo (int columnIndex, int columnX, int rowIndex, int rowY, DataGridViewHitTestType type) {
6611 this.columnIndex = columnIndex;
6612 this.columnX = columnX;
6613 this.rowIndex = rowIndex;
6618 public int ColumnIndex {
6619 get { return columnIndex; }
6622 public int ColumnX {
6623 get { return columnX; }
6626 public int RowIndex {
6627 get { return rowIndex; }
6631 get { return rowY; }
6634 public DataGridViewHitTestType Type {
6635 get { return type; }
6638 public override bool Equals (object value) {
6639 if (value is HitTestInfo) {
6640 HitTestInfo aux = (HitTestInfo) value;
6641 if (aux.columnIndex == columnIndex && aux.columnX == columnX && aux.rowIndex == rowIndex && aux.rowY == rowY && aux.type == type) {
6648 public override int GetHashCode () {
6649 return base.GetHashCode();
6652 public override string ToString () {
6653 return string.Format ("Type:{0}, Column:{1}, Row:{2}", type, columnIndex, rowIndex);
6658 [ComVisible (false)]
6659 public class DataGridViewControlCollection : Control.ControlCollection
6661 private DataGridView owner;
6663 public DataGridViewControlCollection (DataGridView owner) : base (owner)
6668 public override void Clear ()
6671 // This is severely buggy, just as MS' implementation is.
6673 for (int i = 0; i < Count; i++) {
6678 public void CopyTo (Control [] array, int index)
6680 base.CopyTo (array, index);
6683 public void Insert (int index, Control value)
6685 throw new NotSupportedException ();
6688 public override void Remove (Control value)
6690 if (value == owner.horizontalScrollBar)
6693 if (value == owner.verticalScrollBar)
6696 if (value == owner.editingControl)
6699 base.Remove (value);
6702 internal void RemoveInternal (Control value)
6704 base.Remove (value);
6710 [ComVisibleAttribute(true)]
6711 protected class DataGridViewAccessibleObject : ControlAccessibleObject {
6713 public DataGridViewAccessibleObject (DataGridView owner) : base (owner){
6716 public override AccessibleRole Role {
6717 get { return base.Role; }
6720 public override string Name {
6721 get { return base.Name; }
6724 public override AccessibleObject GetChild (int index) {
6725 return base.GetChild(index);
6728 public override int GetChildCount () {
6729 return base.GetChildCount();
6732 public override AccessibleObject GetFocused () {
6733 return base.GetFocused();
6736 public override AccessibleObject GetSelected () {
6737 return base.GetSelected();
6740 public override AccessibleObject HitTest (int x, int y) {
6741 return base.HitTest(x, y);
6744 public override AccessibleObject Navigate( AccessibleNavigation navigationDirection) {
6745 return base.Navigate(navigationDirection);
6751 protected class DataGridViewTopRowAccessibleObject : AccessibleObject
6753 #region Constructors
6754 public DataGridViewTopRowAccessibleObject ()
6758 public DataGridViewTopRowAccessibleObject (DataGridView owner)
6764 #region Public Methods
6765 public override AccessibleObject GetChild (int index)
6767 return base.GetChild (index);
6770 public override int GetChildCount ()
6772 return base.GetChildCount ();
6775 public override AccessibleObject Navigate (AccessibleNavigation navigationDirection)
6777 return base.Navigate (navigationDirection);
6781 #region Public Properties
6782 public override Rectangle Bounds {
6783 get { return base.Bounds; }
6786 public override string Name {
6787 get { return base.Name; }
6790 public DataGridView Owner {
6791 get { return (DataGridView)owner; }
6794 throw new InvalidOperationException ("owner has already been set");
6800 public override AccessibleObject Parent {
6801 get { return base.Parent; }
6804 public override AccessibleRole Role {
6805 get { return base.Role; }
6808 public override string Value {
6809 get { return base.Value; }