1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
23 // Pedro MartÃnez Juliá <pedromj@gmail.com>
24 // Ivan N. Zlatev <contact@i-nz.net>
30 using System.ComponentModel;
31 using System.Runtime.InteropServices;
33 using System.Reflection;
34 using System.Collections;
36 using System.Collections.Generic;
38 namespace System.Windows.Forms {
40 [ComVisibleAttribute(true)]
41 [ClassInterfaceAttribute(ClassInterfaceType.AutoDispatch)]
42 [Designer("System.Windows.Forms.Design.DataGridViewDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
43 [Editor("System.Windows.Forms.Design.DataGridViewComponentEditor, " + Consts.AssemblySystem_Design, typeof (System.ComponentModel.ComponentEditor))]
44 [ComplexBindingProperties ("DataSource", "DataMember")]
45 [DefaultEvent ("CellContentClick")]
46 [Docking (DockingBehavior.Ask)]
47 public class DataGridView : Control, ISupportInitialize, IBindableComponent, IDropTarget
50 private DataGridViewAdvancedBorderStyle adjustedTopLeftHeaderBorderStyle;
51 private DataGridViewAdvancedBorderStyle advancedCellBorderStyle;
52 private DataGridViewAdvancedBorderStyle advancedColumnHeadersBorderStyle;
53 private DataGridViewAdvancedBorderStyle advancedRowHeadersBorderStyle;
54 private bool allowUserToAddRows;
55 private bool allowUserToDeleteRows;
56 private bool allowUserToOrderColumns;
57 private bool allowUserToResizeColumns;
58 private bool allowUserToResizeRows;
59 private DataGridViewCellStyle alternatingRowsDefaultCellStyle;
60 private Point anchor_cell;
61 private bool autoGenerateColumns;
62 private bool autoSize;
63 private DataGridViewAutoSizeColumnsMode autoSizeColumnsMode;
64 private DataGridViewAutoSizeRowsMode autoSizeRowsMode;
65 private Color backColor;
66 private Color backgroundColor;
67 private Image backgroundImage;
68 private BorderStyle borderStyle;
69 private DataGridViewCellBorderStyle cellBorderStyle;
70 private DataGridViewClipboardCopyMode clipboardCopyMode;
71 private DataGridViewHeaderBorderStyle columnHeadersBorderStyle;
72 private DataGridViewCellStyle columnHeadersDefaultCellStyle;
73 private int columnHeadersHeight;
74 private DataGridViewColumnHeadersHeightSizeMode columnHeadersHeightSizeMode;
75 private bool columnHeadersVisible;
76 private DataGridViewColumnCollection columns;
77 private DataGridViewCell currentCell;
78 private Point currentCellAddress;
79 private DataGridViewRow currentRow;
80 private string dataMember;
81 private object dataSource;
82 private DataGridViewCellStyle defaultCellStyle;
83 //private Control editingControl;
84 private DataGridViewEditMode editMode;
85 private bool enableHeadersVisualStyles = true;
86 private DataGridViewCell firstDisplayedCell;
87 private int firstDisplayedScrollingColumnHiddenWidth;
88 private int firstDisplayedScrollingColumnIndex;
89 private int firstDisplayedScrollingRowIndex;
90 private Color gridColor = Color.FromKnownColor(KnownColor.ControlDark);
91 private int horizontalScrollingOffset;
92 private DataGridViewCell hover_cell = null;
93 private bool isCurrentCellDirty;
94 //private bool isCurrentRowDirty;
95 private bool multiSelect;
96 private bool readOnly;
97 private DataGridViewHeaderBorderStyle rowHeadersBorderStyle;
98 private DataGridViewCellStyle rowHeadersDefaultCellStyle;
99 private bool rowHeadersVisible;
100 private int rowHeadersWidth;
101 private DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode;
102 private DataGridViewRowCollection rows;
103 private DataGridViewCellStyle rowsDefaultCellStyle;
104 private DataGridViewRow rowTemplate;
105 private ScrollBars scrollBars;
106 private DataGridViewSelectionMode selectionMode;
107 private bool showCellErrors;
108 private bool showCellToolTips;
109 private bool showEditingIcon;
110 private bool showRowErrors;
111 private DataGridViewColumn sortedColumn = null;
112 private SortOrder sortOrder;
113 private bool standardTab;
114 private DataGridViewHeaderCell topLeftHeaderCell;
115 private Cursor userSetCursor;
116 private int verticalScrollingOffset;
117 private bool virtualMode;
118 private HScrollBar horizontalScrollBar;
119 private VScrollBar verticalScrollBar;
120 private Control editingControl;
121 private bool is_autogenerating_columns = false;
122 private bool is_binding = false;
123 private bool new_row_editing = false;
125 // These are used to implement selection behaviour with SHIFT pressed.
126 private int selected_row = -1;
127 private int selected_column = -1;
129 // Stuff for error Tooltips
130 private Timer tooltip_timer;
131 private ToolTip tooltip_window;
132 private DataGridViewCell tooltip_currently_showing;
134 private DataGridViewSelectedRowCollection selected_rows;
135 private DataGridViewSelectedColumnCollection selected_columns;
136 private DataGridViewRow editing_row;
138 private int gridWidth;
139 private int gridHeight;
141 DataGridViewHeaderCell pressed_header_cell;
142 DataGridViewHeaderCell entered_header_cell;
144 // For column/row resizing via mouse
145 private bool column_resize_active = false;
146 private bool row_resize_active = false;
147 private int resize_band = -1;
148 private int resize_band_start = 0;
149 private int resize_band_delta = 0;
151 public DataGridView ()
153 SetStyle (ControlStyles.Opaque, true);
154 //SetStyle (ControlStyles.UserMouse, true);
155 SetStyle (ControlStyles.OptimizedDoubleBuffer, true);
157 adjustedTopLeftHeaderBorderStyle = new DataGridViewAdvancedBorderStyle();
158 adjustedTopLeftHeaderBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
159 advancedCellBorderStyle = new DataGridViewAdvancedBorderStyle();
160 advancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
161 advancedColumnHeadersBorderStyle = new DataGridViewAdvancedBorderStyle();
162 advancedColumnHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
163 advancedRowHeadersBorderStyle = new DataGridViewAdvancedBorderStyle();
164 advancedRowHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
165 alternatingRowsDefaultCellStyle = new DataGridViewCellStyle();
166 allowUserToAddRows = true;
167 allowUserToDeleteRows = true;
168 allowUserToOrderColumns = false;
169 allowUserToResizeColumns = true;
170 allowUserToResizeRows = true;
171 autoGenerateColumns = true;
172 autoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
173 autoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
174 backColor = Control.DefaultBackColor;
175 backgroundColor = SystemColors.AppWorkspace;
176 borderStyle = BorderStyle.FixedSingle;
177 cellBorderStyle = DataGridViewCellBorderStyle.Single;
178 clipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithAutoHeaderText;
179 columnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
180 columnHeadersDefaultCellStyle = new DataGridViewCellStyle();
181 columnHeadersDefaultCellStyle.BackColor = SystemColors.Control;
182 columnHeadersDefaultCellStyle.ForeColor = SystemColors.WindowText;
183 columnHeadersDefaultCellStyle.SelectionBackColor = SystemColors.Highlight;
184 columnHeadersDefaultCellStyle.SelectionForeColor = SystemColors.HighlightText;
185 columnHeadersDefaultCellStyle.Font = this.Font;
186 columnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
187 columnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.True;
188 columnHeadersHeight = 23;
189 columnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
190 columnHeadersVisible = true;
191 columns = CreateColumnsInstance();
192 columns.CollectionChanged += OnColumnCollectionChanged;
193 currentCellAddress = new Point (-1, -1);
194 dataMember = String.Empty;
195 defaultCellStyle = new DataGridViewCellStyle();
196 defaultCellStyle.BackColor = SystemColors.Window;
197 defaultCellStyle.ForeColor = SystemColors.ControlText;
198 defaultCellStyle.SelectionBackColor = SystemColors.Highlight;
199 defaultCellStyle.SelectionForeColor = SystemColors.HighlightText;
200 defaultCellStyle.Font = this.Font;
201 defaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
202 defaultCellStyle.WrapMode = DataGridViewTriState.False;
203 editMode = DataGridViewEditMode.EditOnKeystrokeOrF2;
204 firstDisplayedScrollingColumnHiddenWidth = 0;
205 isCurrentCellDirty = false;
208 rowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
209 rowHeadersDefaultCellStyle = (DataGridViewCellStyle) columnHeadersDefaultCellStyle.Clone ();
210 rowHeadersVisible = true;
211 rowHeadersWidth = 41;
212 rowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing;
213 rows = CreateRowsInstance();
214 rowsDefaultCellStyle = new DataGridViewCellStyle();
215 selectionMode = DataGridViewSelectionMode.RowHeaderSelect;
216 showCellErrors = true;
217 showEditingIcon = true;
218 scrollBars = ScrollBars.Both;
219 userSetCursor = Cursor.Current;
222 horizontalScrollBar = new HScrollBar();
223 horizontalScrollBar.Scroll += OnHScrollBarScroll;
224 horizontalScrollBar.Visible = false;
226 verticalScrollBar = new VScrollBar();
227 verticalScrollBar.Scroll += OnVScrollBarScroll;
228 verticalScrollBar.Visible = false;
230 Controls.AddRange (new Control[] {horizontalScrollBar, verticalScrollBar});
233 void ISupportInitialize.BeginInit ()
237 void ISupportInitialize.EndInit ()
244 [EditorBrowsable (EditorBrowsableState.Advanced)]
245 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
246 public virtual DataGridViewAdvancedBorderStyle AdjustedTopLeftHeaderBorderStyle {
247 get { return adjustedTopLeftHeaderBorderStyle; }
251 [EditorBrowsable (EditorBrowsableState.Advanced)]
252 public DataGridViewAdvancedBorderStyle AdvancedCellBorderStyle {
253 get { return advancedCellBorderStyle; }
257 [EditorBrowsable (EditorBrowsableState.Advanced)]
258 public DataGridViewAdvancedBorderStyle AdvancedColumnHeadersBorderStyle {
259 get { return advancedColumnHeadersBorderStyle; }
263 [EditorBrowsable (EditorBrowsableState.Advanced)]
264 public DataGridViewAdvancedBorderStyle AdvancedRowHeadersBorderStyle {
265 get { return advancedRowHeadersBorderStyle; }
268 [DefaultValue (true)]
269 public bool AllowUserToAddRows {
271 if (allowUserToAddRows && DataManager != null)
272 return DataManager.AllowNew;
273 return allowUserToAddRows;
276 if (allowUserToAddRows != value) {
277 allowUserToAddRows = value;
278 OnAllowUserToAddRowsChanged(EventArgs.Empty);
279 PrepareEditingRow (false, false);
285 [DefaultValue (true)]
286 public bool AllowUserToDeleteRows {
288 if (allowUserToDeleteRows && DataManager != null)
289 return DataManager.AllowRemove;
290 return allowUserToDeleteRows;
293 if (allowUserToDeleteRows != value) {
294 allowUserToDeleteRows = value;
295 OnAllowUserToDeleteRowsChanged(EventArgs.Empty);
300 [DefaultValue (false)]
301 public bool AllowUserToOrderColumns {
302 get { return allowUserToOrderColumns; }
304 if (allowUserToOrderColumns != value) {
305 allowUserToOrderColumns = value;
306 OnAllowUserToOrderColumnsChanged(EventArgs.Empty);
311 [DefaultValue (true)]
312 public bool AllowUserToResizeColumns {
313 get { return allowUserToResizeColumns; }
315 if (allowUserToResizeColumns != value) {
316 allowUserToResizeColumns = value;
317 OnAllowUserToResizeColumnsChanged(EventArgs.Empty);
322 [DefaultValue (true)]
323 public bool AllowUserToResizeRows {
324 get { return allowUserToResizeRows; }
326 if (allowUserToResizeRows != value) {
327 allowUserToResizeRows = value;
328 OnAllowUserToResizeRowsChanged(EventArgs.Empty);
333 public DataGridViewCellStyle AlternatingRowsDefaultCellStyle {
334 get { return alternatingRowsDefaultCellStyle; }
336 if (alternatingRowsDefaultCellStyle != value) {
337 alternatingRowsDefaultCellStyle = value;
338 OnAlternatingRowsDefaultCellStyleChanged(EventArgs.Empty);
345 [EditorBrowsable (EditorBrowsableState.Advanced)]
346 [DefaultValue (true)]
347 public bool AutoGenerateColumns {
348 get { return autoGenerateColumns; }
350 if (autoGenerateColumns != value) {
351 autoGenerateColumns = value;
352 OnAutoGenerateColumnsChanged(EventArgs.Empty);
357 public override bool AutoSize {
358 get { return autoSize; }
360 if (autoSize != value) {
362 //OnAutoSizeChanged(EventArgs.Empty);
367 [DefaultValue (DataGridViewAutoSizeColumnsMode.None)]
368 public DataGridViewAutoSizeColumnsMode AutoSizeColumnsMode {
369 get { return autoSizeColumnsMode; }
371 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeColumnsMode), value)) {
372 throw new InvalidEnumArgumentException("Value is not valid DataGridViewAutoSizeColumnsMode.");
374 if (value == DataGridViewAutoSizeColumnsMode.ColumnHeader && columnHeadersVisible == false) {
375 foreach (DataGridViewColumn col in columns) {
376 if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet) {
377 throw new InvalidOperationException("Cant set this property to ColumnHeader in this DataGridView.");
381 if (value == DataGridViewAutoSizeColumnsMode.Fill) {
382 foreach (DataGridViewColumn col in columns) {
383 if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet) {
385 throw new InvalidOperationException("Cant set this property to Fill in this DataGridView.");
391 autoSizeColumnsMode = value;
392 AutoResizeColumns (value);
397 [DefaultValue (DataGridViewAutoSizeRowsMode.None)]
398 public DataGridViewAutoSizeRowsMode AutoSizeRowsMode {
399 get { return autoSizeRowsMode; }
401 if (autoSizeRowsMode != value) {
402 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeRowsMode), value)) {
403 throw new InvalidEnumArgumentException("Value is not valid DataGridViewRowsMode.");
405 if ((value == DataGridViewAutoSizeRowsMode.AllHeaders || value == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && rowHeadersVisible == false) {
406 throw new InvalidOperationException("Cant set this property to AllHeaders or DisplayedHeaders in this DataGridView.");
408 autoSizeRowsMode = value;
410 if (value == DataGridViewAutoSizeRowsMode.None)
411 foreach (DataGridViewRow row in Rows)
412 row.ResetToExplicitHeight ();
414 AutoResizeRows (value);
416 OnAutoSizeRowsModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
418 ////////////////////////////////////////////////////////////////
424 [EditorBrowsable (EditorBrowsableState.Never)]
425 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
426 public override Color BackColor {
427 get { return backColor; }
429 if (backColor != value) {
431 OnBackColorChanged(EventArgs.Empty);
436 public Color BackgroundColor {
437 get { return backgroundColor; }
439 if (backgroundColor != value) {
440 if (value == Color.Empty) {
441 throw new ArgumentException("Cant set an Empty color.");
443 backgroundColor = value;
444 OnBackgroundColorChanged(EventArgs.Empty);
450 [EditorBrowsable (EditorBrowsableState.Never)]
451 public override Image BackgroundImage {
452 get { return backgroundImage; }
454 if (backgroundImage != value) {
455 backgroundImage = value;
456 OnBackgroundImageChanged(EventArgs.Empty);
462 [EditorBrowsable (EditorBrowsableState.Never)]
463 public override ImageLayout BackgroundImageLayout {
464 get { return base.BackgroundImageLayout; }
465 set { base.BackgroundImageLayout = value; }
468 [DefaultValue (BorderStyle.FixedSingle)]
469 public BorderStyle BorderStyle {
470 get { return borderStyle; }
472 if (borderStyle != value) {
473 if (!Enum.IsDefined(typeof(BorderStyle), value)) {
474 throw new InvalidEnumArgumentException("Invalid border style.");
477 OnBorderStyleChanged(EventArgs.Empty);
482 internal int BorderWidth {
484 switch (BorderStyle) {
485 case BorderStyle.Fixed3D:
487 case BorderStyle.FixedSingle:
489 case BorderStyle.None:
497 [DefaultValue (DataGridViewCellBorderStyle.Single)]
498 public DataGridViewCellBorderStyle CellBorderStyle {
499 get { return cellBorderStyle; }
501 if (cellBorderStyle != value) {
502 if (value == DataGridViewCellBorderStyle.Custom)
503 throw new ArgumentException ("CellBorderStyle cannot be set to Custom.");
505 cellBorderStyle = value;
507 DataGridViewAdvancedBorderStyle border = new DataGridViewAdvancedBorderStyle ();
509 switch (cellBorderStyle) {
510 case DataGridViewCellBorderStyle.Single:
511 border.All = DataGridViewAdvancedCellBorderStyle.Single;
513 case DataGridViewCellBorderStyle.Raised:
514 case DataGridViewCellBorderStyle.RaisedVertical:
515 border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
516 border.Top = DataGridViewAdvancedCellBorderStyle.None;
517 border.Left = DataGridViewAdvancedCellBorderStyle.Outset;
518 border.Right = DataGridViewAdvancedCellBorderStyle.Outset;
520 case DataGridViewCellBorderStyle.Sunken:
521 border.All = DataGridViewAdvancedCellBorderStyle.Inset;
523 case DataGridViewCellBorderStyle.None:
524 border.All = DataGridViewAdvancedCellBorderStyle.None;
526 case DataGridViewCellBorderStyle.SingleVertical:
527 border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
528 border.Top = DataGridViewAdvancedCellBorderStyle.None;
529 border.Left = DataGridViewAdvancedCellBorderStyle.None;
530 border.Right = DataGridViewAdvancedCellBorderStyle.Single;
532 case DataGridViewCellBorderStyle.SunkenVertical:
533 border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
534 border.Top = DataGridViewAdvancedCellBorderStyle.None;
535 border.Left = DataGridViewAdvancedCellBorderStyle.Inset;
536 border.Right = DataGridViewAdvancedCellBorderStyle.Inset;
538 case DataGridViewCellBorderStyle.SingleHorizontal:
539 case DataGridViewCellBorderStyle.SunkenHorizontal:
540 border.Bottom = DataGridViewAdvancedCellBorderStyle.Inset;
541 border.Top = DataGridViewAdvancedCellBorderStyle.Inset;
542 border.Left = DataGridViewAdvancedCellBorderStyle.None;
543 border.Right = DataGridViewAdvancedCellBorderStyle.None;
545 case DataGridViewCellBorderStyle.RaisedHorizontal:
546 border.Bottom = DataGridViewAdvancedCellBorderStyle.Outset;
547 border.Top = DataGridViewAdvancedCellBorderStyle.Outset;
548 border.Left = DataGridViewAdvancedCellBorderStyle.None;
549 border.Right = DataGridViewAdvancedCellBorderStyle.None;
553 advancedCellBorderStyle = border;
555 OnCellBorderStyleChanged (EventArgs.Empty);
561 [DefaultValue (DataGridViewClipboardCopyMode.EnableWithAutoHeaderText)]
562 public DataGridViewClipboardCopyMode ClipboardCopyMode {
563 get { return clipboardCopyMode; }
564 set { clipboardCopyMode = value; }
568 [EditorBrowsable (EditorBrowsableState.Advanced)]
569 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
571 public int ColumnCount {
572 get { return columns.Count; }
575 throw new ArgumentOutOfRangeException("ColumnCount",
576 "ColumnCount must be >= 0.");
578 if (dataSource != null) {
579 throw new InvalidOperationException("Cant change column count if DataSource is set.");
581 if (value < columns.Count) {
582 for (int i = columns.Count -1; i >= value; i--) {
586 else if (value > columns.Count) {
587 for (int i = 0; i < value; i++) {
588 DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn ();
596 [DefaultValue (DataGridViewHeaderBorderStyle.Raised)]
597 public DataGridViewHeaderBorderStyle ColumnHeadersBorderStyle {
598 get { return columnHeadersBorderStyle; }
600 if (columnHeadersBorderStyle != value) {
601 columnHeadersBorderStyle = value;
602 OnColumnHeadersBorderStyleChanged(EventArgs.Empty);
607 [AmbientValue (null)]
608 public DataGridViewCellStyle ColumnHeadersDefaultCellStyle {
609 get { return columnHeadersDefaultCellStyle; }
611 if (columnHeadersDefaultCellStyle != value) {
612 columnHeadersDefaultCellStyle = value;
613 OnColumnHeadersDefaultCellStyleChanged(EventArgs.Empty);
619 public int ColumnHeadersHeight {
620 get { return columnHeadersHeight; }
622 if (columnHeadersHeight != value) {
624 throw new ArgumentOutOfRangeException("ColumnHeadersHeight",
625 "Column headers height cant be less than 4.");
627 if (value > 32768 ) {
628 throw new ArgumentOutOfRangeException("ColumnHeadersHeight",
629 "Column headers height cannot be more than 32768.");
631 columnHeadersHeight = value;
632 OnColumnHeadersHeightChanged(EventArgs.Empty);
634 if (columnHeadersVisible)
640 [RefreshProperties (RefreshProperties.All)]
641 [DefaultValue (DataGridViewColumnHeadersHeightSizeMode.EnableResizing)]
642 public DataGridViewColumnHeadersHeightSizeMode ColumnHeadersHeightSizeMode {
643 get { return columnHeadersHeightSizeMode; }
645 if (columnHeadersHeightSizeMode != value) {
646 if (!Enum.IsDefined(typeof(DataGridViewColumnHeadersHeightSizeMode), value)) {
647 throw new InvalidEnumArgumentException("Value is not a valid DataGridViewColumnHeadersHeightSizeMode.");
649 columnHeadersHeightSizeMode = value;
650 OnColumnHeadersHeightSizeModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
655 [DefaultValue (true)]
656 public bool ColumnHeadersVisible {
657 get { return columnHeadersVisible; }
659 if (columnHeadersVisible != value) {
660 columnHeadersVisible = value;
666 [MergableProperty (false)]
667 [Editor ("System.Windows.Forms.Design.DataGridViewColumnCollectionEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
668 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
669 public DataGridViewColumnCollection Columns {
670 get { return columns; }
674 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
675 public DataGridViewCell CurrentCell {
676 get { return currentCell; }
678 /////////////////////////////////////////////////////
679 /// *** InvalidOperationException ***
680 /// Changes to the specified cell cannot be committed
681 /// to the data cache, or the new cell is in a hidden
683 /////////////////////////////////////////////////////
685 MoveCurrentCell (-1, -1, true, false, false, true);
686 else if (value.DataGridView != this)
687 throw new ArgumentException("The cell is not in this DataGridView.");
689 MoveCurrentCell (value.OwningColumn.Index, value.OwningRow.Index, true, false, false, true);
694 public Point CurrentCellAddress {
695 get { return currentCellAddress; }
699 public DataGridViewRow CurrentRow {
701 if (currentCell != null)
702 return currentCell.OwningRow;
708 [Editor ("System.Windows.Forms.Design.DataMemberListEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
709 public string DataMember {
710 get { return dataMember; }
712 if (dataMember != value) {
716 OnDataMemberChanged(EventArgs.Empty);
721 [RefreshProperties (RefreshProperties.Repaint)]
722 [DefaultValue (null)]
723 [AttributeProvider (typeof (IListSource))]
724 public object DataSource {
725 get { return dataSource; }
727 /* 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:
728 - the System.Collections.IList interface, including one-dimensional arrays.
729 - the System.ComponentModel.IListSource interface, such as the System.Data.DataTable and System.Data.DataSet classes.
730 - the System.ComponentModel.IBindingList interface, such as the System.ComponentModel.Collections.BindingList<> class.
731 - the System.ComponentModel.IBindingListView interface, such as the System.Windows.Forms.BindingSource class.
733 if (!(value == null || value is IList || value is IListSource || value is IBindingList || value is IBindingListView))
734 throw new NotSupportedException ("Type cannot be bound.");
740 OnDataSourceChanged (EventArgs.Empty);
744 internal CurrencyManager DataManager {
746 if (DataSource != null && BindingContext != null) {
747 string dataMember = DataMember;
748 if (dataMember == null)
749 dataMember = String.Empty;
750 return (CurrencyManager) this.BindingContext[DataSource, dataMember];
756 [AmbientValue (null)]
757 public DataGridViewCellStyle DefaultCellStyle {
758 get { return defaultCellStyle; }
760 if (defaultCellStyle != value) {
761 defaultCellStyle = value;
762 OnDefaultCellStyleChanged(EventArgs.Empty);
767 public override Rectangle DisplayRectangle {
768 get { return base.DisplayRectangle; }
772 [EditorBrowsable (EditorBrowsableState.Advanced)]
773 public Control EditingControl {
775 return editingControl;
780 [EditorBrowsable (EditorBrowsableState.Advanced)]
781 public Panel EditingPanel {
782 get { throw new NotImplementedException(); }
785 [DefaultValue (DataGridViewEditMode.EditOnKeystrokeOrF2)]
786 public DataGridViewEditMode EditMode {
787 get { return editMode; }
789 if (editMode != value) {
791 OnEditModeChanged(EventArgs.Empty);
796 [DefaultValue (true)]
797 public bool EnableHeadersVisualStyles {
798 get { return enableHeadersVisualStyles; }
799 set { enableHeadersVisualStyles = value; }
802 internal DataGridViewHeaderCell EnteredHeaderCell {
803 get { return entered_header_cell; }
805 if (entered_header_cell == value)
807 if (ThemeEngine.Current.DataGridViewHeaderCellHasHotStyle (this)) {
808 Region area_to_invalidate = new Region ();
809 area_to_invalidate.MakeEmpty ();
810 if (entered_header_cell != null)
811 area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell));
812 entered_header_cell = value;
813 if (entered_header_cell != null)
814 area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell));
815 Invalidate (area_to_invalidate);
816 area_to_invalidate.Dispose ();
818 entered_header_cell = value;
823 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
824 public DataGridViewCell FirstDisplayedCell {
825 get { return firstDisplayedCell; }
827 if (value.DataGridView != this) {
828 throw new ArgumentException("The cell is not in this DataGridView.");
830 firstDisplayedCell = value;
835 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
836 [EditorBrowsable (EditorBrowsableState.Advanced)]
837 public int FirstDisplayedScrollingColumnHiddenWidth {
838 get { return firstDisplayedScrollingColumnHiddenWidth; }
842 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
843 public int FirstDisplayedScrollingColumnIndex {
844 get { return firstDisplayedScrollingColumnIndex; }
845 set { firstDisplayedScrollingColumnIndex = value; }
849 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
850 public int FirstDisplayedScrollingRowIndex {
851 get { return firstDisplayedScrollingRowIndex; }
852 set { firstDisplayedScrollingRowIndex = value; }
856 [EditorBrowsable (EditorBrowsableState.Advanced)]
857 public override Font Font {
858 get { return base.Font; }
859 set { base.Font = value; }
863 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
864 [EditorBrowsable (EditorBrowsableState.Advanced)]
865 public override Color ForeColor {
866 get { return base.ForeColor; }
867 set { base.ForeColor = value; }
870 public Color GridColor {
871 get { return gridColor; }
873 if (gridColor != value) {
874 if (value == Color.Empty) {
875 throw new ArgumentException("Cant set an Empty color.");
878 OnGridColorChanged(EventArgs.Empty);
884 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
885 public int HorizontalScrollingOffset {
886 get { return horizontalScrollingOffset; }
887 set { horizontalScrollingOffset = value; }
891 public bool IsCurrentCellDirty {
892 get { return isCurrentCellDirty; }
896 public bool IsCurrentCellInEditMode {
898 if (currentCell == null) {
901 return currentCell.IsInEditMode;
906 public bool IsCurrentRowDirty {
909 return IsCurrentCellDirty;
912 throw new NotImplementedException();
917 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
918 public DataGridViewCell this [int columnIndex, int rowIndex] {
919 get { return rows[rowIndex].Cells[columnIndex]; }
920 set { rows[rowIndex].Cells[columnIndex] = value; }
924 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
925 public DataGridViewCell this [string columnName, int rowIndex] {
927 int columnIndex = -1;
928 foreach (DataGridViewColumn col in columns) {
929 if (col.Name == columnName) {
930 columnIndex = col.Index;
934 return this[columnIndex, rowIndex];
937 int columnIndex = -1;
938 foreach (DataGridViewColumn col in columns) {
939 if (col.Name == columnName) {
940 columnIndex = col.Index;
944 this[columnIndex, rowIndex] = value;
948 [DefaultValue (true)]
949 public bool MultiSelect {
950 get { return multiSelect; }
952 if (multiSelect != value) {
954 OnMultiSelectChanged(EventArgs.Empty);
960 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
961 public int NewRowIndex {
963 if (!AllowUserToAddRows || ColumnCount == 0) {
966 return rows.Count - 1;
971 [EditorBrowsable (EditorBrowsableState.Never)]
972 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
973 public new Padding Padding {
974 get { return Padding.Empty; }
978 internal DataGridViewHeaderCell PressedHeaderCell {
979 get { return pressed_header_cell; }
983 [DefaultValue (false)]
984 public bool ReadOnly {
985 get { return readOnly; }
987 if (readOnly != value) {
989 OnReadOnlyChanged(EventArgs.Empty);
995 [EditorBrowsable (EditorBrowsableState.Advanced)]
996 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
998 public int RowCount {
999 get { return rows.Count; }
1002 throw new ArgumentException("RowCount must be >= 0.");
1004 if (value < 1 && AllowUserToAddRows) {
1005 throw new ArgumentException("RowCount must be >= 1 if AllowUserToAddRows is true.");
1007 if (dataSource != null) {
1008 throw new InvalidOperationException("Cant change row count if DataSource is set.");
1010 if (value < rows.Count) {
1011 int removeRangeEndIndex = rows.Count - 1;
1012 if (AllowUserToAddRows)
1013 removeRangeEndIndex--;
1014 int removeRangeStartIndex = removeRangeEndIndex - (value - 1);
1016 for (int i = removeRangeEndIndex; i >= removeRangeStartIndex; i--) {
1020 else if (value > rows.Count) {
1021 // If we need to add rows and don't have any columns,
1022 // we create one column
1023 if (ColumnCount == 0)
1026 for (int i = rows.Count; i < value; i++) {
1027 DataGridViewRow row = (DataGridViewRow) RowTemplateFull;
1028 rows.AddInternal (row, false);
1030 foreach (DataGridViewColumn col in columns)
1031 row.Cells.Add (col.CellTemplate.Clone () as DataGridViewCell);
1038 [DefaultValue (DataGridViewHeaderBorderStyle.Raised)]
1039 public DataGridViewHeaderBorderStyle RowHeadersBorderStyle {
1040 get { return rowHeadersBorderStyle; }
1042 if (rowHeadersBorderStyle != value) {
1043 rowHeadersBorderStyle = value;
1044 OnRowHeadersBorderStyleChanged(EventArgs.Empty);
1049 [AmbientValue (null)]
1050 public DataGridViewCellStyle RowHeadersDefaultCellStyle {
1051 get { return rowHeadersDefaultCellStyle; }
1053 if (rowHeadersDefaultCellStyle != value) {
1054 rowHeadersDefaultCellStyle = value;
1055 OnRowHeadersDefaultCellStyleChanged(EventArgs.Empty);
1060 [DefaultValue (true)]
1061 public bool RowHeadersVisible {
1062 get { return rowHeadersVisible; }
1064 if (rowHeadersVisible != value) {
1065 rowHeadersVisible = value;
1071 [Localizable (true)]
1072 public int RowHeadersWidth {
1073 get { return rowHeadersWidth; }
1075 if (rowHeadersWidth != value) {
1077 throw new ArgumentOutOfRangeException("RowHeadersWidth",
1078 "Row headers width cant be less than 4.");
1080 if (value > 32768 ) {
1081 throw new ArgumentOutOfRangeException("RowHeadersWidth",
1082 "Row headers width cannot be more than 32768.");
1084 rowHeadersWidth = value;
1085 OnRowHeadersWidthChanged(EventArgs.Empty);
1087 if (rowHeadersVisible)
1093 [RefreshProperties (RefreshProperties.All)]
1094 [DefaultValue (DataGridViewRowHeadersWidthSizeMode.EnableResizing)]
1095 public DataGridViewRowHeadersWidthSizeMode RowHeadersWidthSizeMode {
1096 get { return rowHeadersWidthSizeMode; }
1098 if (rowHeadersWidthSizeMode != value) {
1099 if (!Enum.IsDefined(typeof(DataGridViewRowHeadersWidthSizeMode), value)) {
1100 throw new InvalidEnumArgumentException("Value is not valid DataGridViewRowHeadersWidthSizeMode.");
1102 rowHeadersWidthSizeMode = value;
1103 OnRowHeadersWidthSizeModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
1109 public DataGridViewRowCollection Rows {
1110 get { return rows; }
1113 public DataGridViewCellStyle RowsDefaultCellStyle {
1114 get { return rowsDefaultCellStyle; }
1116 if (rowsDefaultCellStyle != value) {
1117 rowsDefaultCellStyle = value;
1118 OnRowsDefaultCellStyleChanged(EventArgs.Empty);
1123 // RowTemplate is just the row, it does not contain Cells
1125 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
1126 public DataGridViewRow RowTemplate {
1128 if (rowTemplate == null)
1129 rowTemplate = new DataGridViewRow ();
1134 rowTemplate = value;
1135 rowTemplate.SetDataGridView(this);
1139 // Take the RowTemplate, clone it, and add Cells
1140 // Note this is not stored, so you don't need to Clone it
1141 internal DataGridViewRow RowTemplateFull {
1143 DataGridViewRow row = (DataGridViewRow) RowTemplate.Clone ();
1145 for (int i = row.Cells.Count; i < Columns.Count; i++) {
1146 DataGridViewCell template = columns [i].CellTemplate;
1148 if (template == null)
1149 throw new InvalidOperationException ("At least one of the DataGridView control's columns has no cell template.");
1151 row.Cells.Add ((DataGridViewCell) template.Clone ());
1158 internal override bool ScaleChildrenInternal {
1159 get { return false; }
1162 [DefaultValue (ScrollBars.Both)]
1163 [Localizable (true)]
1164 public ScrollBars ScrollBars {
1165 get { return scrollBars; }
1167 if (!Enum.IsDefined(typeof(ScrollBars), value)) {
1168 throw new InvalidEnumArgumentException("Invalid ScrollBars value.");
1170 ////////////////////////////////////////////////////////////
1171 /// *** InvalidOperationException ***
1172 /// The System.Windows.Forms.DataGridView is unable to
1173 /// scroll due to a cell change that cannot be committed
1175 ///////////////////////////////////////////////////////////
1183 public DataGridViewSelectedCellCollection SelectedCells {
1185 DataGridViewSelectedCellCollection selectedCells = new DataGridViewSelectedCellCollection();
1186 foreach (DataGridViewRow row in rows) {
1187 foreach (DataGridViewCell cell in row.Cells) {
1188 if (cell.Selected) {
1189 selectedCells.InternalAdd(cell);
1193 return selectedCells;
1198 public DataGridViewSelectedColumnCollection SelectedColumns {
1201 DataGridViewSelectedColumnCollection result = new DataGridViewSelectedColumnCollection ();
1203 if (selectionMode != DataGridViewSelectionMode.FullColumnSelect && selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect)
1206 result.InternalAddRange (selected_columns);
1213 public DataGridViewSelectedRowCollection SelectedRows {
1215 DataGridViewSelectedRowCollection result = new DataGridViewSelectedRowCollection (this);
1217 if (selectionMode != DataGridViewSelectionMode.FullRowSelect && selectionMode != DataGridViewSelectionMode.RowHeaderSelect)
1220 result.InternalAddRange (selected_rows);
1227 [DefaultValue (DataGridViewSelectionMode.RowHeaderSelect)]
1228 public DataGridViewSelectionMode SelectionMode {
1229 get { return selectionMode; }
1231 if (!Enum.IsDefined (typeof(DataGridViewSelectionMode), value))
1232 throw new InvalidEnumArgumentException ("Value is not valid DataGridViewSelectionMode.");
1234 if (value == DataGridViewSelectionMode.ColumnHeaderSelect || value == DataGridViewSelectionMode.FullColumnSelect)
1235 foreach (DataGridViewColumn col in Columns)
1236 if (col.SortMode == DataGridViewColumnSortMode.Automatic)
1237 throw new InvalidOperationException (string.Format ("Cannot set SelectionMode to {0} because there are Automatic sort columns.", value));
1239 selectionMode = value;
1243 [DefaultValue (true)]
1244 public bool ShowCellErrors {
1245 get { return showCellErrors; }
1246 set { showCellErrors = value; }
1249 [DefaultValue (true)]
1250 public bool ShowCellToolTips {
1251 get { return showCellToolTips; }
1252 set { showCellToolTips = value; }
1255 [DefaultValue (true)]
1256 public bool ShowEditingIcon {
1257 get { return showEditingIcon; }
1258 set { showEditingIcon = value; }
1261 [DefaultValue (true)]
1262 public bool ShowRowErrors {
1263 get { return showRowErrors; }
1264 set { showRowErrors = value; }
1268 public DataGridViewColumn SortedColumn {
1269 get { return sortedColumn; }
1273 public SortOrder SortOrder {
1274 get { return sortOrder; }
1277 [DefaultValue (false)]
1278 [EditorBrowsable (EditorBrowsableState.Advanced)]
1279 public bool StandardTab {
1280 get { return standardTab; }
1281 set { standardTab = value; }
1286 [EditorBrowsable (EditorBrowsableState.Never)]
1287 public override string Text {
1288 get { return base.Text; }
1289 set { base.Text = value; }
1293 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1294 public DataGridViewHeaderCell TopLeftHeaderCell {
1296 if (topLeftHeaderCell == null) {
1297 topLeftHeaderCell = new DataGridViewTopLeftHeaderCell ();
1298 topLeftHeaderCell.SetDataGridView (this);
1300 return topLeftHeaderCell;
1303 if (topLeftHeaderCell == value)
1306 if (topLeftHeaderCell != null)
1307 topLeftHeaderCell.SetDataGridView (null);
1309 topLeftHeaderCell = value;
1311 if (topLeftHeaderCell != null)
1312 topLeftHeaderCell.SetDataGridView (this);
1317 [EditorBrowsable (EditorBrowsableState.Advanced)]
1318 public Cursor UserSetCursor {
1319 get { return userSetCursor; }
1323 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1324 public int VerticalScrollingOffset {
1325 get { return verticalScrollingOffset; }
1328 [MonoTODO ("VirtualMode is not supported.")]
1329 [EditorBrowsable (EditorBrowsableState.Advanced)]
1330 [DefaultValue (false)]
1331 public bool VirtualMode {
1332 get { return virtualMode; }
1333 set { virtualMode = value; }
1336 internal Control EditingControlInternal {
1338 return editingControl;
1341 if (value == editingControl)
1344 if (editingControl != null) {
1345 // Can't use Controls.Remove (editingControls), because that method
1346 // is overriden to not remove the editing control.
1347 DataGridView.DataGridViewControlCollection ctrls = Controls as DataGridView.DataGridViewControlCollection;
1348 if (ctrls != null) {
1349 ctrls.RemoveInternal (editingControl);
1351 Controls.Remove (editingControl);
1356 if (value != null) {
1357 value.Visible = false;
1358 Controls.Add (value);
1361 editingControl = value;
1365 static object AllowUserToAddRowsChangedEvent = new object ();
1366 static object AllowUserToDeleteRowsChangedEvent = new object ();
1367 static object AllowUserToOrderColumnsChangedEvent = new object ();
1368 static object AllowUserToResizeColumnsChangedEvent = new object ();
1369 static object AllowUserToResizeRowsChangedEvent = new object ();
1370 static object AlternatingRowsDefaultCellStyleChangedEvent = new object ();
1371 static object AutoGenerateColumnsChangedEvent = new object ();
1372 static object AutoSizeColumnModeChangedEvent = new object ();
1373 static object AutoSizeColumnsModeChangedEvent = new object ();
1374 static object AutoSizeRowsModeChangedEvent = new object ();
1375 static object BackgroundColorChangedEvent = new object ();
1376 static object BorderStyleChangedEvent = new object ();
1377 static object CancelRowEditEvent = new object ();
1378 static object CellBeginEditEvent = new object ();
1379 static object CellBorderStyleChangedEvent = new object ();
1380 static object CellClickEvent = new object ();
1381 static object CellContentClickEvent = new object ();
1382 static object CellContentDoubleClickEvent = new object ();
1383 static object CellContextMenuStripChangedEvent = new object ();
1384 static object CellContextMenuStripNeededEvent = new object ();
1385 static object CellDoubleClickEvent = new object ();
1386 static object CellEndEditEvent = new object ();
1387 static object CellEnterEvent = new object ();
1388 static object CellErrorTextChangedEvent = new object ();
1389 static object CellErrorTextNeededEvent = new object ();
1390 static object CellFormattingEvent = new object ();
1391 static object CellLeaveEvent = new object ();
1392 static object CellMouseClickEvent = new object ();
1393 static object CellMouseDoubleClickEvent = new object ();
1394 static object CellMouseDownEvent = new object ();
1395 static object CellMouseEnterEvent = new object ();
1396 static object CellMouseLeaveEvent = new object ();
1397 static object CellMouseMoveEvent = new object ();
1398 static object CellMouseUpEvent = new object ();
1399 static object CellPaintingEvent = new object ();
1400 static object CellParsingEvent = new object ();
1401 static object CellStateChangedEvent = new object ();
1402 static object CellStyleChangedEvent = new object ();
1403 static object CellStyleContentChangedEvent = new object ();
1404 static object CellToolTipTextChangedEvent = new object ();
1405 static object CellToolTipTextNeededEvent = new object ();
1406 static object CellValidatedEvent = new object ();
1407 static object CellValidatingEvent = new object ();
1408 static object CellValueChangedEvent = new object ();
1409 static object CellValueNeededEvent = new object ();
1410 static object CellValuePushedEvent = new object ();
1411 static object ColumnAddedEvent = new object ();
1412 static object ColumnContextMenuStripChangedEvent = new object ();
1413 static object ColumnDataPropertyNameChangedEvent = new object ();
1414 static object ColumnDefaultCellStyleChangedEvent = new object ();
1415 static object ColumnDisplayIndexChangedEvent = new object ();
1416 static object ColumnDividerDoubleClickEvent = new object ();
1417 static object ColumnDividerWidthChangedEvent = new object ();
1418 static object ColumnHeaderCellChangedEvent = new object ();
1419 static object ColumnHeaderMouseClickEvent = new object ();
1420 static object ColumnHeaderMouseDoubleClickEvent = new object ();
1421 static object ColumnHeadersBorderStyleChangedEvent = new object ();
1422 static object ColumnHeadersDefaultCellStyleChangedEvent = new object ();
1423 static object ColumnHeadersHeightChangedEvent = new object ();
1424 static object ColumnHeadersHeightSizeModeChangedEvent = new object ();
1425 static object ColumnMinimumWidthChangedEvent = new object ();
1426 static object ColumnNameChangedEvent = new object ();
1427 static object ColumnRemovedEvent = new object ();
1428 static object ColumnSortModeChangedEvent = new object ();
1429 static object ColumnStateChangedEvent = new object ();
1430 static object ColumnToolTipTextChangedEvent = new object ();
1431 static object ColumnWidthChangedEvent = new object ();
1432 static object CurrentCellChangedEvent = new object ();
1433 static object CurrentCellDirtyStateChangedEvent = new object ();
1434 static object DataBindingCompleteEvent = new object ();
1435 static object DataErrorEvent = new object ();
1436 static object DataMemberChangedEvent = new object ();
1437 static object DataSourceChangedEvent = new object ();
1438 static object DefaultCellStyleChangedEvent = new object ();
1439 static object DefaultValuesNeededEvent = new object ();
1440 static object EditingControlShowingEvent = new object ();
1441 static object EditModeChangedEvent = new object ();
1442 static object GridColorChangedEvent = new object ();
1443 static object MultiSelectChangedEvent = new object ();
1444 static object NewRowNeededEvent = new object ();
1445 static object ReadOnlyChangedEvent = new object ();
1446 static object RowContextMenuStripChangedEvent = new object ();
1447 static object RowContextMenuStripNeededEvent = new object ();
1448 static object RowDefaultCellStyleChangedEvent = new object ();
1449 static object RowDirtyStateNeededEvent = new object ();
1450 static object RowDividerDoubleClickEvent = new object ();
1451 static object RowDividerHeightChangedEvent = new object ();
1452 static object RowEnterEvent = new object ();
1453 static object RowErrorTextChangedEvent = new object ();
1454 static object RowErrorTextNeededEvent = new object ();
1455 static object RowHeaderCellChangedEvent = new object ();
1456 static object RowHeaderMouseClickEvent = new object ();
1457 static object RowHeaderMouseDoubleClickEvent = new object ();
1458 static object RowHeadersBorderStyleChangedEvent = new object ();
1459 static object RowHeadersDefaultCellStyleChangedEvent = new object ();
1460 static object RowHeadersWidthChangedEvent = new object ();
1461 static object RowHeadersWidthSizeModeChangedEvent = new object ();
1462 static object RowHeightChangedEvent = new object ();
1463 static object RowHeightInfoNeededEvent = new object ();
1464 static object RowHeightInfoPushedEvent = new object ();
1465 static object RowLeaveEvent = new object ();
1466 static object RowMinimumHeightChangedEvent = new object ();
1467 static object RowPostPaintEvent = new object ();
1468 static object RowPrePaintEvent = new object ();
1469 static object RowsAddedEvent = new object ();
1470 static object RowsDefaultCellStyleChangedEvent = new object ();
1471 static object RowsRemovedEvent = new object ();
1472 static object RowStateChangedEvent = new object ();
1473 static object RowUnsharedEvent = new object ();
1474 static object RowValidatedEvent = new object ();
1475 static object RowValidatingEvent = new object ();
1476 static object ScrollEvent = new object ();
1477 static object SelectionChangedEvent = new object ();
1478 static object SortCompareEvent = new object ();
1479 static object SortedEvent = new object ();
1480 static object UserAddedRowEvent = new object ();
1481 static object UserDeletedRowEvent = new object ();
1482 static object UserDeletingRowEvent = new object ();
1487 public event EventHandler AllowUserToAddRowsChanged {
1488 add { Events.AddHandler (AllowUserToAddRowsChangedEvent, value); }
1489 remove { Events.RemoveHandler (AllowUserToAddRowsChangedEvent, value); }
1492 public event EventHandler AllowUserToDeleteRowsChanged {
1493 add { Events.AddHandler (AllowUserToDeleteRowsChangedEvent, value); }
1494 remove { Events.RemoveHandler (AllowUserToDeleteRowsChangedEvent, value); }
1497 public event EventHandler AllowUserToOrderColumnsChanged {
1498 add { Events.AddHandler (AllowUserToOrderColumnsChangedEvent, value); }
1499 remove { Events.RemoveHandler (AllowUserToOrderColumnsChangedEvent, value); }
1502 public event EventHandler AllowUserToResizeColumnsChanged {
1503 add { Events.AddHandler (AllowUserToResizeColumnsChangedEvent, value); }
1504 remove { Events.RemoveHandler (AllowUserToResizeColumnsChangedEvent, value); }
1507 public event EventHandler AllowUserToResizeRowsChanged {
1508 add { Events.AddHandler (AllowUserToResizeRowsChangedEvent, value); }
1509 remove { Events.RemoveHandler (AllowUserToResizeRowsChangedEvent, value); }
1512 public event EventHandler AlternatingRowsDefaultCellStyleChanged {
1513 add { Events.AddHandler (AlternatingRowsDefaultCellStyleChangedEvent, value); }
1514 remove { Events.RemoveHandler (AlternatingRowsDefaultCellStyleChangedEvent, value); }
1518 [EditorBrowsable (EditorBrowsableState.Advanced)]
1519 public event EventHandler AutoGenerateColumnsChanged {
1520 add { Events.AddHandler (AutoGenerateColumnsChangedEvent, value); }
1521 remove { Events.RemoveHandler (AutoGenerateColumnsChangedEvent, value); }
1524 public event DataGridViewAutoSizeColumnModeEventHandler AutoSizeColumnModeChanged {
1525 add { Events.AddHandler (AutoSizeColumnModeChangedEvent, value); }
1526 remove { Events.RemoveHandler (AutoSizeColumnModeChangedEvent, value); }
1529 public event DataGridViewAutoSizeColumnsModeEventHandler AutoSizeColumnsModeChanged {
1530 add { Events.AddHandler (AutoSizeColumnsModeChangedEvent, value); }
1531 remove { Events.RemoveHandler (AutoSizeColumnsModeChangedEvent, value); }
1534 public event DataGridViewAutoSizeModeEventHandler AutoSizeRowsModeChanged {
1535 add { Events.AddHandler (AutoSizeRowsModeChangedEvent, value); }
1536 remove { Events.RemoveHandler (AutoSizeRowsModeChangedEvent, value); }
1540 [EditorBrowsable (EditorBrowsableState.Never)]
1541 public new event EventHandler BackColorChanged {
1542 add { base.BackColorChanged += value; }
1543 remove { base.BackColorChanged -= value; }
1546 public event EventHandler BackgroundColorChanged {
1547 add { Events.AddHandler (BackgroundColorChangedEvent, value); }
1548 remove { Events.RemoveHandler (BackgroundColorChangedEvent, value); }
1552 [EditorBrowsable (EditorBrowsableState.Never)]
1553 public new event EventHandler BackgroundImageChanged {
1554 add { base.BackgroundImageChanged += value; }
1555 remove { base.BackgroundImageChanged -= value; }
1559 [EditorBrowsable (EditorBrowsableState.Never)]
1560 public new event EventHandler BackgroundImageLayoutChanged {
1561 add { base.BackgroundImageLayoutChanged += value; }
1562 remove { base.BackgroundImageLayoutChanged -= value; }
1565 public event EventHandler BorderStyleChanged {
1566 add { Events.AddHandler (BorderStyleChangedEvent, value); }
1567 remove { Events.RemoveHandler (BorderStyleChangedEvent, value); }
1570 public event QuestionEventHandler CancelRowEdit {
1571 add { Events.AddHandler (CancelRowEditEvent, value); }
1572 remove { Events.RemoveHandler (CancelRowEditEvent, value); }
1575 public event DataGridViewCellCancelEventHandler CellBeginEdit {
1576 add { Events.AddHandler (CellBeginEditEvent, value); }
1577 remove { Events.RemoveHandler (CellBeginEditEvent, value); }
1580 public event EventHandler CellBorderStyleChanged {
1581 add { Events.AddHandler (CellBorderStyleChangedEvent, value); }
1582 remove { Events.RemoveHandler (CellBorderStyleChangedEvent, value); }
1585 public event DataGridViewCellEventHandler CellClick {
1586 add { Events.AddHandler (CellClickEvent, value); }
1587 remove { Events.RemoveHandler (CellClickEvent, value); }
1590 public event DataGridViewCellEventHandler CellContentClick {
1591 add { Events.AddHandler (CellContentClickEvent, value); }
1592 remove { Events.RemoveHandler (CellContentClickEvent, value); }
1595 public event DataGridViewCellEventHandler CellContentDoubleClick {
1596 add { Events.AddHandler (CellContentDoubleClickEvent, value); }
1597 remove { Events.RemoveHandler (CellContentDoubleClickEvent, value); }
1600 [EditorBrowsable (EditorBrowsableState.Advanced)]
1601 public event DataGridViewCellEventHandler CellContextMenuStripChanged {
1602 add { Events.AddHandler (CellContextMenuStripChangedEvent, value); }
1603 remove { Events.RemoveHandler (CellContextMenuStripChangedEvent, value); }
1606 [EditorBrowsable (EditorBrowsableState.Advanced)]
1607 public event DataGridViewCellContextMenuStripNeededEventHandler CellContextMenuStripNeeded {
1608 add { Events.AddHandler (CellContextMenuStripNeededEvent, value); }
1609 remove { Events.RemoveHandler (CellContextMenuStripNeededEvent, value); }
1612 public event DataGridViewCellEventHandler CellDoubleClick {
1613 add { Events.AddHandler (CellDoubleClickEvent, value); }
1614 remove { Events.RemoveHandler (CellDoubleClickEvent, value); }
1617 public event DataGridViewCellEventHandler CellEndEdit {
1618 add { Events.AddHandler (CellEndEditEvent, value); }
1619 remove { Events.RemoveHandler (CellEndEditEvent, value); }
1622 public event DataGridViewCellEventHandler CellEnter {
1623 add { Events.AddHandler (CellEnterEvent, value); }
1624 remove { Events.RemoveHandler (CellEnterEvent, value); }
1627 public event DataGridViewCellEventHandler CellErrorTextChanged {
1628 add { Events.AddHandler (CellErrorTextChangedEvent, value); }
1629 remove { Events.RemoveHandler (CellErrorTextChangedEvent, value); }
1632 [EditorBrowsable (EditorBrowsableState.Advanced)]
1633 public event DataGridViewCellErrorTextNeededEventHandler CellErrorTextNeeded {
1634 add { Events.AddHandler (CellErrorTextNeededEvent, value); }
1635 remove { Events.RemoveHandler (CellErrorTextNeededEvent, value); }
1638 public event DataGridViewCellFormattingEventHandler CellFormatting {
1639 add { Events.AddHandler (CellFormattingEvent, value); }
1640 remove { Events.RemoveHandler (CellFormattingEvent, value); }
1643 public event DataGridViewCellEventHandler CellLeave {
1644 add { Events.AddHandler (CellLeaveEvent, value); }
1645 remove { Events.RemoveHandler (CellLeaveEvent, value); }
1648 public event DataGridViewCellMouseEventHandler CellMouseClick {
1649 add { Events.AddHandler (CellMouseClickEvent, value); }
1650 remove { Events.RemoveHandler (CellMouseClickEvent, value); }
1653 public event DataGridViewCellMouseEventHandler CellMouseDoubleClick {
1654 add { Events.AddHandler (CellMouseDoubleClickEvent, value); }
1655 remove { Events.RemoveHandler (CellMouseDoubleClickEvent, value); }
1658 public event DataGridViewCellMouseEventHandler CellMouseDown {
1659 add { Events.AddHandler (CellMouseDownEvent, value); }
1660 remove { Events.RemoveHandler (CellMouseDownEvent, value); }
1663 public event DataGridViewCellEventHandler CellMouseEnter {
1664 add { Events.AddHandler (CellMouseEnterEvent, value); }
1665 remove { Events.RemoveHandler (CellMouseEnterEvent, value); }
1668 public event DataGridViewCellEventHandler CellMouseLeave {
1669 add { Events.AddHandler (CellMouseLeaveEvent, value); }
1670 remove { Events.RemoveHandler (CellMouseLeaveEvent, value); }
1673 public event DataGridViewCellMouseEventHandler CellMouseMove {
1674 add { Events.AddHandler (CellMouseMoveEvent, value); }
1675 remove { Events.RemoveHandler (CellMouseMoveEvent, value); }
1678 public event DataGridViewCellMouseEventHandler CellMouseUp {
1679 add { Events.AddHandler (CellMouseUpEvent, value); }
1680 remove { Events.RemoveHandler (CellMouseUpEvent, value); }
1683 public event DataGridViewCellPaintingEventHandler CellPainting {
1684 add { Events.AddHandler (CellPaintingEvent, value); }
1685 remove { Events.RemoveHandler (CellPaintingEvent, value); }
1688 public event DataGridViewCellParsingEventHandler CellParsing {
1689 add { Events.AddHandler (CellParsingEvent, value); }
1690 remove { Events.RemoveHandler (CellParsingEvent, value); }
1693 public event DataGridViewCellStateChangedEventHandler CellStateChanged {
1694 add { Events.AddHandler (CellStateChangedEvent, value); }
1695 remove { Events.RemoveHandler (CellStateChangedEvent, value); }
1698 public event DataGridViewCellEventHandler CellStyleChanged {
1699 add { Events.AddHandler (CellStyleChangedEvent, value); }
1700 remove { Events.RemoveHandler (CellStyleChangedEvent, value); }
1703 public event DataGridViewCellStyleContentChangedEventHandler CellStyleContentChanged {
1704 add { Events.AddHandler (CellStyleContentChangedEvent, value); }
1705 remove { Events.RemoveHandler (CellStyleContentChangedEvent, value); }
1708 public event DataGridViewCellEventHandler CellToolTipTextChanged {
1709 add { Events.AddHandler (CellToolTipTextChangedEvent, value); }
1710 remove { Events.RemoveHandler (CellToolTipTextChangedEvent, value); }
1713 [EditorBrowsable (EditorBrowsableState.Advanced)]
1714 public event DataGridViewCellToolTipTextNeededEventHandler CellToolTipTextNeeded {
1715 add { Events.AddHandler (CellToolTipTextNeededEvent, value); }
1716 remove { Events.RemoveHandler (CellToolTipTextNeededEvent, value); }
1719 public event DataGridViewCellEventHandler CellValidated {
1720 add { Events.AddHandler (CellValidatedEvent, value); }
1721 remove { Events.RemoveHandler (CellValidatedEvent, value); }
1724 public event DataGridViewCellValidatingEventHandler CellValidating {
1725 add { Events.AddHandler (CellValidatingEvent, value); }
1726 remove { Events.RemoveHandler (CellValidatingEvent, value); }
1729 public event DataGridViewCellEventHandler CellValueChanged {
1730 add { Events.AddHandler (CellValueChangedEvent, value); }
1731 remove { Events.RemoveHandler (CellValueChangedEvent, value); }
1734 [EditorBrowsable (EditorBrowsableState.Advanced)]
1735 public event DataGridViewCellValueEventHandler CellValueNeeded {
1736 add { Events.AddHandler (CellValueNeededEvent, value); }
1737 remove { Events.RemoveHandler (CellValueNeededEvent, value); }
1740 [EditorBrowsable (EditorBrowsableState.Advanced)]
1741 public event DataGridViewCellValueEventHandler CellValuePushed {
1742 add { Events.AddHandler (CellValuePushedEvent, value); }
1743 remove { Events.RemoveHandler (CellValuePushedEvent, value); }
1746 public event DataGridViewColumnEventHandler ColumnAdded {
1747 add { Events.AddHandler (ColumnAddedEvent, value); }
1748 remove { Events.RemoveHandler (ColumnAddedEvent, value); }
1751 public event DataGridViewColumnEventHandler ColumnContextMenuStripChanged {
1752 add { Events.AddHandler (ColumnContextMenuStripChangedEvent, value); }
1753 remove { Events.RemoveHandler (ColumnContextMenuStripChangedEvent, value); }
1756 public event DataGridViewColumnEventHandler ColumnDataPropertyNameChanged {
1757 add { Events.AddHandler (ColumnDataPropertyNameChangedEvent, value); }
1758 remove { Events.RemoveHandler (ColumnDataPropertyNameChangedEvent, value); }
1761 public event DataGridViewColumnEventHandler ColumnDefaultCellStyleChanged {
1762 add { Events.AddHandler (ColumnDefaultCellStyleChangedEvent, value); }
1763 remove { Events.RemoveHandler (ColumnDefaultCellStyleChangedEvent, value); }
1766 public event DataGridViewColumnEventHandler ColumnDisplayIndexChanged {
1767 add { Events.AddHandler (ColumnDisplayIndexChangedEvent, value); }
1768 remove { Events.RemoveHandler (ColumnDisplayIndexChangedEvent, value); }
1771 public event DataGridViewColumnDividerDoubleClickEventHandler ColumnDividerDoubleClick {
1772 add { Events.AddHandler (ColumnDividerDoubleClickEvent, value); }
1773 remove { Events.RemoveHandler (ColumnDividerDoubleClickEvent, value); }
1776 public event DataGridViewColumnEventHandler ColumnDividerWidthChanged {
1777 add { Events.AddHandler (ColumnDividerWidthChangedEvent, value); }
1778 remove { Events.RemoveHandler (ColumnDividerWidthChangedEvent, value); }
1781 public event DataGridViewColumnEventHandler ColumnHeaderCellChanged {
1782 add { Events.AddHandler (ColumnHeaderCellChangedEvent, value); }
1783 remove { Events.RemoveHandler (ColumnHeaderCellChangedEvent, value); }
1786 public event DataGridViewCellMouseEventHandler ColumnHeaderMouseClick {
1787 add { Events.AddHandler (ColumnHeaderMouseClickEvent, value); }
1788 remove { Events.RemoveHandler (ColumnHeaderMouseClickEvent, value); }
1791 public event DataGridViewCellMouseEventHandler ColumnHeaderMouseDoubleClick {
1792 add { Events.AddHandler (ColumnHeaderMouseDoubleClickEvent, value); }
1793 remove { Events.RemoveHandler (ColumnHeaderMouseDoubleClickEvent, value); }
1796 public event EventHandler ColumnHeadersBorderStyleChanged {
1797 add { Events.AddHandler (ColumnHeadersBorderStyleChangedEvent, value); }
1798 remove { Events.RemoveHandler (ColumnHeadersBorderStyleChangedEvent, value); }
1801 public event EventHandler ColumnHeadersDefaultCellStyleChanged {
1802 add { Events.AddHandler (ColumnHeadersDefaultCellStyleChangedEvent, value); }
1803 remove { Events.RemoveHandler (ColumnHeadersDefaultCellStyleChangedEvent, value); }
1806 public event EventHandler ColumnHeadersHeightChanged {
1807 add { Events.AddHandler (ColumnHeadersHeightChangedEvent, value); }
1808 remove { Events.RemoveHandler (ColumnHeadersHeightChangedEvent, value); }
1811 public event DataGridViewAutoSizeModeEventHandler ColumnHeadersHeightSizeModeChanged {
1812 add { Events.AddHandler (ColumnHeadersHeightSizeModeChangedEvent, value); }
1813 remove { Events.RemoveHandler (ColumnHeadersHeightSizeModeChangedEvent, value); }
1816 public event DataGridViewColumnEventHandler ColumnMinimumWidthChanged {
1817 add { Events.AddHandler (ColumnMinimumWidthChangedEvent, value); }
1818 remove { Events.RemoveHandler (ColumnMinimumWidthChangedEvent, value); }
1821 public event DataGridViewColumnEventHandler ColumnNameChanged {
1822 add { Events.AddHandler (ColumnNameChangedEvent, value); }
1823 remove { Events.RemoveHandler (ColumnNameChangedEvent, value); }
1826 public event DataGridViewColumnEventHandler ColumnRemoved {
1827 add { Events.AddHandler (ColumnRemovedEvent, value); }
1828 remove { Events.RemoveHandler (ColumnRemovedEvent, value); }
1831 public event DataGridViewColumnEventHandler ColumnSortModeChanged {
1832 add { Events.AddHandler (ColumnSortModeChangedEvent, value); }
1833 remove { Events.RemoveHandler (ColumnSortModeChangedEvent, value); }
1836 public event DataGridViewColumnStateChangedEventHandler ColumnStateChanged {
1837 add { Events.AddHandler (ColumnStateChangedEvent, value); }
1838 remove { Events.RemoveHandler (ColumnStateChangedEvent, value); }
1841 public event DataGridViewColumnEventHandler ColumnToolTipTextChanged {
1842 add { Events.AddHandler (ColumnToolTipTextChangedEvent, value); }
1843 remove { Events.RemoveHandler (ColumnToolTipTextChangedEvent, value); }
1846 public event DataGridViewColumnEventHandler ColumnWidthChanged {
1847 add { Events.AddHandler (ColumnWidthChangedEvent, value); }
1848 remove { Events.RemoveHandler (ColumnWidthChangedEvent, value); }
1851 public event EventHandler CurrentCellChanged {
1852 add { Events.AddHandler (CurrentCellChangedEvent, value); }
1853 remove { Events.RemoveHandler (CurrentCellChangedEvent, value); }
1856 [EditorBrowsable (EditorBrowsableState.Advanced)]
1857 public event EventHandler CurrentCellDirtyStateChanged {
1858 add { Events.AddHandler (CurrentCellDirtyStateChangedEvent, value); }
1859 remove { Events.RemoveHandler (CurrentCellDirtyStateChangedEvent, value); }
1862 public event DataGridViewBindingCompleteEventHandler DataBindingComplete {
1863 add { Events.AddHandler (DataBindingCompleteEvent, value); }
1864 remove { Events.RemoveHandler (DataBindingCompleteEvent, value); }
1867 public event DataGridViewDataErrorEventHandler DataError {
1868 add { Events.AddHandler (DataErrorEvent, value); }
1869 remove { Events.RemoveHandler (DataErrorEvent, value); }
1872 public event EventHandler DataMemberChanged {
1873 add { Events.AddHandler (DataMemberChangedEvent, value); }
1874 remove { Events.RemoveHandler (DataMemberChangedEvent, value); }
1877 public event EventHandler DataSourceChanged {
1878 add { Events.AddHandler (DataSourceChangedEvent, value); }
1879 remove { Events.RemoveHandler (DataSourceChangedEvent, value); }
1882 public event EventHandler DefaultCellStyleChanged {
1883 add { Events.AddHandler (DefaultCellStyleChangedEvent, value); }
1884 remove { Events.RemoveHandler (DefaultCellStyleChangedEvent, value); }
1887 [EditorBrowsable (EditorBrowsableState.Advanced)]
1888 public event DataGridViewRowEventHandler DefaultValuesNeeded {
1889 add { Events.AddHandler (DefaultValuesNeededEvent, value); }
1890 remove { Events.RemoveHandler (DefaultValuesNeededEvent, value); }
1893 public event DataGridViewEditingControlShowingEventHandler EditingControlShowing {
1894 add { Events.AddHandler (EditingControlShowingEvent, value); }
1895 remove { Events.RemoveHandler (EditingControlShowingEvent, value); }
1898 public event EventHandler EditModeChanged {
1899 add { Events.AddHandler (EditModeChangedEvent, value); }
1900 remove { Events.RemoveHandler (EditModeChangedEvent, value); }
1904 [EditorBrowsable (EditorBrowsableState.Advanced)]
1905 public new event EventHandler FontChanged {
1906 add { base.FontChanged += value; }
1907 remove { base.FontChanged -= value; }
1911 [EditorBrowsable (EditorBrowsableState.Advanced)]
1912 public new event EventHandler ForeColorChanged {
1913 add { base.ForeColorChanged += value; }
1914 remove { base.ForeColorChanged -= value; }
1918 [EditorBrowsable (EditorBrowsableState.Never)]
1919 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1920 public new event EventHandler PaddingChanged {
1921 add { base.PaddingChanged += value; }
1922 remove { base.PaddingChanged -= value; }
1925 public event EventHandler GridColorChanged {
1926 add { Events.AddHandler (GridColorChangedEvent, value); }
1927 remove { Events.RemoveHandler (GridColorChangedEvent, value); }
1930 public event EventHandler MultiSelectChanged {
1931 add { Events.AddHandler (MultiSelectChangedEvent, value); }
1932 remove { Events.RemoveHandler (MultiSelectChangedEvent, value); }
1935 public event DataGridViewRowEventHandler NewRowNeeded {
1936 add { Events.AddHandler (NewRowNeededEvent, value); }
1937 remove { Events.RemoveHandler (NewRowNeededEvent, value); }
1940 public event EventHandler ReadOnlyChanged {
1941 add { Events.AddHandler (ReadOnlyChangedEvent, value); }
1942 remove { Events.RemoveHandler (ReadOnlyChangedEvent, value); }
1945 public event DataGridViewRowEventHandler RowContextMenuStripChanged {
1946 add { Events.AddHandler (RowContextMenuStripChangedEvent, value); }
1947 remove { Events.RemoveHandler (RowContextMenuStripChangedEvent, value); }
1950 [EditorBrowsable (EditorBrowsableState.Advanced)]
1951 public event DataGridViewRowContextMenuStripNeededEventHandler RowContextMenuStripNeeded {
1952 add { Events.AddHandler (RowContextMenuStripNeededEvent, value); }
1953 remove { Events.RemoveHandler (RowContextMenuStripNeededEvent, value); }
1956 public event DataGridViewRowEventHandler RowDefaultCellStyleChanged {
1957 add { Events.AddHandler (RowDefaultCellStyleChangedEvent, value); }
1958 remove { Events.RemoveHandler (RowDefaultCellStyleChangedEvent, value); }
1961 [EditorBrowsable (EditorBrowsableState.Advanced)]
1962 public event QuestionEventHandler RowDirtyStateNeeded {
1963 add { Events.AddHandler (RowDirtyStateNeededEvent, value); }
1964 remove { Events.RemoveHandler (RowDirtyStateNeededEvent, value); }
1967 public event DataGridViewRowDividerDoubleClickEventHandler RowDividerDoubleClick {
1968 add { Events.AddHandler (RowDividerDoubleClickEvent, value); }
1969 remove { Events.RemoveHandler (RowDividerDoubleClickEvent, value); }
1972 public event DataGridViewRowEventHandler RowDividerHeightChanged {
1973 add { Events.AddHandler (RowDividerHeightChangedEvent, value); }
1974 remove { Events.RemoveHandler (RowDividerHeightChangedEvent, value); }
1977 public event DataGridViewCellEventHandler RowEnter {
1978 add { Events.AddHandler (RowEnterEvent, value); }
1979 remove { Events.RemoveHandler (RowEnterEvent, value); }
1982 public event DataGridViewRowEventHandler RowErrorTextChanged {
1983 add { Events.AddHandler (RowErrorTextChangedEvent, value); }
1984 remove { Events.RemoveHandler (RowErrorTextChangedEvent, value); }
1987 [EditorBrowsable (EditorBrowsableState.Advanced)]
1988 public event DataGridViewRowErrorTextNeededEventHandler RowErrorTextNeeded {
1989 add { Events.AddHandler (RowErrorTextNeededEvent, value); }
1990 remove { Events.RemoveHandler (RowErrorTextNeededEvent, value); }
1993 public event DataGridViewRowEventHandler RowHeaderCellChanged {
1994 add { Events.AddHandler (RowHeaderCellChangedEvent, value); }
1995 remove { Events.RemoveHandler (RowHeaderCellChangedEvent, value); }
1998 public event DataGridViewCellMouseEventHandler RowHeaderMouseClick {
1999 add { Events.AddHandler (RowHeaderMouseClickEvent, value); }
2000 remove { Events.RemoveHandler (RowHeaderMouseClickEvent, value); }
2003 public event DataGridViewCellMouseEventHandler RowHeaderMouseDoubleClick {
2004 add { Events.AddHandler (RowHeaderMouseDoubleClickEvent, value); }
2005 remove { Events.RemoveHandler (RowHeaderMouseDoubleClickEvent, value); }
2008 public event EventHandler RowHeadersBorderStyleChanged {
2009 add { Events.AddHandler (RowHeadersBorderStyleChangedEvent, value); }
2010 remove { Events.RemoveHandler (RowHeadersBorderStyleChangedEvent, value); }
2013 public event EventHandler RowHeadersDefaultCellStyleChanged {
2014 add { Events.AddHandler (RowHeadersDefaultCellStyleChangedEvent, value); }
2015 remove { Events.RemoveHandler (RowHeadersDefaultCellStyleChangedEvent, value); }
2018 public event EventHandler RowHeadersWidthChanged {
2019 add { Events.AddHandler (RowHeadersWidthChangedEvent, value); }
2020 remove { Events.RemoveHandler (RowHeadersWidthChangedEvent, value); }
2023 public event DataGridViewAutoSizeModeEventHandler RowHeadersWidthSizeModeChanged {
2024 add { Events.AddHandler (RowHeadersWidthSizeModeChangedEvent, value); }
2025 remove { Events.RemoveHandler (RowHeadersWidthSizeModeChangedEvent, value); }
2028 public event DataGridViewRowEventHandler RowHeightChanged {
2029 add { Events.AddHandler (RowHeightChangedEvent, value); }
2030 remove { Events.RemoveHandler (RowHeightChangedEvent, value); }
2033 [EditorBrowsable (EditorBrowsableState.Advanced)]
2034 public event DataGridViewRowHeightInfoNeededEventHandler RowHeightInfoNeeded {
2035 add { Events.AddHandler (RowHeightInfoNeededEvent, value); }
2036 remove { Events.RemoveHandler (RowHeightInfoNeededEvent, value); }
2039 [EditorBrowsable (EditorBrowsableState.Advanced)]
2040 public event DataGridViewRowHeightInfoPushedEventHandler RowHeightInfoPushed {
2041 add { Events.AddHandler (RowHeightInfoPushedEvent, value); }
2042 remove { Events.RemoveHandler (RowHeightInfoPushedEvent, value); }
2045 public event DataGridViewCellEventHandler RowLeave {
2046 add { Events.AddHandler (RowLeaveEvent, value); }
2047 remove { Events.RemoveHandler (RowLeaveEvent, value); }
2050 public event DataGridViewRowEventHandler RowMinimumHeightChanged {
2051 add { Events.AddHandler (RowMinimumHeightChangedEvent, value); }
2052 remove { Events.RemoveHandler (RowMinimumHeightChangedEvent, value); }
2055 public event DataGridViewRowPostPaintEventHandler RowPostPaint {
2056 add { Events.AddHandler (RowPostPaintEvent, value); }
2057 remove { Events.RemoveHandler (RowPostPaintEvent, value); }
2060 public event DataGridViewRowPrePaintEventHandler RowPrePaint {
2061 add { Events.AddHandler (RowPrePaintEvent, value); }
2062 remove { Events.RemoveHandler (RowPrePaintEvent, value); }
2065 public event DataGridViewRowsAddedEventHandler RowsAdded {
2066 add { Events.AddHandler (RowsAddedEvent, value); }
2067 remove { Events.RemoveHandler (RowsAddedEvent, value); }
2070 public event EventHandler RowsDefaultCellStyleChanged {
2071 add { Events.AddHandler (RowsDefaultCellStyleChangedEvent, value); }
2072 remove { Events.RemoveHandler (RowsDefaultCellStyleChangedEvent, value); }
2075 public event DataGridViewRowsRemovedEventHandler RowsRemoved {
2076 add { Events.AddHandler (RowsRemovedEvent, value); }
2077 remove { Events.RemoveHandler (RowsRemovedEvent, value); }
2080 public event DataGridViewRowStateChangedEventHandler RowStateChanged {
2081 add { Events.AddHandler (RowStateChangedEvent, value); }
2082 remove { Events.RemoveHandler (RowStateChangedEvent, value); }
2085 [EditorBrowsable (EditorBrowsableState.Advanced)]
2086 public event DataGridViewRowEventHandler RowUnshared {
2087 add { Events.AddHandler (RowUnsharedEvent, value); }
2088 remove { Events.RemoveHandler (RowUnsharedEvent, value); }
2091 public event DataGridViewCellEventHandler RowValidated {
2092 add { Events.AddHandler (RowValidatedEvent, value); }
2093 remove { Events.RemoveHandler (RowValidatedEvent, value); }
2096 public event DataGridViewCellCancelEventHandler RowValidating {
2097 add { Events.AddHandler (RowValidatingEvent, value); }
2098 remove { Events.RemoveHandler (RowValidatingEvent, value); }
2101 public event ScrollEventHandler Scroll {
2102 add { Events.AddHandler (ScrollEvent, value); }
2103 remove { Events.RemoveHandler (ScrollEvent, value); }
2106 public event EventHandler SelectionChanged {
2107 add { Events.AddHandler (SelectionChangedEvent, value); }
2108 remove { Events.RemoveHandler (SelectionChangedEvent, value); }
2111 [EditorBrowsable (EditorBrowsableState.Advanced)]
2112 public event DataGridViewSortCompareEventHandler SortCompare {
2113 add { Events.AddHandler (SortCompareEvent, value); }
2114 remove { Events.RemoveHandler (SortCompareEvent, value); }
2117 public event EventHandler Sorted {
2118 add { Events.AddHandler (SortedEvent, value); }
2119 remove { Events.RemoveHandler (SortedEvent, value); }
2122 public event DataGridViewRowEventHandler UserAddedRow {
2123 add { Events.AddHandler (UserAddedRowEvent, value); }
2124 remove { Events.RemoveHandler (UserAddedRowEvent, value); }
2127 public event DataGridViewRowEventHandler UserDeletedRow {
2128 add { Events.AddHandler (UserDeletedRowEvent, value); }
2129 remove { Events.RemoveHandler (UserDeletedRowEvent, value); }
2132 public event DataGridViewRowCancelEventHandler UserDeletingRow {
2133 add { Events.AddHandler (UserDeletingRowEvent, value); }
2134 remove { Events.RemoveHandler (UserDeletingRowEvent, value); }
2138 [EditorBrowsable (EditorBrowsableState.Never)]
2139 public new event EventHandler StyleChanged {
2140 add { base.StyleChanged += value; }
2141 remove { base.StyleChanged -= value; }
2145 [EditorBrowsable (EditorBrowsableState.Never)]
2146 public new event EventHandler TextChanged {
2147 add { base.TextChanged += value; }
2148 remove { base.TextChanged -= value; }
2151 [EditorBrowsable (EditorBrowsableState.Advanced)]
2152 public virtual DataGridViewAdvancedBorderStyle AdjustColumnHeaderBorderStyle (DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStyleInput, DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStylePlaceholder, bool isFirstDisplayedColumn, bool isLastVisibleColumn) {
2153 return (DataGridViewAdvancedBorderStyle) ((ICloneable)dataGridViewAdvancedBorderStyleInput).Clone();
2156 public bool AreAllCellsSelected (bool includeInvisibleCells) {
2157 foreach (DataGridViewRow row in rows) {
2158 foreach (DataGridViewCell cell in row.Cells) {
2159 if (includeInvisibleCells == false && cell.Visible == false) {
2162 if (!cell.Selected) {
2170 public void AutoResizeColumn (int columnIndex) {
2171 AutoResizeColumn (columnIndex, DataGridViewAutoSizeColumnMode.AllCells);
2174 public void AutoResizeColumn (int columnIndex, DataGridViewAutoSizeColumnMode autoSizeColumnMode)
2176 AutoResizeColumnInternal (columnIndex, autoSizeColumnMode);
2179 public void AutoResizeColumnHeadersHeight ()
2183 foreach (DataGridViewColumn col in Columns)
2184 new_height = Math.Max (new_height, col.HeaderCell.PreferredSize.Height);
2186 if (ColumnHeadersHeight != new_height)
2187 ColumnHeadersHeight = new_height;
2190 [MonoTODO ("columnIndex parameter is not used")]
2191 public void AutoResizeColumnHeadersHeight (int columnIndex)
2193 AutoResizeColumnHeadersHeight ();
2196 public void AutoResizeColumns () {
2197 AutoResizeColumns (DataGridViewAutoSizeColumnsMode.AllCells);
2200 public void AutoResizeColumns (DataGridViewAutoSizeColumnsMode autoSizeColumnsMode) {
2201 AutoResizeColumns (autoSizeColumnsMode, true);
2204 public void AutoResizeRow (int rowIndex)
2206 AutoResizeRow (rowIndex, DataGridViewAutoSizeRowMode.AllCells, true);
2209 public void AutoResizeRow (int rowIndex, DataGridViewAutoSizeRowMode autoSizeRowMode)
2211 AutoResizeRow (rowIndex, autoSizeRowMode, true);
2214 public void AutoResizeRowHeadersWidth (DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode)
2216 if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToFirstHeader) {
2217 RowHeadersWidth = GetRowInternal (0).HeaderCell.PreferredSize.Width;
2223 if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders) {
2224 foreach (DataGridViewRow row in Rows)
2226 new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
2228 if (RowHeadersWidth != new_width)
2229 RowHeadersWidth = new_width;
2234 if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders) {
2235 foreach (DataGridViewRow row in Rows)
2236 new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
2238 if (RowHeadersWidth != new_width)
2239 RowHeadersWidth = new_width;
2245 [MonoTODO ("Does not use rowIndex parameter.")]
2246 public void AutoResizeRowHeadersWidth (int rowIndex, DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode)
2248 AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
2251 public void AutoResizeRows ()
2253 AutoResizeRows (0, Rows.Count, DataGridViewAutoSizeRowMode.AllCells, false);
2256 public void AutoResizeRows (DataGridViewAutoSizeRowsMode autoSizeRowsMode)
2258 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeRowsMode), autoSizeRowsMode))
2259 throw new InvalidEnumArgumentException ("Parameter autoSizeRowsMode is not a valid DataGridViewRowsMode.");
2260 if ((autoSizeRowsMode == DataGridViewAutoSizeRowsMode.AllHeaders || autoSizeRowsMode == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && rowHeadersVisible == false)
2261 throw new InvalidOperationException ("Parameter autoSizeRowsMode cannot be AllHeaders or DisplayedHeaders in this DataGridView.");
2262 if (autoSizeRowsMode == DataGridViewAutoSizeRowsMode.None)
2263 throw new ArgumentException ("Parameter autoSizeRowsMode cannot be None.");
2265 AutoResizeRows (autoSizeRowsMode, false);
2268 public virtual bool BeginEdit (bool selectAll) {
2269 if (currentCell == null || currentCell.IsInEditMode)
2272 if (currentCell.RowIndex >= 0) {
2273 if ((currentCell.InheritedState & DataGridViewElementStates.ReadOnly) == DataGridViewElementStates.ReadOnly) {
2278 DataGridViewCell cell = currentCell;
2279 Type editType = cell.EditType;
2281 if (editType == null && !(cell is IDataGridViewEditingCell))
2284 // Give user a chance to cancel the edit
2285 DataGridViewCellCancelEventArgs e = new DataGridViewCellCancelEventArgs (cell.ColumnIndex, cell.RowIndex);
2286 OnCellBeginEdit (e);
2291 cell.SetIsInEditMode (true);
2293 // The cell has an editing control we need to setup
2294 if (editType != null) {
2295 Control ctrl = EditingControlInternal;
2297 // Check if we can reuse the one we already have
2298 bool isCorrectType = ctrl != null && ctrl.GetType () == editType;
2303 // We couldn't use the existing one, create a new one
2305 ctrl = (Control) Activator.CreateInstance (editType);
2306 EditingControlInternal = ctrl;
2309 // Call some functions that allows the editing control to get setup
2310 DataGridViewCellStyle style = cell.RowIndex == -1 ? DefaultCellStyle : cell.InheritedStyle;
2312 cell.InitializeEditingControl (cell.RowIndex, cell.FormattedValue, style);
2313 cell.PositionEditingControl (true, true, this.GetCellDisplayRectangle (cell.ColumnIndex, cell.RowIndex, false), bounds, style, false, false, (columns [cell.ColumnIndex].DisplayIndex == 0), (cell.RowIndex == 0));
2315 // Show the editing control
2316 if (EditingControlInternal != null)
2317 EditingControlInternal.Visible = true;
2319 IDataGridViewEditingControl dgvEditingControl = (IDataGridViewEditingControl) EditingControlInternal;
2320 if (dgvEditingControl != null) {
2321 dgvEditingControl.EditingControlDataGridView = this;
2322 dgvEditingControl.EditingControlRowIndex = currentCell.OwningRow.Index;
2323 dgvEditingControl.ApplyCellStyleToEditingControl (style);
2324 dgvEditingControl.PrepareEditingControlForEdit (selectAll);
2325 dgvEditingControl.EditingControlFormattedValue = currentCell.EditedFormattedValue;
2330 // If we are here, it means we have a cell that does not have an editing control
2331 // and simply implements IDataGridViewEditingCell itself.
2332 (cell as IDataGridViewEditingCell).PrepareEditingCellForEdit (selectAll);
2337 public bool CancelEdit ()
2339 if (currentCell != null) {
2340 if (currentCell.IsInEditMode) {
2341 currentCell.SetIsInEditMode (false);
2342 currentCell.DetachEditingControl ();
2345 if (currentCell.RowIndex == NewRowIndex) {
2346 if (DataManager != null)
2347 DataManager.CancelCurrentEdit ();
2349 new_row_editing = false;
2350 PrepareEditingRow (false, false);
2351 MoveCurrentCell (currentCell.ColumnIndex, NewRowIndex, true, false, false, true);
2352 OnUserDeletedRow (new DataGridViewRowEventArgs (EditingRow));
2359 public void ClearSelection ()
2361 foreach (DataGridViewColumn col in SelectedColumns)
2362 col.Selected = false;
2363 foreach (DataGridViewRow row in SelectedRows)
2364 row.Selected = false;
2365 foreach (DataGridViewCell cell in SelectedCells)
2366 cell.Selected = false;
2369 public bool CommitEdit (DataGridViewDataErrorContexts context)
2371 if (currentCell == null)
2375 currentCell.Value = currentCell.ParseFormattedValue (currentCell.EditedFormattedValue,
2376 currentCell.InheritedStyle, null, null);
2377 } catch (Exception e) {
2378 DataGridViewDataErrorEventArgs args = new DataGridViewDataErrorEventArgs (e, currentCell.ColumnIndex, currentCell.RowIndex,
2379 DataGridViewDataErrorContexts.Commit);
2380 OnDataError (false, args);
2381 if (args.ThrowException)
2388 [MonoTODO ("Always includes partial columns")]
2389 public int DisplayedColumnCount (bool includePartialColumns)
2393 for (int i = first_col_index; i < Columns.Count; i++)
2394 if (Columns.ColumnDisplayIndexSortedArrayList[i].Displayed)
2402 public int DisplayedRowCount (bool includePartialRow)
2407 if (ColumnHeadersVisible)
2408 rowTop += ColumnHeadersHeight;
2410 for (int index = first_row_index; index < Rows.Count; index++) {
2411 DataGridViewRow row = GetRowInternal (index);
2412 if (rowTop + row.Height <= ClientSize.Height) {
2414 rowTop += row.Height;
2416 if (includePartialRow)
2425 public bool EndEdit ()
2427 return EndEdit (DataGridViewDataErrorContexts.Commit);
2430 [MonoTODO ("Does not use context parameter")]
2431 public bool EndEdit (DataGridViewDataErrorContexts context)
2433 if (currentCell == null || !currentCell.IsInEditMode)
2436 if (!CommitEdit (context)) {
2437 if (DataManager != null)
2438 DataManager.EndCurrentEdit ();
2439 if (EditingControl != null)
2440 EditingControl.Focus ();
2444 currentCell.SetIsInEditMode (false);
2445 currentCell.DetachEditingControl ();
2446 OnCellEndEdit (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
2448 if (currentCell.RowIndex == NewRowIndex) {
2449 new_row_editing = false;
2450 editing_row = null; // editing row becomes a real row
2451 PrepareEditingRow (true, false); // add a new editing row
2452 MoveCurrentCell (currentCell.ColumnIndex, NewRowIndex, true, false, false, true);
2457 public int GetCellCount (DataGridViewElementStates includeFilter) {
2459 foreach (DataGridViewRow row in rows) {
2460 foreach (DataGridViewCell cell in row.Cells) {
2461 if ((cell.State & includeFilter) != 0) {
2469 internal DataGridViewRow GetRowInternal (int rowIndex)
2471 return Rows.SharedRow (rowIndex);
2474 internal DataGridViewCell GetCellInternal (int colIndex, int rowIndex)
2476 return GetRowInternal (rowIndex).Cells.GetCellInternal (colIndex);
2479 public Rectangle GetCellDisplayRectangle (int columnIndex, int rowIndex, bool cutOverflow) {
2480 if (columnIndex < 0 || columnIndex >= columns.Count) {
2481 throw new ArgumentOutOfRangeException("Column index is out of range.");
2484 int x = 0, y = 0, w = 0, h = 0;
2489 if (ColumnHeadersVisible)
2490 y += ColumnHeadersHeight;
2492 if (RowHeadersVisible)
2493 x += RowHeadersWidth;
2495 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2497 for (int i = first_col_index; i < cols.Count; i++) {
2498 if (!cols[i].Visible)
2501 if (cols[i].Index == columnIndex) {
2509 for (int i = first_row_index; i < Rows.Count; i++) {
2510 if (i == rowIndex) {
2511 h = rows [i].Height;
2515 y += rows [i].Height;
2518 return new Rectangle (x, y, w, h);
2521 public virtual DataObject GetClipboardContent () {
2523 if (clipboardCopyMode == DataGridViewClipboardCopyMode.Disable)
2524 throw new InvalidOperationException ("Generating Clipboard content is not supported when the ClipboardCopyMode property is Disable.");
2526 int start_row = int.MaxValue, end_row = int.MinValue;
2527 int start_col = int.MaxValue, end_col = int.MinValue;
2529 bool include_row_headers = false;
2530 bool include_col_headers = false;
2531 bool only_included_headers = false;
2532 bool headers_includable = false;
2534 switch (ClipboardCopyMode) {
2535 case DataGridViewClipboardCopyMode.EnableWithoutHeaderText:
2537 case DataGridViewClipboardCopyMode.EnableWithAutoHeaderText:
2538 // Headers are included if not selection mode is CellSelect, and any header is selected.
2539 headers_includable = selectionMode != DataGridViewSelectionMode.CellSelect;
2541 case DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText:
2542 include_col_headers = include_row_headers = true;
2546 BitArray included_rows = new BitArray (RowCount);
2547 BitArray included_cols = new BitArray (ColumnCount);
2549 // If there are any selected columns,
2550 // include the column headers (if headers are to be shown).
2551 if (headers_includable && !include_col_headers) {
2552 for (int c = 0; c < ColumnCount; c++) {
2553 if (Columns [c].Selected) {
2554 include_col_headers = true;
2560 // Find the smallest rectangle that encompasses all selected cells.
2561 for (int r = 0; r < RowCount; r++) {
2562 DataGridViewRow row = Rows [r];
2564 if (headers_includable && !include_row_headers && row.Selected) {
2565 include_row_headers = true;
2568 for (int c = 0; c < ColumnCount; c++) {
2569 DataGridViewCell cell = row.Cells [c];
2571 if (cell == null || !cell.Selected)
2574 included_cols [c] = true;
2575 included_rows [r] = true;
2577 start_row = Math.Min (start_row, r);
2578 start_col = Math.Min (start_col, c);
2579 end_row = Math.Max (end_row, r);
2580 end_col = Math.Max (end_col, c);
2584 // Mark rows/columns in between selected cells as included if the selection mode isn't FullHeaderSelect.
2585 switch (selectionMode){
2586 case DataGridViewSelectionMode.CellSelect:
2587 case DataGridViewSelectionMode.ColumnHeaderSelect:
2588 case DataGridViewSelectionMode.RowHeaderSelect:
2589 if (selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect) {
2590 for (int r = start_row; r <= end_row; r++) {
2591 included_rows.Set (r, true);
2593 } else if (start_row <= end_row) {
2594 included_rows.SetAll (true);
2596 if (selectionMode != DataGridViewSelectionMode.RowHeaderSelect) {
2597 for (int c = start_col; c <= end_col; c++) {
2598 included_cols.Set (c, true);
2602 case DataGridViewSelectionMode.FullColumnSelect:
2603 case DataGridViewSelectionMode.FullRowSelect:
2604 only_included_headers = true;
2608 if (start_row > end_row)
2611 if (start_col > end_col)
2614 DataObject result = new DataObject ();
2616 System.Text.StringBuilder text_builder = new System.Text.StringBuilder ();
2617 System.Text.StringBuilder utext_builder = new System.Text.StringBuilder ();
2618 System.Text.StringBuilder html_builder = new System.Text.StringBuilder ();
2619 System.Text.StringBuilder csv_builder = new System.Text.StringBuilder ();
2621 // Loop through all rows and columns to create the content.
2622 // -1 is the header row/column.
2623 int first_row = start_row;
2624 int first_col = start_col;
2625 if (include_col_headers) {
2628 for (int r = first_row; r <= end_row; r++) {
2629 DataGridViewRow row = null;
2632 if (!included_rows [r])
2638 if (include_row_headers) {
2642 for (int c = first_col; c <= end_col; c++) {
2643 DataGridViewCell cell = null;
2645 if (c >= 0 && only_included_headers && !included_cols [c])
2650 cell = TopLeftHeaderCell;
2652 cell = Columns [c].HeaderCell;
2656 cell = row.HeaderCell;
2658 cell = row.Cells [c];
2662 string text, utext, html, csv;
2663 bool is_first_cell = (c == first_col);
2664 bool is_last_cell = (c == end_col);
2665 bool is_first_row = (r == first_row);
2666 bool is_last_row = (r == end_row);
2669 text = string.Empty;
2670 utext = string.Empty;
2671 html = string.Empty;
2674 text = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.Text) as string;
2675 utext = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.UnicodeText) as string;
2676 html = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.Html) as string;
2677 csv = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.CommaSeparatedValue) as string;
2680 text_builder.Append (text);
2681 utext_builder.Append (utext);
2682 html_builder.Append (html);
2683 csv_builder.Append (csv);
2685 if (c == -1) { // If we just did the row header, jump to the first column.
2690 if (r == -1) {// If we just did the column header, jump to the first row.
2696 // Html content always get the \r\n newline
2697 // It's valid html anyway, and it eases testing quite a bit
2698 // (since otherwise we'd have to change the start indices
2699 // in the added prologue/epilogue text)
2701 int fragment_end = 135 + html_builder.Length;
2702 int html_end = fragment_end + 36;
2705 "StartHTML:00000097{0}" +
2706 "EndHTML:{1:00000000}{0}" +
2707 "StartFragment:00000133{0}" +
2708 "EndFragment:{2:00000000}{0}" +
2711 "<!--StartFragment-->";
2713 html_start = string.Format (html_start, "\r\n", html_end, fragment_end);
2714 html_builder.Insert (0, html_start);
2715 html_builder.AppendFormat ("{0}<!--EndFragment-->{0}</BODY>{0}</HTML>", "\r\n");
2717 result.SetData (DataFormats.CommaSeparatedValue, false, csv_builder.ToString ());
2718 result.SetData (DataFormats.Html, false, html_builder.ToString ());
2719 result.SetData (DataFormats.UnicodeText, false, utext_builder.ToString ());
2720 result.SetData (DataFormats.Text, false, text_builder.ToString ());
2725 [MonoTODO ("Does not use cutOverflow parameter")]
2726 public Rectangle GetColumnDisplayRectangle (int columnIndex, bool cutOverflow)
2728 if (columnIndex < 0 || columnIndex > Columns.Count - 1)
2729 throw new ArgumentOutOfRangeException ("columnIndex");
2736 if (RowHeadersVisible)
2737 x += RowHeadersWidth;
2739 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2741 for (int i = first_col_index; i < cols.Count; i++) {
2742 if (!cols[i].Visible)
2745 if (cols[i].Index == columnIndex) {
2753 return new Rectangle (x, 0, w, Height);
2756 [MonoTODO ("Does not use cutOverflow parameter")]
2757 public Rectangle GetRowDisplayRectangle (int rowIndex, bool cutOverflow)
2759 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
2760 throw new ArgumentOutOfRangeException ("rowIndex");
2767 if (ColumnHeadersVisible)
2768 y += ColumnHeadersHeight;
2770 for (int i = first_row_index; i < Rows.Count; i++) {
2771 if (i == rowIndex) {
2776 y += rows[i].Height;
2779 return new Rectangle (0, y, Width, h);
2782 public HitTestInfo HitTest (int x, int y) {
2783 ///////////////////////////////////////////////////////
2784 //Console.WriteLine ("HitTest ({0}, {1})", x, y);
2785 bool isInColHeader = columnHeadersVisible && y >= 0 && y <= ColumnHeadersHeight;
2786 bool isInRowHeader = rowHeadersVisible && x >= 0 && x <= RowHeadersWidth;
2789 if (isInColHeader && isInRowHeader)
2790 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.TopLeftHeader);
2792 // HorizontalScrollBar
2793 if (horizontalScrollBar.Visible && horizontalScrollBar.Bounds.Contains (x, y))
2794 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.HorizontalScrollBar);
2796 // VerticalScrollBar
2797 if (verticalScrollBar.Visible && verticalScrollBar.Bounds.Contains (x, y))
2798 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.VerticalScrollBar);
2800 // The little box in the bottom right if both scrollbars are shown is None
2801 if (verticalScrollBar.Visible && horizontalScrollBar.Visible)
2802 if (new Rectangle (verticalScrollBar.Left, horizontalScrollBar.Top, verticalScrollBar.Width, horizontalScrollBar.Height).Contains (x, y))
2803 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.None);
2808 int top = columnHeadersVisible ? columnHeadersHeight : 0;
2810 for (int i = first_row_index; i < Rows.Count; i++) {
2811 DataGridViewRow row = Rows[i];
2813 if (y > top && y <= (top + row.Height)) {
2821 int left = rowHeadersVisible ? RowHeadersWidth : 0;
2823 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2825 for (int i = first_col_index; i < cols.Count; i++) {
2826 if (!cols[i].Visible)
2829 if (x > left && x <= (left + cols[i].Width)) {
2830 colindex = cols[i].Index;
2834 left += cols[i].Width;
2837 if (colindex >= 0 && rowindex >= 0)
2838 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.Cell);
2840 if (isInColHeader && colindex > -1)
2841 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.ColumnHeader);
2843 if (isInRowHeader && rowindex > -1)
2844 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.RowHeader);
2846 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.None);
2849 [MonoTODO ("Invalidates whole grid")]
2850 public void InvalidateCell (DataGridViewCell dataGridViewCell)
2852 if (dataGridViewCell == null)
2853 throw new ArgumentNullException ("Cell is null");
2855 if (dataGridViewCell.DataGridView != this)
2856 throw new ArgumentException ("The specified cell does not belong to this DataGridView.");
2858 InvalidateCell (dataGridViewCell.ColumnIndex, dataGridViewCell.RowIndex);
2861 [MonoTODO ("Invalidates whole grid")]
2862 public void InvalidateCell (int columnIndex, int rowIndex)
2864 if (columnIndex < 0 || columnIndex >= columns.Count)
2865 throw new ArgumentOutOfRangeException ("Column index is out of range.");
2867 if (rowIndex < 0 || rowIndex >= rows.Count)
2868 throw new ArgumentOutOfRangeException ("Row index is out of range.");
2870 Invalidate (GetCellDisplayRectangle (columnIndex, rowIndex, true));
2873 [MonoTODO ("Invalidates whole grid")]
2874 public void InvalidateColumn (int columnIndex)
2876 if (columnIndex < 0 || columnIndex >= columns.Count)
2877 throw new ArgumentOutOfRangeException ("Column index is out of range.");
2879 Invalidate (GetColumnDisplayRectangle (columnIndex, true));
2882 [MonoTODO ("Invalidates whole grid")]
2883 public void InvalidateRow (int rowIndex)
2885 if (rowIndex < 0 || rowIndex >= rows.Count)
2886 throw new ArgumentOutOfRangeException ("Row index is out of range.");
2888 Invalidate (GetRowDisplayRectangle (rowIndex, true));
2891 public virtual void NotifyCurrentCellDirty (bool dirty) {
2892 if (currentCell != null)
2893 InvalidateCell (currentCell);
2896 public bool RefreshEdit ()
2898 if (IsCurrentCellInEditMode) {
2899 currentCell.InitializeEditingControl (currentCell.RowIndex, currentCell.FormattedValue, currentCell.InheritedStyle);
2906 [EditorBrowsable (EditorBrowsableState.Never)]
2907 public override void ResetText ()
2909 Text = string.Empty;
2912 public void SelectAll () {
2913 switch (selectionMode) {
2914 case DataGridViewSelectionMode.FullRowSelect:
2915 foreach (DataGridViewRow row in rows) {
2916 (row as DataGridViewBand).Selected = true;
2919 case DataGridViewSelectionMode.FullColumnSelect:
2920 foreach (DataGridViewColumn col in columns) {
2921 (col as DataGridViewBand).Selected = true;
2925 foreach (DataGridViewRow row in rows) {
2926 foreach (DataGridViewCell cell in row.Cells) {
2927 cell.Selected = true;
2936 public virtual void Sort (IComparer comparer)
2938 if (comparer == null)
2939 throw new ArgumentNullException ("comparer");
2940 if (VirtualMode || DataSource != null)
2941 throw new InvalidOperationException ();
2943 if (SortedColumn != null)
2944 SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
2948 Rows.Sort (comparer);
2950 sortedColumn = null;
2951 sortOrder = SortOrder.None;
2957 OnSorted (EventArgs.Empty);
2960 public virtual void Sort (DataGridViewColumn dataGridViewColumn, ListSortDirection direction)
2962 if (dataGridViewColumn == null)
2963 throw new ArgumentNullException ("dataGridViewColumn");
2964 if (dataGridViewColumn.DataGridView != this)
2965 throw new ArgumentException ("dataGridViewColumn");
2970 if (SortedColumn != null)
2971 SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
2973 sortedColumn = dataGridViewColumn;
2974 sortOrder = direction == ListSortDirection.Ascending ? SortOrder.Ascending : SortOrder.Descending;
2976 if (Rows.Count == 0)
2979 if (dataGridViewColumn.IsDataBound) {
2980 IBindingList bindingList = DataManager.List as IBindingList;
2981 if (bindingList != null && bindingList.SupportsSorting) {
2982 bindingList.ApplySort (DataManager.GetItemProperties()[dataGridViewColumn.DataPropertyName], direction);
2983 dataGridViewColumn.HeaderCell.SortGlyphDirection = sortOrder;
2986 // Figure out if this is a numeric sort or text sort
2987 bool is_numeric = true;
2990 foreach (DataGridViewRow row in Rows) {
2991 object val = row.Cells[dataGridViewColumn.Index].Value;
2993 if (val != null && !double.TryParse (val.ToString (), out n)) {
2999 ColumnSorter sorter = new ColumnSorter (dataGridViewColumn, direction, is_numeric);
3001 dataGridViewColumn.HeaderCell.SortGlyphDirection = sortOrder;
3005 OnSorted (EventArgs.Empty);
3008 public void UpdateCellErrorText (int columnIndex, int rowIndex)
3010 if (columnIndex < 0 || columnIndex > Columns.Count - 1)
3011 throw new ArgumentOutOfRangeException ("columnIndex");
3012 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3013 throw new ArgumentOutOfRangeException ("rowIndex");
3015 InvalidateCell (columnIndex, rowIndex);
3018 public void UpdateCellValue (int columnIndex, int rowIndex)
3020 if (columnIndex < 0 || columnIndex > Columns.Count - 1)
3021 throw new ArgumentOutOfRangeException ("columnIndex");
3022 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3023 throw new ArgumentOutOfRangeException ("rowIndex");
3025 InvalidateCell (columnIndex, rowIndex);
3028 public void UpdateRowErrorText (int rowIndex)
3030 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3031 throw new ArgumentOutOfRangeException ("rowIndex");
3033 InvalidateRow (rowIndex);
3036 public void UpdateRowErrorText (int rowIndexStart, int rowIndexEnd)
3038 if (rowIndexStart < 0 || rowIndexStart > Rows.Count - 1)
3039 throw new ArgumentOutOfRangeException ("rowIndexStart");
3040 if (rowIndexEnd < 0 || rowIndexEnd > Rows.Count - 1)
3041 throw new ArgumentOutOfRangeException ("rowIndexEnd");
3042 if (rowIndexEnd < rowIndexStart)
3043 throw new ArgumentOutOfRangeException ("rowIndexEnd", "rowIndexEnd must be greater than rowIndexStart");
3045 for (int i = rowIndexStart; i <= rowIndexEnd; i++)
3049 public void UpdateRowHeightInfo (int rowIndex, bool updateToEnd) {
3050 throw new NotImplementedException();
3053 protected override bool CanEnableIme {
3055 if (CurrentCell != null && CurrentCell.EditType != null)
3062 protected override Size DefaultSize {
3063 get { return new Size (240, 150); }
3066 protected ScrollBar HorizontalScrollBar {
3067 get { return horizontalScrollBar; }
3070 protected ScrollBar VerticalScrollBar {
3071 get { return verticalScrollBar; }
3074 protected virtual void AccessibilityNotifyCurrentCellChanged (Point cellAddress)
3076 throw new NotImplementedException ();
3079 [MonoTODO ("Does not use fixedHeight parameter")]
3080 protected void AutoResizeColumn (int columnIndex, DataGridViewAutoSizeColumnMode autoSizeColumnMode, bool fixedHeight)
3082 AutoResizeColumn (columnIndex, autoSizeColumnMode);
3085 [MonoTODO ("Does not use fixedRowHeadersWidth or fixedColumnsWidth parameters")]
3086 protected void AutoResizeColumnHeadersHeight (bool fixedRowHeadersWidth, bool fixedColumnsWidth)
3088 AutoResizeColumnHeadersHeight ();
3091 [MonoTODO ("Does not use columnIndex or fixedRowHeadersWidth or fixedColumnsWidth parameters")]
3092 protected void AutoResizeColumnHeadersHeight (int columnIndex, bool fixedRowHeadersWidth, bool fixedColumnWidth)
3094 AutoResizeColumnHeadersHeight (columnIndex);
3097 protected void AutoResizeColumns (DataGridViewAutoSizeColumnsMode autoSizeColumnsMode, bool fixedHeight) {
3098 for (int i = 0; i < Columns.Count; i++) {
3099 AutoResizeColumn (i, (DataGridViewAutoSizeColumnMode) autoSizeColumnsMode, fixedHeight);
3103 [MonoTODO ("Does not use fixedWidth parameter")]
3104 protected void AutoResizeRow (int rowIndex, DataGridViewAutoSizeRowMode autoSizeRowMode, bool fixedWidth)
3106 if (autoSizeRowMode == DataGridViewAutoSizeRowMode.RowHeader && !rowHeadersVisible)
3107 throw new InvalidOperationException ("row headers are not visible");
3108 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3109 throw new ArgumentOutOfRangeException ("rowIndex");
3111 DataGridViewRow row = GetRowInternal (rowIndex);
3113 int new_height = row.GetPreferredHeight (rowIndex, autoSizeRowMode, true);
3115 if (row.Height != new_height)
3116 row.SetAutoSizeHeight (new_height);
3119 [MonoTODO ("Does not use fixedColumnHeadersHeight or fixedRowsHeight parameter")]
3120 protected void AutoResizeRowHeadersWidth (DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode, bool fixedColumnHeadersHeight, bool fixedRowsHeight)
3122 AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
3125 [MonoTODO ("Does not use rowIndex or fixedColumnHeadersHeight or fixedRowsHeight parameter")]
3126 protected void AutoResizeRowHeadersWidth (int rowIndex, DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode, bool fixedColumnHeadersHeight, bool fixedRowHeight)
3128 AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
3131 [MonoTODO ("Does not use fixedWidth parameter")]
3132 protected void AutoResizeRows (DataGridViewAutoSizeRowsMode autoSizeRowsMode, bool fixedWidth)
3134 if (autoSizeRowsMode == DataGridViewAutoSizeRowsMode.None)
3137 bool displayed_only = false;
3138 DataGridViewAutoSizeRowMode mode = DataGridViewAutoSizeRowMode.AllCells;
3140 switch (autoSizeRowsMode) {
3141 case DataGridViewAutoSizeRowsMode.AllHeaders:
3142 mode = DataGridViewAutoSizeRowMode.RowHeader;
3144 case DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders:
3145 mode = DataGridViewAutoSizeRowMode.AllCellsExceptHeader;
3147 case DataGridViewAutoSizeRowsMode.AllCells:
3148 mode = DataGridViewAutoSizeRowMode.AllCells;
3150 case DataGridViewAutoSizeRowsMode.DisplayedHeaders:
3151 mode = DataGridViewAutoSizeRowMode.RowHeader;
3152 displayed_only = true;
3154 case DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders:
3155 mode = DataGridViewAutoSizeRowMode.AllCellsExceptHeader;
3156 displayed_only = true;
3158 case DataGridViewAutoSizeRowsMode.DisplayedCells:
3159 mode = DataGridViewAutoSizeRowMode.AllCells;
3160 displayed_only = true;
3164 foreach (DataGridViewRow row in Rows) {
3165 if (!displayed_only || row.Displayed) {
3166 int new_height = row.GetPreferredHeight (row.Index, mode, fixedWidth);
3168 if (row.Height != new_height)
3169 row.SetAutoSizeHeight (new_height);
3174 [MonoTODO ("Does not use fixedMode parameter")]
3175 protected void AutoResizeRows (int rowIndexStart, int rowsCount, DataGridViewAutoSizeRowMode autoSizeRowMode, bool fixedWidth)
3177 for (int i = rowIndexStart; i < rowIndexStart + rowsCount; i++)
3178 AutoResizeRow (i, autoSizeRowMode, fixedWidth);
3181 protected void ClearSelection (int columnIndexException, int rowIndexException, bool selectExceptionElement) {
3182 if (columnIndexException >= columns.Count) {
3183 throw new ArgumentOutOfRangeException("ColumnIndexException is greater than the highest column index.");
3185 if (selectionMode == DataGridViewSelectionMode.FullRowSelect) {
3186 if (columnIndexException < -1) {
3187 throw new ArgumentOutOfRangeException("ColumnIndexException is less than -1.");
3191 if (columnIndexException < 0) {
3192 throw new ArgumentOutOfRangeException("ColumnIndexException is less than 0.");
3195 if (rowIndexException >= rows.Count) {
3196 throw new ArgumentOutOfRangeException("RowIndexException is greater than the highest row index.");
3198 if (selectionMode == DataGridViewSelectionMode.FullColumnSelect) {
3199 if (rowIndexException < -1) {
3200 throw new ArgumentOutOfRangeException("RowIndexException is less than -1.");
3204 if (rowIndexException < 0) {
3205 throw new ArgumentOutOfRangeException("RowIndexException is less than 0.");
3208 switch (selectionMode) {
3209 case DataGridViewSelectionMode.FullRowSelect:
3210 foreach (DataGridViewRow row in rows) {
3211 if (selectExceptionElement && row.Index == rowIndexException) {
3214 SetSelectedRowCore (row.Index, false);
3217 case DataGridViewSelectionMode.FullColumnSelect:
3218 foreach (DataGridViewColumn col in columns) {
3219 if (selectExceptionElement && col.Index == columnIndexException) {
3222 SetSelectedColumnCore (col.Index, false);
3226 foreach (DataGridViewCell cell in SelectedCells) {
3227 if (selectExceptionElement && cell.RowIndex == rowIndexException && cell.ColumnIndex == columnIndexException) {
3230 SetSelectedCellCore (cell.ColumnIndex, cell.RowIndex, false);
3236 protected override AccessibleObject CreateAccessibilityInstance ()
3238 return new DataGridViewAccessibleObject(this);
3241 [EditorBrowsable (EditorBrowsableState.Advanced)]
3242 protected virtual DataGridViewColumnCollection CreateColumnsInstance ()
3244 return new DataGridViewColumnCollection(this);
3247 protected override Control.ControlCollection CreateControlsInstance ()
3249 return new DataGridViewControlCollection (this);
3252 [EditorBrowsable (EditorBrowsableState.Advanced)]
3253 protected virtual DataGridViewRowCollection CreateRowsInstance ()
3255 return new DataGridViewRowCollection(this);
3258 protected override void Dispose (bool disposing) {
3261 protected override AccessibleObject GetAccessibilityObjectById (int objectId)
3263 throw new NotImplementedException();
3266 protected override bool IsInputChar (char charCode)
3271 protected override bool IsInputKey (Keys keyData)
3273 // Don't look at the modifiers
3274 keyData = keyData & ~Keys.Modifiers;
3296 protected virtual void OnAllowUserToAddRowsChanged (EventArgs e)
3298 EventHandler eh = (EventHandler)(Events [AllowUserToAddRowsChangedEvent]);
3303 protected virtual void OnAllowUserToDeleteRowsChanged (EventArgs e)
3305 EventHandler eh = (EventHandler)(Events [AllowUserToDeleteRowsChangedEvent]);
3310 protected virtual void OnAllowUserToOrderColumnsChanged (EventArgs e)
3312 EventHandler eh = (EventHandler)(Events [AllowUserToOrderColumnsChangedEvent]);
3317 protected virtual void OnAllowUserToResizeColumnsChanged (EventArgs e)
3319 EventHandler eh = (EventHandler)(Events [AllowUserToResizeColumnsChangedEvent]);
3324 protected virtual void OnAllowUserToResizeRowsChanged (EventArgs e)
3326 EventHandler eh = (EventHandler)(Events [AllowUserToResizeRowsChangedEvent]);
3331 protected virtual void OnAlternatingRowsDefaultCellStyleChanged (EventArgs e)
3333 EventHandler eh = (EventHandler)(Events [AlternatingRowsDefaultCellStyleChangedEvent]);
3338 protected virtual void OnAutoGenerateColumnsChanged (EventArgs e)
3340 EventHandler eh = (EventHandler)(Events [AutoGenerateColumnsChangedEvent]);
3345 protected internal virtual void OnAutoSizeColumnModeChanged (DataGridViewAutoSizeColumnModeEventArgs e)
3347 DataGridViewAutoSizeColumnModeEventHandler eh = (DataGridViewAutoSizeColumnModeEventHandler)(Events [AutoSizeColumnModeChangedEvent]);
3352 protected virtual void OnAutoSizeColumnsModeChanged (DataGridViewAutoSizeColumnsModeEventArgs e)
3354 DataGridViewAutoSizeColumnsModeEventHandler eh = (DataGridViewAutoSizeColumnsModeEventHandler)(Events [AutoSizeColumnsModeChangedEvent]);
3359 protected virtual void OnAutoSizeRowsModeChanged (DataGridViewAutoSizeModeEventArgs e)
3361 DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [AutoSizeRowsModeChangedEvent]);
3366 protected virtual void OnBackgroundColorChanged (EventArgs e)
3368 EventHandler eh = (EventHandler)(Events [BackgroundColorChangedEvent]);
3373 protected override void OnBindingContextChanged (EventArgs e)
3375 base.OnBindingContextChanged(e);
3379 protected virtual void OnBorderStyleChanged (EventArgs e)
3381 EventHandler eh = (EventHandler)(Events [BorderStyleChangedEvent]);
3386 protected virtual void OnCancelRowEdit (QuestionEventArgs e) {
3387 QuestionEventHandler eh = (QuestionEventHandler)(Events [CancelRowEditEvent]);
3392 protected virtual void OnCellBeginEdit (DataGridViewCellCancelEventArgs e)
3394 DataGridViewCellCancelEventHandler eh = (DataGridViewCellCancelEventHandler)(Events [CellBeginEditEvent]);
3399 protected virtual void OnCellBorderStyleChanged (EventArgs e)
3401 EventHandler eh = (EventHandler)(Events [CellBorderStyleChangedEvent]);
3406 protected virtual void OnCellClick (DataGridViewCellEventArgs e)
3408 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3410 cell.OnClickInternal (e);
3412 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellClickEvent]);
3417 protected virtual void OnCellContentClick (DataGridViewCellEventArgs e)
3419 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3421 cell.OnContentClickInternal (e);
3423 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContentClickEvent]);
3428 protected virtual void OnCellContentDoubleClick (DataGridViewCellEventArgs e)
3430 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3432 cell.OnContentDoubleClickInternal (e);
3434 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContentDoubleClickEvent]);
3439 protected virtual void OnCellContextMenuStripChanged (DataGridViewCellEventArgs e)
3441 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContextMenuStripChangedEvent]);
3446 protected virtual void OnCellContextMenuStripNeeded (DataGridViewCellContextMenuStripNeededEventArgs e)
3448 DataGridViewCellContextMenuStripNeededEventHandler eh = (DataGridViewCellContextMenuStripNeededEventHandler)(Events [CellContextMenuStripNeededEvent]);
3453 protected virtual void OnCellDoubleClick (DataGridViewCellEventArgs e)
3455 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3457 cell.OnDoubleClickInternal (e);
3458 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellDoubleClickEvent]);
3463 protected virtual void OnCellEndEdit (DataGridViewCellEventArgs e)
3465 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellEndEditEvent]);
3470 protected virtual void OnCellEnter (DataGridViewCellEventArgs e)
3472 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellEnterEvent]);
3477 protected internal virtual void OnCellErrorTextChanged (DataGridViewCellEventArgs e)
3479 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellErrorTextChangedEvent]);
3484 protected virtual void OnCellErrorTextNeeded (DataGridViewCellErrorTextNeededEventArgs e)
3486 DataGridViewCellErrorTextNeededEventHandler eh = (DataGridViewCellErrorTextNeededEventHandler)(Events [CellErrorTextNeededEvent]);
3491 internal void OnCellFormattingInternal (DataGridViewCellFormattingEventArgs e)
3493 OnCellFormatting (e);
3496 protected virtual void OnCellFormatting (DataGridViewCellFormattingEventArgs e)
3498 DataGridViewCellFormattingEventHandler eh = (DataGridViewCellFormattingEventHandler)(Events [CellFormattingEvent]);
3503 protected virtual void OnCellLeave (DataGridViewCellEventArgs e)
3505 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellLeaveEvent]);
3510 protected virtual void OnCellMouseClick (DataGridViewCellMouseEventArgs e)
3512 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3514 cell.OnMouseClickInternal (e);
3516 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseClickEvent]);
3521 protected virtual void OnCellMouseDoubleClick (DataGridViewCellMouseEventArgs e)
3523 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3525 cell.OnMouseDoubleClickInternal (e);
3527 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseDoubleClickEvent]);
3532 protected virtual void OnCellMouseDown (DataGridViewCellMouseEventArgs e)
3535 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3537 cell.OnMouseDownInternal (e);
3539 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseDownEvent]);
3544 protected virtual void OnCellMouseEnter (DataGridViewCellEventArgs e)
3546 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3548 cell.OnMouseEnterInternal (e.RowIndex);
3550 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellMouseEnterEvent]);
3555 protected virtual void OnCellMouseLeave (DataGridViewCellEventArgs e)
3557 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3559 cell.OnMouseLeaveInternal (e.RowIndex);
3561 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellMouseLeaveEvent]);
3566 protected virtual void OnCellMouseMove (DataGridViewCellMouseEventArgs e)
3568 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3570 cell.OnMouseMoveInternal (e);
3572 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseMoveEvent]);
3577 protected virtual void OnCellMouseUp (DataGridViewCellMouseEventArgs e)
3579 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3581 cell.OnMouseUpInternal (e);
3583 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseUpEvent]);
3588 internal void OnCellPaintingInternal (DataGridViewCellPaintingEventArgs e)
3593 protected virtual void OnCellPainting (DataGridViewCellPaintingEventArgs e)
3595 DataGridViewCellPaintingEventHandler eh = (DataGridViewCellPaintingEventHandler)(Events [CellPaintingEvent]);
3600 protected internal virtual void OnCellParsing (DataGridViewCellParsingEventArgs e)
3602 DataGridViewCellParsingEventHandler eh = (DataGridViewCellParsingEventHandler)(Events [CellParsingEvent]);
3607 internal void OnCellStateChangedInternal (DataGridViewCellStateChangedEventArgs e) {
3608 this.OnCellStateChanged (e);
3611 protected virtual void OnCellStateChanged (DataGridViewCellStateChangedEventArgs e)
3613 DataGridViewCellStateChangedEventHandler eh = (DataGridViewCellStateChangedEventHandler)(Events [CellStateChangedEvent]);
3618 protected virtual void OnCellStyleChanged (DataGridViewCellEventArgs e)
3620 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellStyleChangedEvent]);
3625 protected virtual void OnCellStyleContentChanged (DataGridViewCellStyleContentChangedEventArgs e) {
3626 DataGridViewCellStyleContentChangedEventHandler eh = (DataGridViewCellStyleContentChangedEventHandler)(Events [CellStyleContentChangedEvent]);
3631 protected virtual void OnCellToolTipTextChanged (DataGridViewCellEventArgs e) {
3632 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellToolTipTextChangedEvent]);
3637 protected virtual void OnCellToolTipTextNeeded (DataGridViewCellToolTipTextNeededEventArgs e)
3639 DataGridViewCellToolTipTextNeededEventHandler eh = (DataGridViewCellToolTipTextNeededEventHandler)(Events [CellToolTipTextNeededEvent]);
3644 protected virtual void OnCellValidated (DataGridViewCellEventArgs e)
3646 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellValidatedEvent]);
3651 protected virtual void OnCellValidating (DataGridViewCellValidatingEventArgs e)
3653 DataGridViewCellValidatingEventHandler eh = (DataGridViewCellValidatingEventHandler)(Events [CellValidatingEvent]);
3658 protected virtual void OnCellValueChanged (DataGridViewCellEventArgs e)
3660 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellValueChangedEvent]);
3665 protected internal virtual void OnCellValueNeeded (DataGridViewCellValueEventArgs e)
3667 DataGridViewCellValueEventHandler eh = (DataGridViewCellValueEventHandler)(Events [CellValueNeededEvent]);
3672 protected virtual void OnCellValuePushed (DataGridViewCellValueEventArgs e)
3674 DataGridViewCellValueEventHandler eh = (DataGridViewCellValueEventHandler)(Events [CellValuePushedEvent]);
3679 internal void OnColumnAddedInternal (DataGridViewColumnEventArgs e)
3681 if (e.Column.CellTemplate != null) {
3682 // The first column has just been added programatically instead of
3683 // autogenerated so we need to create the rows for the first time.
3685 if (!is_autogenerating_columns && columns.Count == 1)
3687 foreach (DataGridViewRow row in Rows)
3688 row.Cells.Add ((DataGridViewCell)e.Column.CellTemplate.Clone ());
3691 AutoResizeColumnsInternal ();
3693 PrepareEditingRow (false, true);
3696 protected virtual void OnColumnAdded (DataGridViewColumnEventArgs e)
3698 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnAddedEvent]);
3703 protected internal virtual void OnColumnContextMenuStripChanged (DataGridViewColumnEventArgs e)
3705 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnContextMenuStripChangedEvent]);
3710 protected internal virtual void OnColumnDataPropertyNameChanged (DataGridViewColumnEventArgs e)
3712 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDataPropertyNameChangedEvent]);
3717 protected internal virtual void OnColumnDefaultCellStyleChanged (DataGridViewColumnEventArgs e)
3719 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDefaultCellStyleChangedEvent]);
3724 protected internal virtual void OnColumnDisplayIndexChanged (DataGridViewColumnEventArgs e)
3726 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDisplayIndexChangedEvent]);
3731 protected virtual void OnColumnDividerDoubleClick (DataGridViewColumnDividerDoubleClickEventArgs e)
3733 DataGridViewColumnDividerDoubleClickEventHandler eh = (DataGridViewColumnDividerDoubleClickEventHandler)(Events [ColumnDividerDoubleClickEvent]);
3738 protected internal virtual void OnColumnDividerWidthChanged (DataGridViewColumnEventArgs e)
3740 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDividerWidthChangedEvent]);
3745 protected internal virtual void OnColumnHeaderCellChanged (DataGridViewColumnEventArgs e)
3747 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnHeaderCellChangedEvent]);
3752 protected virtual void OnColumnHeaderMouseClick (DataGridViewCellMouseEventArgs e)
3754 DataGridViewColumn col = Columns[e.ColumnIndex];
3756 if (col.SortMode == DataGridViewColumnSortMode.Automatic) {
3757 ListSortDirection new_order;
3759 // Always use ascending unless we are clicking on a
3760 // column that is already sorted ascending.
3761 if (SortedColumn != col || sortOrder != SortOrder.Ascending)
3762 new_order = ListSortDirection.Ascending;
3764 new_order = ListSortDirection.Descending;
3766 Sort (col, new_order);
3769 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [ColumnHeaderMouseClickEvent]);
3774 protected virtual void OnColumnHeaderMouseDoubleClick (DataGridViewCellMouseEventArgs e)
3776 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [ColumnHeaderMouseDoubleClickEvent]);
3781 protected virtual void OnColumnHeadersBorderStyleChanged (EventArgs e)
3783 EventHandler eh = (EventHandler)(Events [ColumnHeadersBorderStyleChangedEvent]);
3788 protected virtual void OnColumnHeadersDefaultCellStyleChanged (EventArgs e)
3790 EventHandler eh = (EventHandler)(Events [ColumnHeadersDefaultCellStyleChangedEvent]);
3795 protected virtual void OnColumnHeadersHeightChanged (EventArgs e)
3797 EventHandler eh = (EventHandler)(Events [ColumnHeadersHeightChangedEvent]);
3802 protected virtual void OnColumnHeadersHeightSizeModeChanged (DataGridViewAutoSizeModeEventArgs e)
3804 DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [ColumnHeadersHeightSizeModeChangedEvent]);
3809 protected internal virtual void OnColumnMinimumWidthChanged (DataGridViewColumnEventArgs e)
3811 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnMinimumWidthChangedEvent]);
3816 protected internal virtual void OnColumnNameChanged (DataGridViewColumnEventArgs e)
3818 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnNameChangedEvent]);
3823 internal void OnColumnRemovedInternal (DataGridViewColumnEventArgs e)
3825 if (e.Column.CellTemplate != null) {
3826 int index = e.Column.Index;
3828 foreach (DataGridViewRow row in Rows)
3829 row.Cells.RemoveAt (index);
3832 AutoResizeColumnsInternal ();
3833 OnColumnRemoved (e);
3834 PrepareEditingRow (false, true);
3837 protected virtual void OnColumnRemoved (DataGridViewColumnEventArgs e)
3839 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnRemovedEvent]);
3844 protected internal virtual void OnColumnSortModeChanged (DataGridViewColumnEventArgs e)
3846 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnSortModeChangedEvent]);
3851 protected internal virtual void OnColumnStateChanged (DataGridViewColumnStateChangedEventArgs e)
3853 DataGridViewColumnStateChangedEventHandler eh = (DataGridViewColumnStateChangedEventHandler)(Events [ColumnStateChangedEvent]);
3858 protected internal virtual void OnColumnToolTipTextChanged (DataGridViewColumnEventArgs e)
3860 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnToolTipTextChangedEvent]);
3865 protected internal virtual void OnColumnWidthChanged (DataGridViewColumnEventArgs e)
3867 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnWidthChangedEvent]);
3872 protected virtual void OnCurrentCellChanged (EventArgs e)
3874 EventHandler eh = (EventHandler)(Events [CurrentCellChangedEvent]);
3879 protected virtual void OnCurrentCellDirtyStateChanged (EventArgs e)
3881 EventHandler eh = (EventHandler)(Events [CurrentCellDirtyStateChangedEvent]);
3886 protected override void OnCursorChanged (EventArgs e)
3888 base.OnCursorChanged (e);
3891 protected virtual void OnDataBindingComplete (DataGridViewBindingCompleteEventArgs e)
3893 DataGridViewBindingCompleteEventHandler eh = (DataGridViewBindingCompleteEventHandler)(Events [DataBindingCompleteEvent]);
3898 protected virtual void OnDataError (bool displayErrorDialogIfNoHandler, DataGridViewDataErrorEventArgs e)
3900 DataGridViewDataErrorEventHandler eh = (DataGridViewDataErrorEventHandler)(Events [DataErrorEvent]);
3904 else if (displayErrorDialogIfNoHandler)
3905 MessageBox.Show (e.ToString ());
3907 protected virtual void OnDataMemberChanged (EventArgs e) {
3908 EventHandler eh = (EventHandler)(Events [DataMemberChangedEvent]);
3913 protected virtual void OnDataSourceChanged (EventArgs e) {
3914 EventHandler eh = (EventHandler)(Events [DataSourceChangedEvent]);
3919 protected virtual void OnDefaultCellStyleChanged (EventArgs e) {
3920 EventHandler eh = (EventHandler)(Events [DefaultCellStyleChangedEvent]);
3925 protected virtual void OnDefaultValuesNeeded (DataGridViewRowEventArgs e) {
3926 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [DefaultValuesNeededEvent]);
3931 protected override void OnDoubleClick (EventArgs e) {
3932 base.OnDoubleClick(e);
3935 protected virtual void OnEditingControlShowing (DataGridViewEditingControlShowingEventArgs e) {
3936 DataGridViewEditingControlShowingEventHandler eh = (DataGridViewEditingControlShowingEventHandler)(Events [EditingControlShowingEvent]);
3941 protected virtual void OnEditModeChanged (EventArgs e)
3943 EventHandler eh = (EventHandler)(Events [EditModeChangedEvent]);
3948 protected override void OnEnabledChanged (EventArgs e)
3950 base.OnEnabledChanged(e);
3953 protected override void OnEnter (EventArgs e )
3958 protected override void OnGotFocus(EventArgs e)
3960 base.OnGotFocus (e);
3962 // To add focus rectangle if needed
3963 if (currentCell != null && ShowFocusCues)
3964 InvalidateCell (currentCell);
3967 protected override void OnFontChanged (EventArgs e)
3969 base.OnFontChanged(e);
3972 protected override void OnForeColorChanged (EventArgs e)
3974 base.OnForeColorChanged(e);
3977 protected virtual void OnGridColorChanged (EventArgs e)
3979 EventHandler eh = (EventHandler)(Events [GridColorChangedEvent]);
3984 protected override void OnHandleCreated (EventArgs e)
3986 base.OnHandleCreated(e);
3989 if (CurrentCell == null && Rows.Count > 0 && Columns.Count > 0)
3990 MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, false, false, false);
3993 protected override void OnHandleDestroyed(EventArgs e)
3995 base.OnHandleDestroyed (e);
3998 [EditorBrowsable (EditorBrowsableState.Advanced)]
3999 protected override void OnKeyDown (KeyEventArgs e)
4003 e.Handled = ProcessDataGridViewKey (e);
4006 [EditorBrowsable (EditorBrowsableState.Advanced)]
4007 protected override void OnKeyPress (KeyPressEventArgs e)
4012 [EditorBrowsable (EditorBrowsableState.Advanced)]
4013 protected override void OnKeyUp (KeyEventArgs e)
4018 protected override void OnLayout (LayoutEventArgs e)
4020 if (horizontalScrollBar.Visible && verticalScrollBar.Visible) {
4021 horizontalScrollBar.Bounds = new Rectangle (BorderWidth, Height - BorderWidth - horizontalScrollBar.Height, Width - (2 * BorderWidth) - verticalScrollBar.Width, horizontalScrollBar.Height);
4022 verticalScrollBar.Bounds = new Rectangle (Width - BorderWidth - verticalScrollBar.Width, BorderWidth, verticalScrollBar.Width, Height - (2 * BorderWidth) - horizontalScrollBar.Height);
4023 } else if (horizontalScrollBar.Visible)
4024 horizontalScrollBar.Bounds = new Rectangle (BorderWidth, Height - BorderWidth - horizontalScrollBar.Height, Width - (2 * BorderWidth), horizontalScrollBar.Height);
4025 else if (verticalScrollBar.Visible)
4026 verticalScrollBar.Bounds = new Rectangle (Width - BorderWidth - verticalScrollBar.Width, BorderWidth, verticalScrollBar.Width, Height - (2 * BorderWidth));
4028 AutoResizeColumnsInternal ();
4032 protected override void OnLeave (EventArgs e)
4037 protected override void OnLostFocus(EventArgs e)
4039 base.OnLostFocus (e);
4041 // To remove focus rectangle if needed
4042 if (currentCell != null && ShowFocusCues)
4043 InvalidateCell (currentCell);
4046 protected override void OnMouseClick (MouseEventArgs e)
4048 base.OnMouseClick(e);
4050 if (column_resize_active || row_resize_active)
4053 //Console.WriteLine("Mouse: Clicks: {0}; Delta: {1}; X: {2}; Y: {3};", e.Clicks, e.Delta, e.X, e.Y);
4054 HitTestInfo hit = HitTest (e.X, e.Y);
4057 case DataGridViewHitTestType.Cell:
4058 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4059 Point cellpoint = new Point (e.X - display.X, e.Y - display.Y);
4061 OnCellMouseClick (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, cellpoint.X, cellpoint.Y, e));
4063 DataGridViewCell cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex);
4065 if (cell.GetContentBounds (hit.RowIndex).Contains (cellpoint)) {
4066 DataGridViewCellEventArgs dgvcea = new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex);
4067 OnCellContentClick (dgvcea);
4071 case DataGridViewHitTestType.ColumnHeader:
4072 Rectangle display2 = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4073 Point cellpoint2 = new Point (e.X - display2.X, e.Y - display2.Y);
4075 OnColumnHeaderMouseClick (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, cellpoint2.X, cellpoint2.Y, e));
4080 protected override void OnMouseDoubleClick (MouseEventArgs e)
4082 base.OnMouseDoubleClick(e);
4085 private void DoSelectionOnMouseDown (HitTestInfo hitTest)
4087 Keys modifiers = Control.ModifierKeys;
4088 bool isControl = (modifiers & Keys.Control) != 0;
4089 bool isShift = (modifiers & Keys.Shift) != 0;
4090 //bool isRowHeader = hitTest.Type == DataGridViewHitTestType.RowHeader;
4091 //bool isColHeader = hitTest.Type == DataGridViewHitTestType.ColumnHeader;
4092 DataGridViewSelectionMode mode;
4094 switch (hitTest.Type) {
4095 case DataGridViewHitTestType.Cell:
4096 mode = selectionMode;
4098 case DataGridViewHitTestType.ColumnHeader:
4099 mode = selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect ? DataGridViewSelectionMode.FullColumnSelect : selectionMode;
4101 if (mode != DataGridViewSelectionMode.FullColumnSelect)
4104 case DataGridViewHitTestType.RowHeader:
4105 mode = selectionMode == DataGridViewSelectionMode.RowHeaderSelect ? DataGridViewSelectionMode.FullRowSelect : selectionMode;
4107 if (mode != DataGridViewSelectionMode.FullRowSelect)
4109 break; // Handled below
4115 // If SHIFT is pressed:
4116 // Select all from selected_row/column/cell to current row/column/cell, unselect everything else
4118 // Unselect all rows/columns/cells, select the clicked one
4119 int min_row, max_row;
4120 int min_col, max_col;
4122 selected_row = hitTest.RowIndex;
4123 selected_column = hitTest.ColumnIndex;
4126 if (selected_row != -1)
4127 selected_row = hitTest.RowIndex;
4128 if (selected_column != -1)
4129 selected_column = hitTest.ColumnIndex;
4131 if (selected_row >= hitTest.RowIndex) {
4132 min_row = hitTest.RowIndex;
4133 max_row = isShift ? selected_row : min_row;
4135 max_row = hitTest.RowIndex;
4136 min_row = isShift ? selected_row : max_row;
4138 if (selected_column >= hitTest.ColumnIndex) {
4139 min_col = hitTest.ColumnIndex;
4140 max_col = isShift ? selected_column : min_col;
4142 max_col = hitTest.ColumnIndex;
4143 min_col = isShift ? selected_column : max_col;
4147 case DataGridViewSelectionMode.FullRowSelect:
4148 for (int i = 0; i < RowCount; i++) {
4149 bool select = i >= min_row && i <= max_row;
4151 for (int c = 0; c < ColumnCount; c++) {
4152 if (Rows [i].Cells [c].Selected) {
4153 SetSelectedCellCore (c, i, false);
4157 if (select != Rows [i].Selected) {
4158 SetSelectedRowCore (i, select);
4162 case DataGridViewSelectionMode.FullColumnSelect:
4163 for (int i = 0; i < ColumnCount; i++) {
4164 bool select = i >= min_col && i <= max_col;
4166 for (int r = 0; r < RowCount; r++) {
4167 if (Rows [r].Cells [i].Selected) {
4168 SetSelectedCellCore (i, r, false);
4172 if (select != Columns [i].Selected) {
4173 SetSelectedColumnCore (i, select);
4177 case DataGridViewSelectionMode.ColumnHeaderSelect:
4178 case DataGridViewSelectionMode.RowHeaderSelect:
4180 case DataGridViewSelectionMode.CellSelect:
4182 for (int c = 0; c < ColumnCount; c++) {
4183 if (columns [c].Selected)
4184 SetSelectedColumnCore (c, false);
4187 for (int r = 0; r < RowCount; r++) {
4188 if (rows [r].Selected)
4189 SetSelectedRowCore (r, false);
4192 for (int r = 0; r < RowCount; r++) {
4193 for (int c = 0; c < ColumnCount; c++) {
4194 bool select = (r >= min_row && r <= max_row) && (c >= min_col && c <= max_col);
4195 if (select != Rows [r].Cells [c].Selected)
4196 SetSelectedCellCore (c, r, select);
4202 } else if (isControl) {
4203 // Switch the selected state of the row.
4205 case DataGridViewSelectionMode.FullRowSelect:
4206 SetSelectedRowCore (hitTest.RowIndex, !rows [hitTest.RowIndex].Selected);
4208 case DataGridViewSelectionMode.FullColumnSelect:
4209 SetSelectedColumnCore (hitTest.ColumnIndex, !columns [hitTest.ColumnIndex].Selected);
4211 case DataGridViewSelectionMode.ColumnHeaderSelect:
4212 case DataGridViewSelectionMode.RowHeaderSelect:
4214 case DataGridViewSelectionMode.CellSelect:
4215 if (hitTest.ColumnIndex >= 0 && hitTest.RowIndex >= 0) {
4216 SetSelectedCellCore (hitTest.ColumnIndex, hitTest.RowIndex, !Rows [hitTest.RowIndex].Cells [hitTest.ColumnIndex].Selected);
4224 protected override void OnMouseDown (MouseEventArgs e)
4226 base.OnMouseDown(e);
4231 HitTestInfo hitTest = HitTest(e.X, e.Y);
4233 DataGridViewCell cell = null;
4234 DataGridViewRow row = null;
4235 Rectangle cellBounds;
4237 if (hitTest.Type == DataGridViewHitTestType.ColumnHeader && MouseOverColumnResize (hitTest.ColumnIndex, e.X)) {
4238 if (e.Clicks == 2) {
4239 AutoResizeColumn (hitTest.ColumnIndex);
4243 resize_band = hitTest.ColumnIndex;
4244 column_resize_active = true;
4245 resize_band_start = e.X;
4246 resize_band_delta = 0;
4247 DrawVerticalResizeLine (resize_band_start);
4251 if (hitTest.Type == DataGridViewHitTestType.RowHeader && MouseOverRowResize (hitTest.RowIndex, e.Y)) {
4252 if (e.Clicks == 2) {
4253 AutoResizeRow (hitTest.RowIndex);
4257 resize_band = hitTest.RowIndex;
4258 row_resize_active = true;
4259 resize_band_start = e.Y;
4260 resize_band_delta = 0;
4261 DrawHorizontalResizeLine (resize_band_start);
4265 if (hitTest.Type == DataGridViewHitTestType.Cell) {
4266 row = rows [hitTest.RowIndex];
4267 cell = row.Cells [hitTest.ColumnIndex];
4268 SetCurrentCellAddressCore (cell.ColumnIndex, cell.RowIndex, false, true, true);
4269 cellBounds = GetCellDisplayRectangle (hitTest.ColumnIndex, hitTest.RowIndex, false);
4270 OnCellMouseDown (new DataGridViewCellMouseEventArgs (hitTest.ColumnIndex, hitTest.RowIndex, e.X - cellBounds.X, e.Y - cellBounds.Y, e));
4271 OnCellClick (new DataGridViewCellEventArgs (hitTest.ColumnIndex, hitTest.RowIndex));
4274 DoSelectionOnMouseDown (hitTest);
4276 if (hitTest.Type != DataGridViewHitTestType.Cell) {
4277 if (hitTest.Type == DataGridViewHitTestType.ColumnHeader)
4278 pressed_header_cell = columns [hitTest.ColumnIndex].HeaderCell;
4279 else if (hitTest.Type == DataGridViewHitTestType.RowHeader)
4280 pressed_header_cell = rows [hitTest.RowIndex].HeaderCell;
4289 private void UpdateBindingPosition (int position)
4291 if (DataManager != null)
4292 DataManager.Position = position;
4295 protected override void OnMouseEnter (EventArgs e)
4297 base.OnMouseEnter(e);
4300 protected override void OnMouseLeave (EventArgs e)
4302 base.OnMouseLeave (e);
4304 if (hover_cell != null) {
4305 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4309 EnteredHeaderCell = null;
4312 protected override void OnMouseMove (MouseEventArgs e)
4314 base.OnMouseMove (e);
4316 if (column_resize_active) {
4317 // Erase the old line
4318 DrawVerticalResizeLine (resize_band_start + resize_band_delta);
4320 resize_band_delta = e.X - resize_band_start;
4322 // Draw the new line
4323 DrawVerticalResizeLine (resize_band_start + resize_band_delta);
4327 if (row_resize_active) {
4328 // Erase the old line
4329 DrawHorizontalResizeLine (resize_band_start + resize_band_delta);
4331 resize_band_delta = e.Y - resize_band_start;
4333 // Draw the new line
4334 DrawHorizontalResizeLine (resize_band_start + resize_band_delta);
4338 Cursor new_cursor = Cursors.Default;
4339 HitTestInfo hit = this.HitTest (e.X, e.Y);
4341 if (hit.Type == DataGridViewHitTestType.Cell) {
4342 EnteredHeaderCell = null;
4344 DataGridViewCell new_cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex);
4346 // Check if we have moved into an error icon area
4347 Rectangle icon = new_cell.ErrorIconBounds;
4349 if (!icon.IsEmpty) {
4350 Point loc = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false).Location;
4355 if (icon.Contains (e.X, e.Y)) {
4356 if (tooltip_currently_showing != new_cell)
4357 MouseEnteredErrorIcon (new_cell);
4359 MouseLeftErrorIcon (new_cell);
4362 // We have never been in a cell before
4363 if (hover_cell == null) {
4364 hover_cell = new_cell;
4365 OnCellMouseEnter (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex));
4367 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4368 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4373 // Were we already in this cell?
4374 if (hover_cell.RowIndex == hit.RowIndex && hover_cell.ColumnIndex == hit.ColumnIndex) {
4375 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4376 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4381 // We are changing cells
4382 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4384 hover_cell = new_cell;
4386 OnCellMouseEnter (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex));
4388 Rectangle display2 = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4389 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display2.X, e.Y - display2.Y, e));
4392 } else if (hit.Type == DataGridViewHitTestType.RowHeader) {
4393 DataGridViewRowHeaderCell new_cell = Rows[hit.RowIndex].HeaderCell;
4395 EnteredHeaderCell = new_cell;
4397 if (MouseOverRowResize (hit.RowIndex, e.Y))
4398 new_cursor = Cursors.HSplit;
4400 // Check if we have moved into an error icon area
4401 Rectangle icon = new_cell.InternalErrorIconsBounds;
4403 if (!icon.IsEmpty) {
4404 Point loc = GetCellDisplayRectangle (0, hit.RowIndex, false).Location;
4406 icon.X += BorderWidth;
4409 if (icon.Contains (e.X, e.Y)) {
4410 if (tooltip_currently_showing != new_cell)
4411 MouseEnteredErrorIcon (new_cell);
4413 MouseLeftErrorIcon (new_cell);
4415 } else if (hit.Type == DataGridViewHitTestType.TopLeftHeader) {
4416 EnteredHeaderCell = null;
4418 DataGridViewTopLeftHeaderCell new_cell = (DataGridViewTopLeftHeaderCell)TopLeftHeaderCell;
4420 // Check if we have moved into an error icon area
4421 Rectangle icon = new_cell.InternalErrorIconsBounds;
4423 if (!icon.IsEmpty) {
4424 Point loc = Point.Empty;
4426 icon.X += BorderWidth;
4429 if (icon.Contains (e.X, e.Y)) {
4430 if (tooltip_currently_showing != new_cell)
4431 MouseEnteredErrorIcon (new_cell);
4433 MouseLeftErrorIcon (new_cell);
4437 if (hit.Type == DataGridViewHitTestType.ColumnHeader) {
4438 EnteredHeaderCell = Columns [hit.ColumnIndex].HeaderCell;
4440 if (MouseOverColumnResize (hit.ColumnIndex, e.X))
4441 new_cursor = Cursors.VSplit;
4443 EnteredHeaderCell = null;
4445 // We have left the cell area
4446 if (hover_cell != null) {
4447 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4452 Cursor = new_cursor;
4455 protected override void OnMouseUp (MouseEventArgs e)
4459 if (column_resize_active) {
4460 column_resize_active = false;
4462 if (resize_band_delta + Columns[resize_band].Width < 0)
4463 resize_band_delta = -Columns[resize_band].Width;
4465 Columns[resize_band].Width = Math.Max (resize_band_delta + Columns[resize_band].Width, Columns[resize_band].MinimumWidth);
4470 if (row_resize_active) {
4471 row_resize_active = false;
4473 if (resize_band_delta + Rows[resize_band].Height < 0)
4474 resize_band_delta = -Rows[resize_band].Height;
4476 Rows[resize_band].Height = Math.Max (resize_band_delta + Rows[resize_band].Height, Rows[resize_band].MinimumHeight);
4481 HitTestInfo hit = this.HitTest (e.X, e.Y);
4483 if (hit.Type == DataGridViewHitTestType.Cell) {
4484 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4485 OnCellMouseUp (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4488 if (pressed_header_cell != null) {
4489 DataGridViewHeaderCell cell = pressed_header_cell;
4490 pressed_header_cell = null;
4491 if (ThemeEngine.Current.DataGridViewHeaderCellHasPressedStyle (this))
4492 Invalidate (GetHeaderCellBounds (cell));
4496 protected override void OnMouseWheel (MouseEventArgs e)
4498 base.OnMouseWheel(e);
4501 protected virtual void OnMultiSelectChanged (EventArgs e)
4503 EventHandler eh = (EventHandler)(Events [MultiSelectChangedEvent]);
4504 if (eh != null) eh (this, e);
4507 protected virtual void OnNewRowNeeded (DataGridViewRowEventArgs e) {
4508 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [NewRowNeededEvent]);
4509 if (eh != null) eh (this, e);
4512 int first_row_index = 0;
4513 internal int first_col_index = 0;
4515 protected override void OnPaint (PaintEventArgs e)
4519 Graphics g = e.Graphics;
4520 Rectangle bounds = ClientRectangle;
4522 // Paint the background
4523 PaintBackground (g, e.ClipRectangle, bounds);
4525 List<DataGridViewColumn> sortedColumns = columns.ColumnDisplayIndexSortedArrayList;
4527 // Take borders into account
4528 bounds.Inflate (-BorderWidth, -BorderWidth);
4530 // Paint the top left cell
4531 if (rowHeadersVisible && columnHeadersVisible && ColumnCount > 0) {
4532 Rectangle topleftbounds = new Rectangle (bounds.X, bounds.Y, rowHeadersWidth, columnHeadersHeight);
4534 TopLeftHeaderCell.PaintWork (g, e.ClipRectangle, topleftbounds, -1, TopLeftHeaderCell.State, ColumnHeadersDefaultCellStyle, AdvancedColumnHeadersBorderStyle, DataGridViewPaintParts.All);
4537 // Paint the column headers
4538 if (columnHeadersVisible) {
4539 Rectangle headerBounds = bounds;
4540 headerBounds.Height = columnHeadersHeight;
4542 if (rowHeadersVisible)
4543 headerBounds.X += rowHeadersWidth;
4545 for (int index = first_col_index; index < sortedColumns.Count; index++) {
4546 DataGridViewColumn col = sortedColumns[index];
4551 headerBounds.Width = col.Width;
4552 DataGridViewCell cell = col.HeaderCell;
4554 DataGridViewAdvancedBorderStyle intermediateBorderStyle = (DataGridViewAdvancedBorderStyle)((ICloneable)this.AdvancedColumnHeadersBorderStyle).Clone ();
4555 DataGridViewAdvancedBorderStyle borderStyle = AdjustColumnHeaderBorderStyle (this.AdvancedColumnHeadersBorderStyle, intermediateBorderStyle, cell.ColumnIndex == 0, cell.ColumnIndex == columns.Count - 1);
4557 cell.PaintWork (g, e.ClipRectangle, headerBounds, -1, cell.State, cell.InheritedStyle, borderStyle, DataGridViewPaintParts.All);
4559 headerBounds.X += col.Width;
4562 bounds.Y += columnHeadersHeight;
4565 gridWidth = rowHeadersVisible ? rowHeadersWidth : 0;
4568 int first_row_height = Rows.Count > 0 ? Rows[Math.Min (Rows.Count - 1, first_row_index)].Height : 0;
4569 // int room_left = this.Height;
4571 // Reset all columns to !Displayed
4572 for (int i = 0; i < Columns.Count; i++)
4573 Columns[i].DisplayedInternal = false;
4575 // Set Displayed columns
4576 for (int i = first_col_index; i < Columns.Count; i++) {
4577 DataGridViewColumn col = Columns.ColumnDisplayIndexSortedArrayList[i];
4582 col.DisplayedInternal = true;
4583 gridWidth += col.Width;
4585 if (gridWidth >= Width)
4589 // Reset all rows to !Displayed
4590 for (int i = 0; i < Rows.Count; i++)
4591 GetRowInternal (i).DisplayedInternal = false;
4594 for (int index = first_row_index; index < Rows.Count; index++) {
4595 DataGridViewRow row = Rows[index];
4596 GetRowInternal (index).DisplayedInternal = true;
4598 bounds.Height = row.Height;
4599 bool is_first = row.Index == 0;
4600 bool is_last = row.Index == rows.Count - 1;
4602 row.Paint (g, e.ClipRectangle, bounds, row.Index, row.GetState (row.Index), is_first, is_last);
4604 bounds.Y += bounds.Height;
4605 bounds.X = BorderWidth;
4607 if (bounds.Y >= ClientSize.Height - (horizontalScrollBar.Visible ? horizontalScrollBar.Height : 0))
4610 gridHeight += row.Height;
4615 foreach (DataGridViewColumn col in sortedColumns)
4617 gridWidth += col.Width;
4621 foreach (DataGridViewRow row in Rows)
4622 gridHeight += row.Height;
4624 if (rowHeadersVisible)
4625 gridWidth += rowHeadersWidth;
4627 if (columnHeadersVisible)
4628 gridHeight += columnHeadersHeight;
4630 bool horizontalVisible = false;
4631 bool verticalVisible = false;
4634 if (gridWidth > Size.Width || gridHeight > Size.Height)
4635 Size = new Size(gridWidth, gridHeight);
4638 if (gridWidth > Size.Width)
4639 horizontalVisible = true;
4640 if (gridHeight > Size.Height)
4641 verticalVisible = true;
4643 if (horizontalScrollBar.Visible && (gridHeight + horizontalScrollBar.Height) > Size.Height)
4644 verticalVisible = true;
4645 if (verticalScrollBar.Visible && (gridWidth + verticalScrollBar.Width) > Size.Width)
4646 horizontalVisible = true;
4648 if (scrollBars != ScrollBars.Vertical && scrollBars != ScrollBars.Both)
4649 verticalVisible = false;
4650 if (scrollBars != ScrollBars.Horizontal && scrollBars != ScrollBars.Both)
4651 horizontalVisible = false;
4653 if (horizontalVisible) {
4654 horizontalScrollBar.Minimum = 0;
4655 horizontalScrollBar.Maximum = gridWidth;
4656 horizontalScrollBar.SmallChange = Columns[first_col_index].Width;
4657 int largeChange = ClientSize.Width - rowHeadersWidth;
4658 if (largeChange <= 0)
4659 largeChange = ClientSize.Width;
4660 horizontalScrollBar.LargeChange = largeChange;
4662 if (verticalVisible) {
4663 verticalScrollBar.Minimum = 0;
4664 verticalScrollBar.Maximum = gridHeight;
4665 verticalScrollBar.SmallChange = first_row_height + 1;
4666 int largeChange = ClientSize.Height - columnHeadersHeight;
4667 if (largeChange <= 0)
4668 largeChange = ClientSize.Height;
4669 verticalScrollBar.LargeChange = largeChange;
4673 horizontalScrollBar.Visible = horizontalVisible;
4674 verticalScrollBar.Visible = verticalVisible;
4676 // Paint the bottom right square if both scrollbars are displayed
4677 if (horizontalScrollBar.Visible && verticalScrollBar.Visible)
4678 g.FillRectangle (SystemBrushes.Control, new Rectangle (horizontalScrollBar.Right, verticalScrollBar.Bottom, verticalScrollBar.Width, horizontalScrollBar.Height));
4681 bounds = ClientRectangle;
4683 switch (BorderStyle) {
4684 case BorderStyle.FixedSingle:
4685 g.DrawRectangle (Pens.Black, new Rectangle (bounds.Left, bounds.Top, bounds.Width - 1, bounds.Height - 1));
4687 case BorderStyle.Fixed3D:
4688 ControlPaint.DrawBorder3D (g, bounds, Border3DStyle.Sunken);
4693 protected virtual void OnReadOnlyChanged (EventArgs e) {
4694 EventHandler eh = (EventHandler)(Events [ReadOnlyChangedEvent]);
4699 protected override void OnResize (EventArgs e) {
4701 AutoResizeColumnsInternal ();
4703 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
4704 OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
4707 protected override void OnRightToLeftChanged (EventArgs e) {
4708 base.OnRightToLeftChanged(e);
4711 // In MSDN2 documentation there's no internal here
4712 protected internal virtual void OnRowContextMenuStripChanged (DataGridViewRowEventArgs e)
4714 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowContextMenuStripChangedEvent]);
4715 if (eh != null) eh (this, e);
4718 protected virtual void OnRowContextMenuStripNeeded (DataGridViewRowContextMenuStripNeededEventArgs e)
4720 DataGridViewRowContextMenuStripNeededEventHandler eh = (DataGridViewRowContextMenuStripNeededEventHandler)(Events [RowContextMenuStripNeededEvent]);
4721 if (eh != null) eh (this, e);
4724 protected internal virtual void OnRowDefaultCellStyleChanged (DataGridViewRowEventArgs e)
4726 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowDefaultCellStyleChangedEvent]);
4727 if (eh != null) eh (this, e);
4730 protected virtual void OnRowDirtyStateNeeded (QuestionEventArgs e)
4732 QuestionEventHandler eh = (QuestionEventHandler)(Events [RowDirtyStateNeededEvent]);
4733 if (eh != null) eh (this, e);
4736 protected virtual void OnRowDividerDoubleClick (DataGridViewRowDividerDoubleClickEventArgs e)
4738 DataGridViewRowDividerDoubleClickEventHandler eh = (DataGridViewRowDividerDoubleClickEventHandler)(Events [RowDividerDoubleClickEvent]);
4739 if (eh != null) eh (this, e);
4742 protected virtual void OnRowDividerHeightChanged (DataGridViewRowEventArgs e)
4744 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowDividerHeightChangedEvent]);
4745 if (eh != null) eh (this, e);
4748 protected virtual void OnRowEnter (DataGridViewCellEventArgs e)
4750 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowEnterEvent]);
4751 if (eh != null) eh (this, e);
4754 protected internal virtual void OnRowErrorTextChanged (DataGridViewRowEventArgs e)
4756 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowErrorTextChangedEvent]);
4757 if (eh != null) eh (this, e);
4760 protected virtual void OnRowErrorTextNeeded (DataGridViewRowErrorTextNeededEventArgs e)
4762 DataGridViewRowErrorTextNeededEventHandler eh = (DataGridViewRowErrorTextNeededEventHandler)(Events [RowErrorTextNeededEvent]);
4763 if (eh != null) eh (this, e);
4766 protected internal virtual void OnRowHeaderCellChanged (DataGridViewRowEventArgs e)
4768 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowHeaderCellChangedEvent]);
4769 if (eh != null) eh (this, e);
4772 protected virtual void OnRowHeaderMouseClick (DataGridViewCellMouseEventArgs e)
4774 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [RowHeaderMouseClickEvent]);
4775 if (eh != null) eh (this, e);
4778 protected virtual void OnRowHeaderMouseDoubleClick (DataGridViewCellMouseEventArgs e)
4780 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [RowHeaderMouseDoubleClickEvent]);
4781 if (eh != null) eh (this, e);
4784 protected virtual void OnRowHeadersBorderStyleChanged (EventArgs e)
4786 EventHandler eh = (EventHandler)(Events [RowHeadersBorderStyleChangedEvent]);
4787 if (eh != null) eh (this, e);
4790 protected virtual void OnRowHeadersDefaultCellStyleChanged (EventArgs e)
4792 EventHandler eh = (EventHandler)(Events [RowHeadersDefaultCellStyleChangedEvent]);
4793 if (eh != null) eh (this, e);
4796 protected virtual void OnRowHeadersWidthChanged (EventArgs e)
4798 EventHandler eh = (EventHandler)(Events [RowHeadersWidthChangedEvent]);
4799 if (eh != null) eh (this, e);
4802 protected virtual void OnRowHeadersWidthSizeModeChanged (DataGridViewAutoSizeModeEventArgs e)
4804 DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [RowHeadersWidthSizeModeChangedEvent]);
4805 if (eh != null) eh (this, e);
4808 protected internal virtual void OnRowHeightChanged (DataGridViewRowEventArgs e)
4810 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowHeightChangedEvent]);
4811 if (eh != null) eh (this, e);
4814 protected virtual void OnRowHeightInfoNeeded (DataGridViewRowHeightInfoNeededEventArgs e)
4816 DataGridViewRowHeightInfoNeededEventHandler eh = (DataGridViewRowHeightInfoNeededEventHandler)(Events [RowHeightInfoNeededEvent]);
4817 if (eh != null) eh (this, e);
4820 protected virtual void OnRowHeightInfoPushed (DataGridViewRowHeightInfoPushedEventArgs e)
4822 DataGridViewRowHeightInfoPushedEventHandler eh = (DataGridViewRowHeightInfoPushedEventHandler)(Events [RowHeightInfoPushedEvent]);
4823 if (eh != null) eh (this, e);
4826 protected virtual void OnRowLeave (DataGridViewCellEventArgs e)
4828 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowLeaveEvent]);
4829 if (eh != null) eh (this, e);
4832 protected internal virtual void OnRowMinimumHeightChanged (DataGridViewRowEventArgs e)
4834 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowMinimumHeightChangedEvent]);
4835 if (eh != null) eh (this, e);
4838 protected internal virtual void OnRowPostPaint (DataGridViewRowPostPaintEventArgs e)
4840 DataGridViewRowPostPaintEventHandler eh = (DataGridViewRowPostPaintEventHandler)(Events [RowPostPaintEvent]);
4841 if (eh != null) eh (this, e);
4844 protected internal virtual void OnRowPrePaint (DataGridViewRowPrePaintEventArgs e)
4846 DataGridViewRowPrePaintEventHandler eh = (DataGridViewRowPrePaintEventHandler)(Events [RowPrePaintEvent]);
4847 if (eh != null) eh (this, e);
4850 internal void OnRowsAddedInternal (DataGridViewRowsAddedEventArgs e)
4852 if (hover_cell != null && hover_cell.RowIndex >= e.RowIndex)
4855 AutoResizeColumnsInternal ();
4860 protected virtual void OnRowsAdded (DataGridViewRowsAddedEventArgs e)
4862 DataGridViewRowsAddedEventHandler eh = (DataGridViewRowsAddedEventHandler)(Events [RowsAddedEvent]);
4863 if (eh != null) eh (this, e);
4866 protected virtual void OnRowsDefaultCellStyleChanged (EventArgs e)
4868 EventHandler eh = (EventHandler)(Events [RowsDefaultCellStyleChangedEvent]);
4869 if (eh != null) eh (this, e);
4872 internal void OnRowsRemovedInternal (DataGridViewRowsRemovedEventArgs e)
4874 if (selected_rows != null)
4875 selected_rows.InternalClear ();
4876 if (selected_columns != null)
4877 selected_columns.InternalClear ();
4879 if (Rows.Count == 0) {
4880 MoveCurrentCell (-1, -1, true, false, false, true);
4882 } else if (Columns.Count == 0) {
4883 MoveCurrentCell (-1, -1, true, false, false, true);
4886 int nextRowIndex = e.RowIndex;
4887 if (nextRowIndex >= Rows.Count)
4888 nextRowIndex = Rows.Count - 1;
4889 MoveCurrentCell (currentCell != null ? currentCell.ColumnIndex : 0, nextRowIndex,
4890 true, false, false, true);
4891 if (hover_cell != null && hover_cell.RowIndex >= e.RowIndex)
4899 protected virtual void OnRowsRemoved (DataGridViewRowsRemovedEventArgs e)
4901 DataGridViewRowsRemovedEventHandler eh = (DataGridViewRowsRemovedEventHandler)(Events [RowsRemovedEvent]);
4902 if (eh != null) eh (this, e);
4905 protected internal virtual void OnRowStateChanged (int rowIndex, DataGridViewRowStateChangedEventArgs e)
4907 DataGridViewRowStateChangedEventHandler eh = (DataGridViewRowStateChangedEventHandler)(Events [RowStateChangedEvent]);
4908 if (eh != null) eh (this, e);
4911 protected virtual void OnRowUnshared (DataGridViewRowEventArgs e)
4913 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowUnsharedEvent]);
4914 if (eh != null) eh (this, e);
4917 protected virtual void OnRowValidated (DataGridViewCellEventArgs e)
4919 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowValidatedEvent]);
4920 if (eh != null) eh (this, e);
4923 protected virtual void OnRowValidating (DataGridViewCellCancelEventArgs e)
4925 DataGridViewCellCancelEventHandler eh = (DataGridViewCellCancelEventHandler)(Events [RowValidatingEvent]);
4926 if (eh != null) eh (this, e);
4929 protected virtual void OnScroll (ScrollEventArgs e)
4931 ScrollEventHandler eh = (ScrollEventHandler)(Events [ScrollEvent]);
4932 if (eh != null) eh (this, e);
4935 protected virtual void OnSelectionChanged (EventArgs e)
4937 EventHandler eh = (EventHandler)(Events [SelectionChangedEvent]);
4938 if (eh != null) eh (this, e);
4941 protected virtual void OnSortCompare (DataGridViewSortCompareEventArgs e) {
4942 DataGridViewSortCompareEventHandler eh = (DataGridViewSortCompareEventHandler)(Events [SortCompareEvent]);
4943 if (eh != null) eh (this, e);
4946 protected virtual void OnSorted (EventArgs e)
4948 EventHandler eh = (EventHandler)(Events [SortedEvent]);
4949 if (eh != null) eh (this, e);
4952 protected virtual void OnUserAddedRow (DataGridViewRowEventArgs e)
4954 PrepareEditingRow (false, false);
4956 new_row_editing = true;
4957 if (DataManager != null) {
4958 // Switch the current editing row with a real one
4959 if (editing_row != null) {
4960 Rows.RemoveInternal (editing_row);
4963 DataManager.AddNew (); // will raise OnListPositionChanged
4966 e = new DataGridViewRowEventArgs (Rows[NewRowIndex]);
4967 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [UserAddedRowEvent]);
4968 if (eh != null) eh (this, e);
4971 protected virtual void OnUserDeletedRow (DataGridViewRowEventArgs e)
4973 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [UserDeletedRowEvent]);
4974 if (eh != null) eh (this, e);
4977 protected virtual void OnUserDeletingRow (DataGridViewRowCancelEventArgs e)
4979 DataGridViewRowCancelEventHandler eh = (DataGridViewRowCancelEventHandler)(Events [UserDeletingRowEvent]);
4980 if (eh != null) eh (this, e);
4983 protected override void OnValidating (CancelEventArgs e)
4985 base.OnValidating(e);
4988 protected override void OnVisibleChanged (EventArgs e)
4990 base.OnVisibleChanged(e);
4993 protected virtual void PaintBackground (Graphics graphics, Rectangle clipBounds, Rectangle gridBounds)
4995 graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (backgroundColor), gridBounds);
4998 protected bool ProcessAKey (Keys keyData)
5003 if ((keyData & Keys.Control) == Keys.Control) {
5011 protected virtual bool ProcessDataGridViewKey (KeyEventArgs e)
5013 switch (e.KeyData & ~Keys.Modifiers) {
5015 return ProcessAKey (e.KeyData);
5017 return ProcessDeleteKey (e.KeyData);
5019 return ProcessDownKey (e.KeyData);
5021 return ProcessEscapeKey (e.KeyData);
5023 return ProcessEndKey (e.KeyData);
5025 return ProcessEnterKey (e.KeyData);
5027 return ProcessF2Key (e.KeyData);
5029 return ProcessHomeKey (e.KeyData);
5031 return ProcessLeftKey (e.KeyData);
5033 return ProcessNextKey (e.KeyData);
5035 return ProcessPriorKey (e.KeyData);
5037 return ProcessRightKey (e.KeyData);
5039 return ProcessSpaceKey (e.KeyData);
5041 return ProcessTabKey (e.KeyData);
5043 return ProcessUpKey (e.KeyData);
5046 return ProcessZeroKey (e.KeyData);
5052 protected bool ProcessDeleteKey (Keys keyData)
5054 if (!AllowUserToDeleteRows || SelectedRows.Count == 0)
5057 int index = Math.Max (selected_row - SelectedRows.Count + 1, 0);
5059 for (int i = SelectedRows.Count - 1; i >= 0; i--) {
5060 DataGridViewRow row = SelectedRows[i];
5065 if (hover_cell != null && hover_cell.OwningRow == row)
5068 if (DataManager != null)
5069 DataManager.RemoveAt (row.Index);
5071 Rows.RemoveAt (row.Index);
5077 protected override bool ProcessDialogKey (Keys keyData)
5081 case Keys.Shift | Keys.Tab:
5083 return base.ProcessDialogKey (keyData & ~Keys.Control);
5085 if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
5089 case Keys.Control | Keys.Tab:
5090 case Keys.Control | Keys.Shift | Keys.Tab:
5092 return base.ProcessDialogKey (keyData & ~Keys.Control);
5094 if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
5100 if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
5106 return base.ProcessDialogKey(keyData);
5109 protected bool ProcessDownKey (Keys keyData)
5111 int current_row = CurrentCellAddress.Y;
5113 if (current_row < Rows.Count - 1) {
5114 // Move to the last cell in the column
5115 if ((keyData & Keys.Control) == Keys.Control)
5116 MoveCurrentCell (CurrentCellAddress.X, Rows.Count - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5117 // Move one cell down
5119 MoveCurrentCell (CurrentCellAddress.X, current_row + 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5127 protected bool ProcessEndKey (Keys keyData)
5129 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5131 // Move to the last cell in the control
5132 if ((keyData & Keys.Control) == Keys.Control) {
5133 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), Rows.Count - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5137 // Move to the last cell in the row
5138 if (disp_index < Columns.Count - 1) {
5139 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5146 protected bool ProcessEnterKey (Keys keyData)
5148 if (ProcessDownKey (keyData))
5151 // ProcessDown may fail if we are on the last row,
5152 // but Enter should still EndEdit if this is the last row
5157 protected bool ProcessEscapeKey (Keys keyData)
5159 if (!IsCurrentCellInEditMode)
5166 protected bool ProcessF2Key (Keys keyData)
5168 if (editMode == DataGridViewEditMode.EditOnF2 || editMode == DataGridViewEditMode.EditOnKeystrokeOrF2) {
5176 protected bool ProcessHomeKey (Keys keyData)
5178 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5180 // Move to the first cell in the control
5181 if ((keyData & Keys.Control) == Keys.Control) {
5182 MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5186 // Move to the first cell in the row
5187 if (disp_index > 0) {
5188 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5195 [MonoTODO ("What does insert do?")]
5196 protected bool ProcessInsertKey (Keys keyData)
5201 protected override bool ProcessKeyEventArgs (ref Message m)
5203 DataGridViewCell cell = CurrentCell;
5206 if (cell.KeyEntersEditMode (new KeyEventArgs ((Keys)m.WParam.ToInt32 ())))
5208 if (EditingControl != null && ((Msg)m.Msg == Msg.WM_KEYDOWN || (Msg)m.Msg == Msg.WM_CHAR))
5209 XplatUI.SendMessage (EditingControl.Handle, (Msg)m.Msg, m.WParam, m.LParam);
5212 return base.ProcessKeyEventArgs (ref m);
5215 protected override bool ProcessKeyPreview (ref Message m)
5217 if ((Msg)m.Msg == Msg.WM_KEYDOWN && (IsCurrentCellInEditMode || m.HWnd == horizontalScrollBar.Handle || m.HWnd == verticalScrollBar.Handle)) {
5218 KeyEventArgs e = new KeyEventArgs ((Keys)m.WParam.ToInt32 ());
5220 IDataGridViewEditingControl ctrl = (IDataGridViewEditingControl)EditingControlInternal;
5223 if (ctrl.EditingControlWantsInputKey (e.KeyData, false))
5226 switch (e.KeyData) {
5235 return ProcessDataGridViewKey (e);
5239 return base.ProcessKeyPreview (ref m);
5242 protected bool ProcessLeftKey (Keys keyData)
5244 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5246 if (disp_index > 0) {
5247 // Move to the first cell in the row
5248 if ((keyData & Keys.Control) == Keys.Control)
5249 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5250 // Move one cell to the left
5252 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5261 protected bool ProcessNextKey (Keys keyData)
5263 int current_row = CurrentCellAddress.Y;
5265 if (current_row < Rows.Count - 1) {
5266 // Move one "page" of cells down
5267 int new_row = Math.Min (Rows.Count - 1, current_row + DisplayedRowCount (false));
5269 MoveCurrentCell (CurrentCellAddress.X, new_row, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5278 protected bool ProcessPriorKey (Keys keyData)
5280 int current_row = CurrentCellAddress.Y;
5282 if (current_row > 0) {
5283 // Move one "page" of cells up
5284 int new_row = Math.Max (0, current_row - DisplayedRowCount (false));
5286 MoveCurrentCell (CurrentCellAddress.X, new_row, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5294 protected bool ProcessRightKey (Keys keyData)
5296 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5298 if (disp_index < Columns.Count - 1) {
5299 // Move to the last cell in the row
5300 if ((keyData & Keys.Control) == Keys.Control)
5301 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5302 // Move one cell to the right
5304 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index + 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5312 protected bool ProcessSpaceKey (Keys keyData)
5314 if ((keyData & Keys.Shift) == Keys.Shift) {
5315 if (selectionMode == DataGridViewSelectionMode.RowHeaderSelect) {
5316 SetSelectedRowCore (CurrentCellAddress.Y, true);
5317 InvalidateRow (CurrentCellAddress.Y);
5320 if (selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect) {
5321 SetSelectedColumnCore (CurrentCellAddress.X, true);
5322 InvalidateColumn (CurrentCellAddress.X);
5327 if (CurrentCell is DataGridViewButtonCell || CurrentCell is DataGridViewLinkCell || CurrentCell is DataGridViewCheckBoxCell) {
5328 DataGridViewCellEventArgs e = new DataGridViewCellEventArgs (CurrentCell.ColumnIndex, CurrentCell.RowIndex);
5331 OnCellContentClick (e);
5333 if (CurrentCell is DataGridViewButtonCell)
5334 (CurrentCell as DataGridViewButtonCell).OnClickInternal (e);
5335 if (CurrentCell is DataGridViewCheckBoxCell)
5336 (CurrentCell as DataGridViewCheckBoxCell).OnClickInternal (e);
5344 protected bool ProcessTabKey (Keys keyData)
5346 Form f = FindForm ();
5349 f.ActivateFocusCues ();
5351 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5354 // Shift-tab goes backwards
5355 if ((keyData & Keys.Shift) == Keys.Shift) {
5356 if (disp_index > 0) {
5357 // Move one cell to the left
5358 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, false, true);
5360 } else if (currentCellAddress.Y > 0) {
5361 // Move to the last cell in the previous row
5362 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y - 1, true, false, false, true);
5367 if (disp_index < Columns.Count - 1) {
5368 // Move one cell to the right
5369 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index + 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, false, true);
5372 } else if (currentCellAddress.Y < Rows.Count - 1) {
5373 // Move to the first cell in the next row
5374 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y + 1, true, false, false, true);
5384 protected bool ProcessUpKey (Keys keyData)
5386 int current_row = CurrentCellAddress.Y;
5388 if (current_row > 0) {
5389 // Move to the first cell in the column
5390 if ((keyData & Keys.Control) == Keys.Control)
5391 MoveCurrentCell (CurrentCellAddress.X, 0, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5394 MoveCurrentCell (CurrentCellAddress.X, current_row - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5402 protected bool ProcessZeroKey (Keys keyData)
5404 if ((keyData & Keys.Control) == Keys.Control && CurrentCell.EditType != null) {
5405 CurrentCell.Value = DBNull.Value;
5406 InvalidateCell (CurrentCell);
5413 protected override void SetBoundsCore (int x, int y, int width, int height, BoundsSpecified specified) {
5414 base.SetBoundsCore(x, y, width, height, specified);
5417 [MonoTODO ("Does not use validateCurrentCell")]
5418 protected virtual bool SetCurrentCellAddressCore (int columnIndex, int rowIndex, bool setAnchorCellAddress, bool validateCurrentCell, bool throughMouseClick)
5420 if ((columnIndex < 0 || columnIndex > Columns.Count - 1) && rowIndex != -1)
5421 throw new ArgumentOutOfRangeException ("columnIndex");
5422 if ((rowIndex < 0 || rowIndex > Rows.Count - 1) && columnIndex != -1)
5423 throw new ArgumentOutOfRangeException ("rowIndex");
5425 DataGridViewCell cell;
5427 if (columnIndex == -1 && rowIndex == -1)
5430 cell = Rows.SharedRow (rowIndex).Cells[columnIndex];
5432 if (cell != null && !cell.Visible)
5433 throw new InvalidOperationException ("cell is not visible");
5435 // Always update the current cell address property
5436 // If the row has moved it would be out of date.
5437 if (currentCell != null) {
5438 if (setAnchorCellAddress) {
5439 anchor_cell.X = currentCell.ColumnIndex;
5440 anchor_cell.Y = currentCell.RowIndex;
5442 currentCellAddress.X = currentCell.ColumnIndex;
5443 currentCellAddress.Y = currentCell.RowIndex;
5446 if (cell != currentCell) {
5447 if (currentCell != null) {
5448 if (currentCell.IsInEditMode) {
5451 else if (currentCell.RowIndex == NewRowIndex && new_row_editing)
5454 OnCellLeave (new DataGridViewCellEventArgs(currentCell.ColumnIndex, currentCell.RowIndex));
5455 OnRowLeave (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
5459 if (setAnchorCellAddress)
5460 anchor_cell = new Point (columnIndex, rowIndex);
5461 currentCellAddress = new Point (columnIndex, rowIndex);
5464 UpdateBindingPosition (cell.RowIndex);
5465 OnRowEnter (new DataGridViewCellEventArgs (cell.ColumnIndex, cell.RowIndex));
5466 OnCellEnter (new DataGridViewCellEventArgs(cell.ColumnIndex, cell.RowIndex));
5468 OnCurrentCellChanged (EventArgs.Empty);
5471 // If the user begins an edit in the NewRow, add a new row
5472 if (AllowUserToAddRows && cell.RowIndex == NewRowIndex && !is_binding && !new_row_editing) {
5473 // OnUserAddedRow will add a real row and reset the current cell
5474 OnUserAddedRow (new DataGridViewRowEventArgs (Rows[NewRowIndex]));
5476 if (editMode == DataGridViewEditMode.EditOnEnter)
5481 if (cell != null && throughMouseClick)
5488 protected virtual void SetSelectedCellCore (int columnIndex, int rowIndex, bool selected) {
5489 rows [rowIndex].Cells [columnIndex].Selected = selected;
5491 OnSelectionChanged (EventArgs.Empty);
5494 internal void SetSelectedColumnCoreInternal (int columnIndex, bool selected) {
5495 SetSelectedColumnCore (columnIndex, selected);
5498 protected virtual void SetSelectedColumnCore (int columnIndex, bool selected) {
5499 if (selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect && selectionMode != DataGridViewSelectionMode.FullColumnSelect)
5502 DataGridViewColumn col = columns [columnIndex];
5504 col.SelectedInternal = selected;
5506 if (selected_columns == null)
5507 selected_columns = new DataGridViewSelectedColumnCollection ();
5509 if (!selected && selected_columns.Contains (col)) {
5510 selected_columns.InternalRemove (col);
5511 } else if (selected && !selected_columns.Contains (col)) {
5512 selected_columns.InternalAdd (col);
5518 internal void SetSelectedRowCoreInternal (int rowIndex, bool selected) {
5519 if (rowIndex >= 0 && rowIndex < Rows.Count)
5520 SetSelectedRowCore (rowIndex, selected);
5523 protected virtual void SetSelectedRowCore (int rowIndex, bool selected) {
5524 DataGridViewRow row = rows [rowIndex];
5526 row.SelectedInternal = selected;
5528 if (selected_rows == null)
5529 selected_rows = new DataGridViewSelectedRowCollection (this);
5531 if (!selected && selected_rows.Contains (row)) {
5532 selected_rows.InternalRemove (row);
5533 } else if (selected && !selected_rows.Contains (row)) {
5534 selected_rows.InternalAdd (row);
5540 protected override void WndProc (ref Message m)
5542 base.WndProc (ref m);
5545 internal void InternalOnCellClick (DataGridViewCellEventArgs e)
5550 internal void InternalOnCellContentClick (DataGridViewCellEventArgs e)
5552 OnCellContentClick (e);
5555 internal void InternalOnCellContentDoubleClick (DataGridViewCellEventArgs e)
5557 OnCellContentDoubleClick (e);
5560 internal void InternalOnCellValueChanged (DataGridViewCellEventArgs e)
5562 OnCellValueChanged (e);
5565 internal void InternalOnDataError (DataGridViewDataErrorEventArgs e)
5567 /////////////// false? ////////////
5568 OnDataError (false, e);
5571 internal void InternalOnMouseWheel (MouseEventArgs e)
5576 internal void OnHScrollBarScroll (object sender, ScrollEventArgs e)
5578 horizontalScrollingOffset = e.NewValue;
5581 for (int index = 0; index < Columns.Count; index++) {
5582 DataGridViewColumn col = Columns[index];
5584 if (e.NewValue < left + col.Width) {
5585 if (first_col_index != index) {
5586 first_col_index = index;
5598 internal void OnVScrollBarScroll (object sender, ScrollEventArgs e)
5600 verticalScrollingOffset = e.NewValue;
5601 if (Rows.Count == 0)
5606 for (int index = 0; index < Rows.Count; index++) {
5607 DataGridViewRow row = Rows[index];
5608 if (e.NewValue < top + row.Height) {
5609 if (first_row_index != index) {
5610 first_row_index = index;
5621 first_row_index = Rows.Count - DisplayedRowCount (false);
5626 internal void RaiseCellStyleChanged (DataGridViewCellEventArgs e) {
5627 OnCellStyleChanged(e);
5630 internal void OnColumnCollectionChanged (object sender, CollectionChangeEventArgs e) {
5632 case CollectionChangeAction.Add:
5633 OnColumnAddedInternal(new DataGridViewColumnEventArgs(e.Element as DataGridViewColumn));
5635 case CollectionChangeAction.Remove:
5636 OnColumnRemovedInternal(new DataGridViewColumnEventArgs(e.Element as DataGridViewColumn));
5638 case CollectionChangeAction.Refresh:
5643 // Resizes all columns according to their AutoResizeMode property.
5644 // First all the columns that aren't Filled are resized, then we resize all the Filled columns.
5645 internal void AutoResizeColumnsInternal ()
5647 for (int i = 0; i < Columns.Count; i++)
5648 AutoResizeColumnInternal (i, Columns [i].InheritedAutoSizeMode);
5650 AutoFillColumnsInternal ();
5653 internal void AutoFillColumnsInternal ()
5655 float totalFillWeight = 0;
5656 int FillCount = 0; // The number of columns that has AutoSizeMode.Fill set
5657 int spaceLeft = ClientSize.Width - (verticalScrollBar.VisibleInternal ? verticalScrollBar.Width : 0);
5659 if (RowHeadersVisible) {
5660 spaceLeft -= RowHeadersWidth;
5662 spaceLeft -= BorderWidth * 2;
5664 int [] fixed_widths = new int [Columns.Count];
5665 int [] new_widths = new int [Columns.Count];
5666 bool fixed_any = false;
5668 for (int i = 0; i < Columns.Count; i++) {
5669 DataGridViewColumn col = Columns [i];
5671 switch (col.InheritedAutoSizeMode) {
5672 case DataGridViewAutoSizeColumnMode.Fill:
5674 totalFillWeight += col.FillWeight;
5676 case DataGridViewAutoSizeColumnMode.AllCellsExceptHeader:
5677 case DataGridViewAutoSizeColumnMode.AllCells:
5678 case DataGridViewAutoSizeColumnMode.DisplayedCells:
5679 case DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader:
5680 case DataGridViewAutoSizeColumnMode.None:
5681 case DataGridViewAutoSizeColumnMode.NotSet:
5682 spaceLeft -= Columns [i].Width;
5687 spaceLeft = Math.Max (0, spaceLeft);
5691 for (int i = 0; i < columns.Count; i++) {
5692 DataGridViewColumn col = Columns [i];
5695 if (col.InheritedAutoSizeMode != DataGridViewAutoSizeColumnMode.Fill)
5698 if (fixed_widths [i] != 0)
5701 width = (totalFillWeight == 0) ? 0 : (int) Math.Round (spaceLeft * (col.FillWeight / totalFillWeight), 0);
5706 if (width < col.MinimumWidth) {
5707 width = col.MinimumWidth;
5708 fixed_widths [i] = width;
5711 totalFillWeight -= col.FillWeight;
5714 new_widths [i] = width;
5716 } while (fixed_any);
5718 for (int i = 0; i < columns.Count; i++) {
5719 if (Columns [i].InheritedAutoSizeMode != DataGridViewAutoSizeColumnMode.Fill)
5722 Columns [i].Width = new_widths [i];
5726 internal void AutoResizeColumnInternal (int columnIndex, DataGridViewAutoSizeColumnMode mode)
5728 // http://msdn2.microsoft.com/en-us/library/ms171605.aspx
5731 DataGridViewColumn col = Columns [columnIndex];
5734 case DataGridViewAutoSizeColumnMode.Fill:
5736 case DataGridViewAutoSizeColumnMode.AllCellsExceptHeader:
5737 case DataGridViewAutoSizeColumnMode.AllCells:
5738 case DataGridViewAutoSizeColumnMode.DisplayedCells:
5739 case DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader:
5740 size = Math.Max (CalculateColumnCellWidth (columnIndex, col.InheritedAutoSizeMode),
5741 col.HeaderCell.ContentBounds.Width);
5743 case DataGridViewAutoSizeColumnMode.ColumnHeader:
5744 size = col.HeaderCell.ContentBounds.Width;
5753 if (size < col.MinimumWidth)
5754 size = col.MinimumWidth;
5759 internal int CalculateColumnCellWidth (int index, DataGridViewAutoSizeColumnMode mode)
5763 bool only_visible = false;
5765 if (mode == DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader ||
5766 mode == DataGridViewAutoSizeColumnMode.AllCellsExceptHeader)
5769 only_visible = (mode == DataGridViewAutoSizeColumnMode.DisplayedCells || mode == DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader);
5771 for (int i = first_row; i < Rows.Count; i++) {
5773 Rectangle row_rect = this.GetRowDisplayRectangle (i, false);
5774 if (!ClientRectangle.IntersectsWith (row_rect))
5778 int cell_width = Rows[i].Cells[index].PreferredSize.Width;
5780 result = Math.Max (result, cell_width);
5786 Rectangle GetHeaderCellBounds (DataGridViewHeaderCell cell)
5788 Rectangle bounds = new Rectangle (ClientRectangle.Location, cell.Size);
5789 if (cell is DataGridViewColumnHeaderCell) {
5790 if (RowHeadersVisible)
5791 bounds.X += RowHeadersWidth;
5792 List<DataGridViewColumn> sortedColumns = columns.ColumnDisplayIndexSortedArrayList;
5793 for (int index = first_col_index; index < sortedColumns.Count; index++) {
5794 DataGridViewColumn column = sortedColumns [index];
5795 if (column.Index == cell.ColumnIndex)
5797 bounds.X += column.Width;
5800 if (ColumnHeadersVisible)
5801 bounds.Y += ColumnHeadersHeight;
5802 for (int index = first_row_index; index < Rows.Count; index++) {
5803 DataGridViewRow row = GetRowInternal (index);
5804 if (row.HeaderCell == cell)
5806 bounds.Y += row.Height;
5812 private void PrepareEditingRow (bool cell_changed, bool column_changed)
5814 if (new_row_editing)
5819 show = ColumnCount > 0 && AllowUserToAddRows;
5822 RemoveEditingRow ();
5824 if (editing_row != null && (cell_changed || column_changed)) {
5825 // The row changed, it's no longer an editing row.
5827 // The number of columns has changed, we need a new editing row.
5828 RemoveEditingRow ();
5830 if (editing_row == null) {
5831 editing_row = RowTemplateFull;
5832 Rows.AddInternal (editing_row, false);
5837 internal void RemoveEditingRow ()
5839 if (editing_row != null) {
5840 if (Rows.Contains (editing_row))
5841 Rows.RemoveInternal (editing_row);
5846 internal DataGridViewRow EditingRow {
5847 get { return editing_row; }
5850 private void AddBoundRow (object element)
5852 // Don't add rows if there are no columns
5853 if (ColumnCount == 0)
5856 DataGridViewRow row = (DataGridViewRow)RowTemplateFull;
5857 rows.InternalAdd (row);
5859 PropertyDescriptorCollection properties = TypeDescriptor.GetProperties (element);
5861 foreach (PropertyDescriptor property in properties) {
5862 if (property.PropertyType == typeof (IBindingList))
5865 // We do it this way because there may not be a column
5866 // for every cell, ignore cells with no column
5867 DataGridViewCell cell = row.Cells.GetBoundCell (property.Name);
5872 cell.Value = property.GetValue (element);
5873 cell.ValueType = property.PropertyType;
5877 private bool IsColumnAlreadyBound (string name)
5879 foreach (DataGridViewColumn col in Columns)
5880 if (col.DataPropertyName == name)
5886 private DataGridViewColumn CreateColumnByType (Type type)
5888 if (type == typeof (bool))
5889 return new DataGridViewCheckBoxColumn ();
5890 else if (typeof(Bitmap).IsAssignableFrom (type))
5891 return new DataGridViewImageColumn ();
5893 return new DataGridViewTextBoxColumn ();
5896 private void ClearBinding ()
5898 if (IsCurrentCellInEditMode && !EndEdit ())
5900 MoveCurrentCell (-1, -1, false, false, false, true);
5902 if (DataManager != null) {
5903 DataManager.ListChanged -= OnListChanged;
5904 DataManager.PositionChanged -= OnListPositionChanged;
5905 columns.ClearAutoGeneratedColumns ();
5907 RemoveEditingRow ();
5911 private void ResetRows ()
5914 RemoveEditingRow ();
5915 if (DataManager != null) {
5916 foreach (object element in DataManager.List)
5917 AddBoundRow (element);
5919 PrepareEditingRow (false, true);
5920 OnListPositionChanged (this, EventArgs.Empty);
5923 private void DoBinding ()
5925 /* 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:
5926 - the System.Collections.IList interface, including one-dimensional arrays.
5927 - the System.ComponentModel.IListSource interface, such as the System.Data.DataTable and System.Data.DataSet classes.
5928 - the System.ComponentModel.IBindingList interface, such as the System.ComponentModel.Collections.BindingList<> class.
5929 - the System.ComponentModel.IBindingListView interface, such as the System.Windows.Forms.BindingSource class.
5932 if (dataSource != null && DataManager != null) {
5933 if (autoGenerateColumns) {
5934 is_autogenerating_columns = true;
5936 foreach (PropertyDescriptor property in DataManager.GetItemProperties()) {
5937 // This keeps out things like arrays
5938 if ((typeof(ICollection).IsAssignableFrom (property.PropertyType)))
5941 if (IsColumnAlreadyBound (property.DisplayName))
5944 DataGridViewColumn col = CreateColumnByType (property.PropertyType);
5945 col.Name = property.DisplayName;
5946 col.DataPropertyName = property.DisplayName;
5947 col.ReadOnly = !DataManager.AllowEdit || property.IsReadOnly;
5948 col.SetIsDataBound (true);
5949 col.ValueType = property.PropertyType;
5950 col.AutoGenerated = true;
5954 is_autogenerating_columns = false;
5957 // DataBind both autogenerated and not columns if there is a matching property
5958 foreach (PropertyDescriptor property in DataManager.GetItemProperties()) {
5959 foreach (DataGridViewColumn col in Columns) {
5960 if (col.DataPropertyName == property.Name)
5961 col.SetIsDataBound (true);
5965 foreach (object element in DataManager.List)
5966 AddBoundRow (element);
5968 DataManager.ListChanged += OnListChanged;
5969 DataManager.PositionChanged += OnListPositionChanged;
5970 OnDataBindingComplete (new DataGridViewBindingCompleteEventArgs (ListChangedType.Reset));
5971 OnListPositionChanged (this, EventArgs.Empty);
5973 if (Rows.Count > 0 && Columns.Count > 0)
5974 MoveCurrentCell (0, 0, true, false, false, false);
5977 PrepareEditingRow (false, true);
5982 private void MoveCurrentCell (int x, int y, bool select, bool isControl, bool isShift, bool scroll)
5984 if (x == -1 || y == -1)
5987 if (!SetCurrentCellAddressCore (x, y, true, false, false)) {
5991 if (x == -1 && y == -1) {
5996 bool full_row_selected = Rows.SharedRow(CurrentCellAddress.Y).Selected;
5997 bool full_col_selected = Columns[CurrentCellAddress.X].Selected;
6000 DataGridViewSelectionMode mode = selectionMode;
6002 // If we are row header select and we clicked a row header, use full row
6003 if (mode == DataGridViewSelectionMode.RowHeaderSelect && (x == -1 || (full_row_selected && CurrentCellAddress.X == x)))
6004 mode = DataGridViewSelectionMode.FullRowSelect;
6005 else if (mode == DataGridViewSelectionMode.RowHeaderSelect)
6006 mode = DataGridViewSelectionMode.CellSelect;
6008 // If we are col header select and we clicked a col header, use full col
6009 if (mode == DataGridViewSelectionMode.ColumnHeaderSelect && (y == -1 || (full_col_selected && CurrentCellAddress.Y == y)))
6010 mode = DataGridViewSelectionMode.FullColumnSelect;
6011 else if (mode == DataGridViewSelectionMode.ColumnHeaderSelect)
6012 mode = DataGridViewSelectionMode.CellSelect;
6014 // If the current cell isn't visible, scroll to it
6016 int disp_x = ColumnIndexToDisplayIndex (x);
6018 if (disp_x < first_col_index) {
6022 delta_x = horizontalScrollBar.Value;
6024 for (int i = disp_x; i < first_col_index; i++)
6025 delta_x += Columns[ColumnDisplayIndexToIndex (i)].Width;
6027 horizontalScrollBar.SafeValueSet (horizontalScrollBar.Value - delta_x);
6028 OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
6032 int displayedRowsCount = DisplayedRowCount (false);
6035 if (disp_y < first_row_index) {
6037 delta_y = verticalScrollBar.Value;
6039 for (int i = disp_y; i < first_row_index; i++)
6040 delta_y += GetRowInternal (i).Height;
6042 verticalScrollBar.SafeValueSet (verticalScrollBar.Value - delta_y);
6043 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
6044 } else if (disp_y > first_row_index + displayedRowsCount - 1) {
6045 if (disp_y == Rows.Count - 1)
6046 delta_y = verticalScrollBar.Maximum - verticalScrollBar.Value;
6048 for (int i = first_row_index + displayedRowsCount - 1; i < disp_y; i++)
6049 delta_y += GetRowInternal (i).Height;
6051 verticalScrollBar.SafeValueSet (verticalScrollBar.Value + delta_y);
6052 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
6059 // Clear old selection unless multi-selecting
6064 case DataGridViewSelectionMode.CellSelect:
6065 SetSelectedCellCore (x, y, true);
6067 case DataGridViewSelectionMode.FullRowSelect:
6068 SetSelectedRowCore (y, true);
6070 case DataGridViewSelectionMode.FullColumnSelect:
6071 SetSelectedColumnCore (x, true);
6078 private int ColumnIndexToDisplayIndex (int index)
6082 return Columns[index].DisplayIndex;
6085 private int ColumnDisplayIndexToIndex (int index)
6087 return Columns.ColumnDisplayIndexSortedArrayList[index].Index;
6090 private void OnListChanged (object sender, ListChangedEventArgs args)
6092 switch (args.ListChangedType) {
6093 case ListChangedType.ItemAdded:
6094 AddBoundRow (DataManager[args.NewIndex]);
6096 case ListChangedType.ItemDeleted:
6097 Rows.RemoveAtInternal (args.NewIndex);
6099 case ListChangedType.ItemChanged:
6109 private void OnListPositionChanged (object sender, EventArgs args)
6111 if (Rows.Count > 0 && Columns.Count > 0 && DataManager.Position != -1)
6112 MoveCurrentCell (currentCell != null ? currentCell.ColumnIndex : 0, DataManager.Position,
6113 true, false, false, true);
6115 MoveCurrentCell (-1, -1, true, false, false, true);
6118 private void ReBind ()
6128 private bool MouseOverColumnResize (int col, int mousex)
6130 if (!allowUserToResizeColumns)
6133 Rectangle col_bounds = GetCellDisplayRectangle (col, 0, false);
6135 if (mousex >= col_bounds.Right - 4 && mousex <= col_bounds.Right)
6141 private bool MouseOverRowResize (int row, int mousey)
6143 if (!allowUserToResizeRows)
6146 Rectangle row_bounds = GetCellDisplayRectangle (0, row, false);
6148 if (mousey >= row_bounds.Bottom - 4 && mousey <= row_bounds.Bottom)
6154 private void DrawVerticalResizeLine (int x)
6156 Rectangle splitter = new Rectangle (x, Bounds.Y + 3 + (ColumnHeadersVisible ? ColumnHeadersHeight : 0), 1, Bounds.Height - 3 - (ColumnHeadersVisible ? ColumnHeadersHeight : 0));
6157 XplatUI.DrawReversibleRectangle (Handle, splitter, 2);
6160 private void DrawHorizontalResizeLine (int y)
6162 Rectangle splitter = new Rectangle (Bounds.X + 3 + (RowHeadersVisible ? RowHeadersWidth : 0), y, Bounds.Width - 3 + (RowHeadersVisible ? RowHeadersWidth : 0), 1);
6163 XplatUI.DrawReversibleRectangle (Handle, splitter, 2);
6166 #region Stuff for ToolTips
6167 private void MouseEnteredErrorIcon (DataGridViewCell item)
6169 tooltip_currently_showing = item;
6170 ToolTipTimer.Start ();
6173 private void MouseLeftErrorIcon (DataGridViewCell item)
6175 ToolTipTimer.Stop ();
6176 ToolTipWindow.Hide (this);
6177 tooltip_currently_showing = null;
6180 private Timer ToolTipTimer {
6182 if (tooltip_timer == null) {
6183 tooltip_timer = new Timer ();
6184 tooltip_timer.Enabled = false;
6185 tooltip_timer.Interval = 500;
6186 tooltip_timer.Tick += new EventHandler (ToolTipTimer_Tick);
6189 return tooltip_timer;
6193 private ToolTip ToolTipWindow {
6195 if (tooltip_window == null)
6196 tooltip_window = new ToolTip ();
6198 return tooltip_window;
6202 private void ToolTipTimer_Tick (object o, EventArgs args)
6204 string tooltip = tooltip_currently_showing.ErrorText;
6206 if (!string.IsNullOrEmpty (tooltip))
6207 ToolTipWindow.Present (this, tooltip);
6209 ToolTipTimer.Stop ();
6213 private class ColumnSorter : IComparer
6219 public ColumnSorter (DataGridViewColumn column, ListSortDirection direction, bool numeric)
6221 this.column = column.Index;
6222 this.numeric_sort = numeric;
6224 if (direction == ListSortDirection.Descending)
6225 this.direction = -1;
6228 #region IComparer Members
6229 public int Compare (object x, object y)
6231 DataGridViewRow row1 = (DataGridViewRow)x;
6232 DataGridViewRow row2 = (DataGridViewRow)y;
6234 if (row1.Cells[column].ValueType == typeof (DateTime) && row2.Cells[column].ValueType == typeof (DateTime))
6235 return DateTime.Compare ((DateTime)row1.Cells[column].Value, (DateTime)row2.Cells[column].Value) * direction;
6237 object val1 = row1.Cells[column].FormattedValue;
6238 object val2 = row2.Cells[column].FormattedValue;
6239 object val1NullValue = row1.Cells[column].InheritedStyle.NullValue;
6240 object val2NullValue = row2.Cells[column].InheritedStyle.NullValue;
6242 if (val1 == val1NullValue && val2 == val2NullValue)
6244 if (val1 == val1NullValue)
6246 if (val2 == val2NullValue)
6247 return -1 * direction;
6250 return (int)(double.Parse (val1.ToString ()) - double.Parse (val2.ToString ())) * direction;
6252 return string.Compare (val1.ToString (), val2.ToString ()) * direction;
6257 public sealed class HitTestInfo {
6259 public static readonly HitTestInfo Nowhere = new HitTestInfo(-1, -1, -1, -1, DataGridViewHitTestType.None);
6261 private int columnIndex;
6262 private int columnX;
6263 private int rowIndex;
6265 private DataGridViewHitTestType type;
6267 internal HitTestInfo (int columnIndex, int columnX, int rowIndex, int rowY, DataGridViewHitTestType type) {
6268 this.columnIndex = columnIndex;
6269 this.columnX = columnX;
6270 this.rowIndex = rowIndex;
6275 public int ColumnIndex {
6276 get { return columnIndex; }
6279 public int ColumnX {
6280 get { return columnX; }
6283 public int RowIndex {
6284 get { return rowIndex; }
6288 get { return rowY; }
6291 public DataGridViewHitTestType Type {
6292 get { return type; }
6295 public override bool Equals (object value) {
6296 if (value is HitTestInfo) {
6297 HitTestInfo aux = (HitTestInfo) value;
6298 if (aux.columnIndex == columnIndex && aux.columnX == columnX && aux.rowIndex == rowIndex && aux.rowY == rowY && aux.type == type) {
6305 public override int GetHashCode () {
6306 return base.GetHashCode();
6309 public override string ToString () {
6310 return string.Format ("Type:{0}, Column:{1}, Row:{2}", type, columnIndex, rowIndex);
6315 [ComVisible (false)]
6316 public class DataGridViewControlCollection : Control.ControlCollection
6318 private DataGridView owner;
6320 public DataGridViewControlCollection (DataGridView owner) : base (owner)
6325 public override void Clear ()
6328 // This is severely buggy, just as MS' implementation is.
6330 for (int i = 0; i < Count; i++) {
6335 public void CopyTo (Control [] array, int index)
6337 base.CopyTo (array, index);
6340 public void Insert (int index, Control value)
6342 throw new NotSupportedException ();
6345 public override void Remove (Control value)
6347 if (value == owner.horizontalScrollBar)
6350 if (value == owner.verticalScrollBar)
6353 if (value == owner.editingControl)
6356 base.Remove (value);
6359 internal void RemoveInternal (Control value)
6361 base.Remove (value);
6367 [ComVisibleAttribute(true)]
6368 protected class DataGridViewAccessibleObject : ControlAccessibleObject {
6370 public DataGridViewAccessibleObject (DataGridView owner) : base (owner){
6373 public override AccessibleRole Role {
6374 get { return base.Role; }
6377 public override string Name {
6378 get { return base.Name; }
6381 public override AccessibleObject GetChild (int index) {
6382 return base.GetChild(index);
6385 public override int GetChildCount () {
6386 return base.GetChildCount();
6389 public override AccessibleObject GetFocused () {
6390 return base.GetFocused();
6393 public override AccessibleObject GetSelected () {
6394 return base.GetSelected();
6397 public override AccessibleObject HitTest (int x, int y) {
6398 return base.HitTest(x, y);
6401 public override AccessibleObject Navigate( AccessibleNavigation navigationDirection) {
6402 return base.Navigate(navigationDirection);
6408 protected class DataGridViewTopRowAccessibleObject : AccessibleObject
6410 #region Constructors
6411 public DataGridViewTopRowAccessibleObject ()
6415 public DataGridViewTopRowAccessibleObject (DataGridView owner)
6421 #region Public Methods
6422 public override AccessibleObject GetChild (int index)
6424 return base.GetChild (index);
6427 public override int GetChildCount ()
6429 return base.GetChildCount ();
6432 public override AccessibleObject Navigate (AccessibleNavigation navigationDirection)
6434 return base.Navigate (navigationDirection);
6438 #region Public Properties
6439 public override Rectangle Bounds {
6440 get { return base.Bounds; }
6443 public override string Name {
6444 get { return base.Name; }
6447 public DataGridView Owner {
6448 get { return (DataGridView)owner; }
6451 throw new InvalidOperationException ("owner has already been set");
6457 public override AccessibleObject Parent {
6458 get { return base.Parent; }
6461 public override AccessibleRole Role {
6462 get { return base.Role; }
6465 public override string Value {
6466 get { return base.Value; }