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>
29 using System.ComponentModel;
30 using System.Runtime.InteropServices;
32 using System.Reflection;
33 using System.Collections;
35 using System.Collections.Generic;
37 namespace System.Windows.Forms {
39 [ComVisibleAttribute(true)]
40 [ClassInterfaceAttribute(ClassInterfaceType.AutoDispatch)]
41 [Designer("System.Windows.Forms.Design.DataGridViewDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
42 [Editor("System.Windows.Forms.Design.DataGridViewComponentEditor, " + Consts.AssemblySystem_Design, typeof (System.ComponentModel.ComponentEditor))]
43 [ComplexBindingProperties ("DataSource", "DataMember")]
44 [DefaultEvent ("CellContentClick")]
45 [Docking (DockingBehavior.Ask)]
46 public class DataGridView : Control, ISupportInitialize, IBindableComponent, IDropTarget
49 private DataGridViewAdvancedBorderStyle adjustedTopLeftHeaderBorderStyle;
50 private DataGridViewAdvancedBorderStyle advancedCellBorderStyle;
51 private DataGridViewAdvancedBorderStyle advancedColumnHeadersBorderStyle;
52 private DataGridViewAdvancedBorderStyle advancedRowHeadersBorderStyle;
53 private bool allowUserToAddRows;
54 private bool allowUserToDeleteRows;
55 private bool allowUserToOrderColumns;
56 private bool allowUserToResizeColumns;
57 private bool allowUserToResizeRows;
58 private DataGridViewCellStyle alternatingRowsDefaultCellStyle;
59 private Point anchor_cell;
60 private bool autoGenerateColumns;
61 private bool autoSize;
62 private DataGridViewAutoSizeColumnsMode autoSizeColumnsMode;
63 private DataGridViewAutoSizeRowsMode autoSizeRowsMode;
64 private Color backColor;
65 private Color backgroundColor;
66 private Image backgroundImage;
67 private BorderStyle borderStyle;
68 private DataGridViewCellBorderStyle cellBorderStyle;
69 private DataGridViewClipboardCopyMode clipboardCopyMode;
70 private DataGridViewHeaderBorderStyle columnHeadersBorderStyle;
71 private DataGridViewCellStyle columnHeadersDefaultCellStyle;
72 private int columnHeadersHeight;
73 private DataGridViewColumnHeadersHeightSizeMode columnHeadersHeightSizeMode;
74 private bool columnHeadersVisible;
75 private DataGridViewColumnCollection columns;
76 private DataGridViewCell currentCell;
77 private Point currentCellAddress;
78 private DataGridViewRow currentRow;
79 private string dataMember;
80 private object dataSource;
81 private DataGridViewCellStyle defaultCellStyle;
82 //private Control editingControl;
83 private DataGridViewEditMode editMode;
84 private bool enableHeadersVisualStyles = true;
85 private DataGridViewCell firstDisplayedCell;
86 private int firstDisplayedScrollingColumnHiddenWidth;
87 private int firstDisplayedScrollingColumnIndex;
88 private int firstDisplayedScrollingRowIndex;
89 private Color gridColor = Color.FromKnownColor(KnownColor.ControlDark);
90 private int horizontalScrollingOffset;
91 private DataGridViewCell hover_cell = null;
92 private bool isCurrentCellDirty;
93 //private bool isCurrentRowDirty;
94 private bool multiSelect;
95 private bool readOnly;
96 private DataGridViewHeaderBorderStyle rowHeadersBorderStyle;
97 private DataGridViewCellStyle rowHeadersDefaultCellStyle;
98 private bool rowHeadersVisible;
99 private int rowHeadersWidth;
100 private DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode;
101 private DataGridViewRowCollection rows;
102 private DataGridViewCellStyle rowsDefaultCellStyle;
103 private DataGridViewRow rowTemplate;
104 private ScrollBars scrollBars;
105 private DataGridViewSelectionMode selectionMode;
106 private bool showCellErrors;
107 private bool showCellToolTips;
108 private bool showEditingIcon;
109 private bool showRowErrors;
110 private DataGridViewColumn sortedColumn = null;
111 private SortOrder sortOrder;
112 private bool standardTab;
113 private DataGridViewHeaderCell topLeftHeaderCell;
114 private Cursor userSetCursor;
115 private int verticalScrollingOffset;
116 private bool virtualMode;
117 private HScrollBar horizontalScrollBar;
118 private VScrollBar verticalScrollBar;
119 private Control editingControl;
120 private bool new_row_commited = true;
122 // These are used to implement selection behaviour with SHIFT pressed.
123 private int selected_row = -1;
124 private int selected_column = -1;
126 // Stuff for error Tooltips
127 private Timer tooltip_timer;
128 private ToolTip tooltip_window;
129 private DataGridViewCell tooltip_currently_showing;
131 private DataGridViewSelectedRowCollection selected_rows;
132 private DataGridViewSelectedColumnCollection selected_columns;
133 private DataGridViewRow editing_row;
135 private int gridWidth;
136 private int gridHeight;
138 DataGridViewHeaderCell pressed_header_cell;
139 DataGridViewHeaderCell entered_header_cell;
141 // For column/row resizing via mouse
142 private bool column_resize_active = false;
143 private bool row_resize_active = false;
144 private int resize_band = -1;
145 private int resize_band_start = 0;
146 private int resize_band_delta = 0;
148 public DataGridView ()
150 SetStyle (ControlStyles.Opaque, true);
151 //SetStyle (ControlStyles.UserMouse, true);
152 SetStyle (ControlStyles.OptimizedDoubleBuffer, true);
154 adjustedTopLeftHeaderBorderStyle = new DataGridViewAdvancedBorderStyle();
155 adjustedTopLeftHeaderBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
156 advancedCellBorderStyle = new DataGridViewAdvancedBorderStyle();
157 advancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
158 advancedColumnHeadersBorderStyle = new DataGridViewAdvancedBorderStyle();
159 advancedColumnHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
160 advancedRowHeadersBorderStyle = new DataGridViewAdvancedBorderStyle();
161 advancedRowHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
162 alternatingRowsDefaultCellStyle = new DataGridViewCellStyle();
163 allowUserToAddRows = true;
164 allowUserToDeleteRows = true;
165 allowUserToOrderColumns = false;
166 allowUserToResizeColumns = true;
167 allowUserToResizeRows = true;
168 autoGenerateColumns = true;
169 autoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
170 autoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
171 backColor = Control.DefaultBackColor;
172 backgroundColor = SystemColors.AppWorkspace;
173 borderStyle = BorderStyle.FixedSingle;
174 cellBorderStyle = DataGridViewCellBorderStyle.Single;
175 clipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithAutoHeaderText;
176 columnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
177 columnHeadersDefaultCellStyle = new DataGridViewCellStyle();
178 columnHeadersDefaultCellStyle.BackColor = SystemColors.Control;
179 columnHeadersDefaultCellStyle.ForeColor = SystemColors.WindowText;
180 columnHeadersDefaultCellStyle.SelectionBackColor = SystemColors.Highlight;
181 columnHeadersDefaultCellStyle.SelectionForeColor = SystemColors.HighlightText;
182 columnHeadersDefaultCellStyle.Font = this.Font;
183 columnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
184 columnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.True;
185 columnHeadersHeight = 23;
186 columnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
187 columnHeadersVisible = true;
188 columns = CreateColumnsInstance();
189 columns.CollectionChanged += OnColumnCollectionChanged;
190 dataMember = String.Empty;
191 defaultCellStyle = new DataGridViewCellStyle();
192 defaultCellStyle.BackColor = SystemColors.Window;
193 defaultCellStyle.ForeColor = SystemColors.ControlText;
194 defaultCellStyle.SelectionBackColor = SystemColors.Highlight;
195 defaultCellStyle.SelectionForeColor = SystemColors.HighlightText;
196 defaultCellStyle.Font = this.Font;
197 defaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
198 defaultCellStyle.WrapMode = DataGridViewTriState.False;
199 editMode = DataGridViewEditMode.EditOnKeystrokeOrF2;
200 firstDisplayedScrollingColumnHiddenWidth = 0;
201 isCurrentCellDirty = false;
204 rowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
205 rowHeadersDefaultCellStyle = (DataGridViewCellStyle) columnHeadersDefaultCellStyle.Clone ();
206 rowHeadersVisible = true;
207 rowHeadersWidth = 41;
208 rowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing;
209 rows = CreateRowsInstance();
210 rowsDefaultCellStyle = new DataGridViewCellStyle();
211 selectionMode = DataGridViewSelectionMode.RowHeaderSelect;
212 showCellErrors = true;
213 showEditingIcon = true;
214 userSetCursor = Cursor.Current;
217 horizontalScrollBar = new HScrollBar();
218 horizontalScrollBar.Scroll += OnHScrollBarScroll;
219 horizontalScrollBar.Visible = false;
221 verticalScrollBar = new VScrollBar();
222 verticalScrollBar.Scroll += OnVScrollBarScroll;
223 verticalScrollBar.Visible = false;
225 Controls.AddRange (new Control[] {horizontalScrollBar, verticalScrollBar});
228 void ISupportInitialize.BeginInit ()
232 void ISupportInitialize.EndInit ()
239 [EditorBrowsable (EditorBrowsableState.Advanced)]
240 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
241 public virtual DataGridViewAdvancedBorderStyle AdjustedTopLeftHeaderBorderStyle {
242 get { return adjustedTopLeftHeaderBorderStyle; }
246 [EditorBrowsable (EditorBrowsableState.Advanced)]
247 public DataGridViewAdvancedBorderStyle AdvancedCellBorderStyle {
248 get { return advancedCellBorderStyle; }
252 [EditorBrowsable (EditorBrowsableState.Advanced)]
253 public DataGridViewAdvancedBorderStyle AdvancedColumnHeadersBorderStyle {
254 get { return advancedColumnHeadersBorderStyle; }
258 [EditorBrowsable (EditorBrowsableState.Advanced)]
259 public DataGridViewAdvancedBorderStyle AdvancedRowHeadersBorderStyle {
260 get { return advancedRowHeadersBorderStyle; }
263 [DefaultValue (true)]
264 public bool AllowUserToAddRows {
265 get { return allowUserToAddRows; }
267 if (allowUserToAddRows != value) {
268 allowUserToAddRows = value;
269 OnAllowUserToAddRowsChanged(EventArgs.Empty);
270 PrepareEditingRow (false, false);
276 [DefaultValue (true)]
277 public bool AllowUserToDeleteRows {
278 get { return allowUserToDeleteRows; }
280 if (allowUserToDeleteRows != value) {
281 allowUserToDeleteRows = value;
282 OnAllowUserToDeleteRowsChanged(EventArgs.Empty);
287 [DefaultValue (false)]
288 public bool AllowUserToOrderColumns {
289 get { return allowUserToOrderColumns; }
291 if (allowUserToOrderColumns != value) {
292 allowUserToOrderColumns = value;
293 OnAllowUserToOrderColumnsChanged(EventArgs.Empty);
298 [DefaultValue (true)]
299 public bool AllowUserToResizeColumns {
300 get { return allowUserToResizeColumns; }
302 if (allowUserToResizeColumns != value) {
303 allowUserToResizeColumns = value;
304 OnAllowUserToResizeColumnsChanged(EventArgs.Empty);
309 [DefaultValue (true)]
310 public bool AllowUserToResizeRows {
311 get { return allowUserToResizeRows; }
313 if (allowUserToResizeRows != value) {
314 allowUserToResizeRows = value;
315 OnAllowUserToResizeRowsChanged(EventArgs.Empty);
320 public DataGridViewCellStyle AlternatingRowsDefaultCellStyle {
321 get { return alternatingRowsDefaultCellStyle; }
323 if (alternatingRowsDefaultCellStyle != value) {
324 alternatingRowsDefaultCellStyle = value;
325 OnAlternatingRowsDefaultCellStyleChanged(EventArgs.Empty);
332 [EditorBrowsable (EditorBrowsableState.Advanced)]
333 [DefaultValue (true)]
334 public bool AutoGenerateColumns {
335 get { return autoGenerateColumns; }
337 if (autoGenerateColumns != value) {
338 autoGenerateColumns = value;
339 OnAutoGenerateColumnsChanged(EventArgs.Empty);
344 public override bool AutoSize {
345 get { return autoSize; }
347 if (autoSize != value) {
349 //OnAutoSizeChanged(EventArgs.Empty);
354 [DefaultValue (DataGridViewAutoSizeColumnsMode.None)]
355 public DataGridViewAutoSizeColumnsMode AutoSizeColumnsMode {
356 get { return autoSizeColumnsMode; }
358 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeColumnsMode), value)) {
359 throw new InvalidEnumArgumentException("Value is not valid DataGridViewAutoSizeColumnsMode.");
361 if (value == DataGridViewAutoSizeColumnsMode.ColumnHeader && columnHeadersVisible == false) {
362 foreach (DataGridViewColumn col in columns) {
363 if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet) {
364 throw new InvalidOperationException("Cant set this property to ColumnHeader in this DataGridView.");
368 if (value == DataGridViewAutoSizeColumnsMode.Fill) {
369 foreach (DataGridViewColumn col in columns) {
370 if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet) {
372 throw new InvalidOperationException("Cant set this property to Fill in this DataGridView.");
378 autoSizeColumnsMode = value;
379 AutoResizeColumns (value);
384 [DefaultValue (DataGridViewAutoSizeRowsMode.None)]
385 public DataGridViewAutoSizeRowsMode AutoSizeRowsMode {
386 get { return autoSizeRowsMode; }
388 if (autoSizeRowsMode != value) {
389 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeRowsMode), value)) {
390 throw new InvalidEnumArgumentException("Value is not valid DataGridViewRowsMode.");
392 if ((value == DataGridViewAutoSizeRowsMode.AllHeaders || value == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && rowHeadersVisible == false) {
393 throw new InvalidOperationException("Cant set this property to AllHeaders or DisplayedHeaders in this DataGridView.");
395 autoSizeRowsMode = value;
397 if (value == DataGridViewAutoSizeRowsMode.None)
398 foreach (DataGridViewRow row in Rows)
399 row.ResetToExplicitHeight ();
401 AutoResizeRows (value);
403 OnAutoSizeRowsModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
405 ////////////////////////////////////////////////////////////////
411 [EditorBrowsable (EditorBrowsableState.Never)]
412 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
413 public override Color BackColor {
414 get { return backColor; }
416 if (backColor != value) {
418 OnBackColorChanged(EventArgs.Empty);
423 public Color BackgroundColor {
424 get { return backgroundColor; }
426 if (backgroundColor != value) {
427 if (value == Color.Empty) {
428 throw new ArgumentException("Cant set an Empty color.");
430 backgroundColor = value;
431 OnBackgroundColorChanged(EventArgs.Empty);
437 [EditorBrowsable (EditorBrowsableState.Never)]
438 public override Image BackgroundImage {
439 get { return backgroundImage; }
441 if (backgroundImage != value) {
442 backgroundImage = value;
443 OnBackgroundImageChanged(EventArgs.Empty);
449 [EditorBrowsable (EditorBrowsableState.Never)]
450 public override ImageLayout BackgroundImageLayout {
451 get { return base.BackgroundImageLayout; }
452 set { base.BackgroundImageLayout = value; }
455 [DefaultValue (BorderStyle.FixedSingle)]
456 public BorderStyle BorderStyle {
457 get { return borderStyle; }
459 if (borderStyle != value) {
460 if (!Enum.IsDefined(typeof(BorderStyle), value)) {
461 throw new InvalidEnumArgumentException("Invalid border style.");
464 OnBorderStyleChanged(EventArgs.Empty);
469 internal int BorderWidth {
471 switch (BorderStyle) {
472 case BorderStyle.Fixed3D:
474 case BorderStyle.FixedSingle:
476 case BorderStyle.None:
484 [DefaultValue (DataGridViewCellBorderStyle.Single)]
485 public DataGridViewCellBorderStyle CellBorderStyle {
486 get { return cellBorderStyle; }
488 if (cellBorderStyle != value) {
489 if (value == DataGridViewCellBorderStyle.Custom)
490 throw new ArgumentException ("CellBorderStyle cannot be set to Custom.");
492 cellBorderStyle = value;
494 DataGridViewAdvancedBorderStyle border = new DataGridViewAdvancedBorderStyle ();
496 switch (cellBorderStyle) {
497 case DataGridViewCellBorderStyle.Single:
498 border.All = DataGridViewAdvancedCellBorderStyle.Single;
500 case DataGridViewCellBorderStyle.Raised:
501 case DataGridViewCellBorderStyle.RaisedVertical:
502 border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
503 border.Top = DataGridViewAdvancedCellBorderStyle.None;
504 border.Left = DataGridViewAdvancedCellBorderStyle.Outset;
505 border.Right = DataGridViewAdvancedCellBorderStyle.Outset;
507 case DataGridViewCellBorderStyle.Sunken:
508 border.All = DataGridViewAdvancedCellBorderStyle.Inset;
510 case DataGridViewCellBorderStyle.None:
511 border.All = DataGridViewAdvancedCellBorderStyle.None;
513 case DataGridViewCellBorderStyle.SingleVertical:
514 border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
515 border.Top = DataGridViewAdvancedCellBorderStyle.None;
516 border.Left = DataGridViewAdvancedCellBorderStyle.None;
517 border.Right = DataGridViewAdvancedCellBorderStyle.Single;
519 case DataGridViewCellBorderStyle.SunkenVertical:
520 border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
521 border.Top = DataGridViewAdvancedCellBorderStyle.None;
522 border.Left = DataGridViewAdvancedCellBorderStyle.Inset;
523 border.Right = DataGridViewAdvancedCellBorderStyle.Inset;
525 case DataGridViewCellBorderStyle.SingleHorizontal:
526 case DataGridViewCellBorderStyle.SunkenHorizontal:
527 border.Bottom = DataGridViewAdvancedCellBorderStyle.Inset;
528 border.Top = DataGridViewAdvancedCellBorderStyle.Inset;
529 border.Left = DataGridViewAdvancedCellBorderStyle.None;
530 border.Right = DataGridViewAdvancedCellBorderStyle.None;
532 case DataGridViewCellBorderStyle.RaisedHorizontal:
533 border.Bottom = DataGridViewAdvancedCellBorderStyle.Outset;
534 border.Top = DataGridViewAdvancedCellBorderStyle.Outset;
535 border.Left = DataGridViewAdvancedCellBorderStyle.None;
536 border.Right = DataGridViewAdvancedCellBorderStyle.None;
540 advancedCellBorderStyle = border;
542 OnCellBorderStyleChanged (EventArgs.Empty);
548 [DefaultValue (DataGridViewClipboardCopyMode.EnableWithAutoHeaderText)]
549 public DataGridViewClipboardCopyMode ClipboardCopyMode {
550 get { return clipboardCopyMode; }
551 set { clipboardCopyMode = value; }
555 [EditorBrowsable (EditorBrowsableState.Advanced)]
556 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
558 public int ColumnCount {
559 get { return columns.Count; }
562 throw new ArgumentOutOfRangeException("ColumnCount",
563 "ColumnCount must be >= 0.");
565 if (dataSource != null) {
566 throw new InvalidOperationException("Cant change column count if DataSource is set.");
568 if (value < columns.Count) {
569 for (int i = value; i < columns.Count; i++) {
573 else if (value > columns.Count) {
574 for (int i = 0; i < value; i++) {
575 DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn ();
583 [DefaultValue (DataGridViewHeaderBorderStyle.Raised)]
584 public DataGridViewHeaderBorderStyle ColumnHeadersBorderStyle {
585 get { return columnHeadersBorderStyle; }
587 if (columnHeadersBorderStyle != value) {
588 columnHeadersBorderStyle = value;
589 OnColumnHeadersBorderStyleChanged(EventArgs.Empty);
594 [AmbientValue (null)]
595 public DataGridViewCellStyle ColumnHeadersDefaultCellStyle {
596 get { return columnHeadersDefaultCellStyle; }
598 if (columnHeadersDefaultCellStyle != value) {
599 columnHeadersDefaultCellStyle = value;
600 OnColumnHeadersDefaultCellStyleChanged(EventArgs.Empty);
606 public int ColumnHeadersHeight {
607 get { return columnHeadersHeight; }
609 if (columnHeadersHeight != value) {
611 throw new ArgumentOutOfRangeException("ColumnHeadersHeight",
612 "Column headers height cant be less than 4.");
614 if (value > 32768 ) {
615 throw new ArgumentOutOfRangeException("ColumnHeadersHeight",
616 "Column headers height cannot be more than 32768.");
618 columnHeadersHeight = value;
619 OnColumnHeadersHeightChanged(EventArgs.Empty);
621 if (columnHeadersVisible)
627 [RefreshProperties (RefreshProperties.All)]
628 [DefaultValue (DataGridViewColumnHeadersHeightSizeMode.EnableResizing)]
629 public DataGridViewColumnHeadersHeightSizeMode ColumnHeadersHeightSizeMode {
630 get { return columnHeadersHeightSizeMode; }
632 if (columnHeadersHeightSizeMode != value) {
633 if (!Enum.IsDefined(typeof(DataGridViewColumnHeadersHeightSizeMode), value)) {
634 throw new InvalidEnumArgumentException("Value is not a valid DataGridViewColumnHeadersHeightSizeMode.");
636 columnHeadersHeightSizeMode = value;
637 OnColumnHeadersHeightSizeModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
642 [DefaultValue (true)]
643 public bool ColumnHeadersVisible {
644 get { return columnHeadersVisible; }
646 if (columnHeadersVisible != value) {
647 columnHeadersVisible = value;
653 [MergableProperty (false)]
654 [Editor ("System.Windows.Forms.Design.DataGridViewColumnCollectionEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
655 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
656 public DataGridViewColumnCollection Columns {
657 get { return columns; }
661 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
662 public DataGridViewCell CurrentCell {
663 get { return currentCell; }
665 /////////////////////////////////////////////////////
666 /// *** InvalidOperationException ***
667 /// Changes to the specified cell cannot be committed
668 /// to the data cache, or the new cell is in a hidden
670 /////////////////////////////////////////////////////
671 if (value.DataGridView != this) {
672 throw new ArgumentException("The cell is not in this DataGridView.");
675 currentRow = currentCell.OwningRow;
680 public Point CurrentCellAddress {
681 get { return currentCellAddress; }
685 public DataGridViewRow CurrentRow {
686 get { return currentRow; }
690 [Editor ("System.Windows.Forms.Design.DataMemberListEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
691 public string DataMember {
692 get { return dataMember; }
694 if (dataMember != value) {
698 OnDataMemberChanged(EventArgs.Empty);
705 [RefreshProperties (RefreshProperties.Repaint)]
706 [DefaultValue (null)]
707 [AttributeProvider (typeof (IListSource))]
708 public object DataSource {
709 get { return dataSource; }
711 /* 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:
712 - the System.Collections.IList interface, including one-dimensional arrays.
713 - the System.ComponentModel.IListSource interface, such as the System.Data.DataTable and System.Data.DataSet classes.
714 - the System.ComponentModel.IBindingList interface, such as the System.ComponentModel.Collections.BindingList<> class.
715 - the System.ComponentModel.IBindingListView interface, such as the System.Windows.Forms.BindingSource class.
717 if (!(value == null || value is IList || value is IListSource || value is IBindingList || value is IBindingListView))
718 throw new NotSupportedException ("Type cannot be bound.");
723 OnDataSourceChanged (EventArgs.Empty);
729 [AmbientValue (null)]
730 public DataGridViewCellStyle DefaultCellStyle {
731 get { return defaultCellStyle; }
733 if (defaultCellStyle != value) {
734 defaultCellStyle = value;
735 OnDefaultCellStyleChanged(EventArgs.Empty);
740 public override Rectangle DisplayRectangle {
741 get { return base.DisplayRectangle; }
745 [EditorBrowsable (EditorBrowsableState.Advanced)]
746 public Control EditingControl {
748 return editingControl;
753 [EditorBrowsable (EditorBrowsableState.Advanced)]
754 public Panel EditingPanel {
755 get { throw new NotImplementedException(); }
758 [DefaultValue (DataGridViewEditMode.EditOnKeystrokeOrF2)]
759 public DataGridViewEditMode EditMode {
760 get { return editMode; }
762 if (editMode != value) {
764 OnEditModeChanged(EventArgs.Empty);
769 [DefaultValue (true)]
770 public bool EnableHeadersVisualStyles {
771 get { return enableHeadersVisualStyles; }
772 set { enableHeadersVisualStyles = value; }
775 internal DataGridViewHeaderCell EnteredHeaderCell {
776 get { return entered_header_cell; }
778 if (entered_header_cell == value)
780 if (ThemeEngine.Current.DataGridViewHeaderCellHasHotStyle (this)) {
781 Region area_to_invalidate = new Region ();
782 area_to_invalidate.MakeEmpty ();
783 if (entered_header_cell != null)
784 area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell));
785 entered_header_cell = value;
786 if (entered_header_cell != null)
787 area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell));
788 Invalidate (area_to_invalidate);
789 area_to_invalidate.Dispose ();
791 entered_header_cell = value;
796 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
797 public DataGridViewCell FirstDisplayedCell {
798 get { return firstDisplayedCell; }
800 if (value.DataGridView != this) {
801 throw new ArgumentException("The cell is not in this DataGridView.");
803 firstDisplayedCell = value;
808 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
809 [EditorBrowsable (EditorBrowsableState.Advanced)]
810 public int FirstDisplayedScrollingColumnHiddenWidth {
811 get { return firstDisplayedScrollingColumnHiddenWidth; }
815 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
816 public int FirstDisplayedScrollingColumnIndex {
817 get { return firstDisplayedScrollingColumnIndex; }
818 set { firstDisplayedScrollingColumnIndex = value; }
822 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
823 public int FirstDisplayedScrollingRowIndex {
824 get { return firstDisplayedScrollingRowIndex; }
825 set { firstDisplayedScrollingRowIndex = value; }
829 [EditorBrowsable (EditorBrowsableState.Advanced)]
830 public override Font Font {
831 get { return base.Font; }
832 set { base.Font = value; }
836 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
837 [EditorBrowsable (EditorBrowsableState.Advanced)]
838 public override Color ForeColor {
839 get { return base.ForeColor; }
840 set { base.ForeColor = value; }
843 public Color GridColor {
844 get { return gridColor; }
846 if (gridColor != value) {
847 if (value == Color.Empty) {
848 throw new ArgumentException("Cant set an Empty color.");
851 OnGridColorChanged(EventArgs.Empty);
857 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
858 public int HorizontalScrollingOffset {
859 get { return horizontalScrollingOffset; }
860 set { horizontalScrollingOffset = value; }
864 public bool IsCurrentCellDirty {
865 get { return isCurrentCellDirty; }
869 public bool IsCurrentCellInEditMode {
871 if (currentCell == null) {
874 return currentCell.IsInEditMode;
879 public bool IsCurrentRowDirty {
882 return IsCurrentCellDirty;
885 throw new NotImplementedException();
890 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
891 public DataGridViewCell this [int columnIndex, int rowIndex] {
892 get { return rows[rowIndex].Cells[columnIndex]; }
893 set { rows[rowIndex].Cells[columnIndex] = value; }
897 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
898 public DataGridViewCell this [string columnName, int rowIndex] {
900 int columnIndex = -1;
901 foreach (DataGridViewColumn col in columns) {
902 if (col.Name == columnName) {
903 columnIndex = col.Index;
907 return this[columnIndex, rowIndex];
910 int columnIndex = -1;
911 foreach (DataGridViewColumn col in columns) {
912 if (col.Name == columnName) {
913 columnIndex = col.Index;
917 this[columnIndex, rowIndex] = value;
921 [DefaultValue (true)]
922 public bool MultiSelect {
923 get { return multiSelect; }
925 if (multiSelect != value) {
927 OnMultiSelectChanged(EventArgs.Empty);
933 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
934 public int NewRowIndex {
936 if (!allowUserToAddRows) {
939 return rows.Count - 1;
944 [EditorBrowsable (EditorBrowsableState.Never)]
945 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
946 public new Padding Padding {
947 get { return Padding.Empty; }
951 internal DataGridViewHeaderCell PressedHeaderCell {
952 get { return pressed_header_cell; }
956 [DefaultValue (false)]
957 public bool ReadOnly {
958 get { return readOnly; }
960 if (readOnly != value) {
962 OnReadOnlyChanged(EventArgs.Empty);
968 [EditorBrowsable (EditorBrowsableState.Advanced)]
969 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
971 public int RowCount {
972 get { return rows.Count; }
975 throw new ArgumentException("RowCount must be >= 0.");
977 if (value < 1 && allowUserToAddRows) {
978 throw new ArgumentException("RowCount must be >= 1 if AllowUserToAddRows is true.");
980 if (dataSource != null) {
981 throw new InvalidOperationException("Cant change row count if DataSource is set.");
983 if (value < rows.Count) {
984 for (int i = value; i < rows.Count; i++) {
988 else if (value > rows.Count) {
989 // If we need to add rows and don't have any columns,
990 // we create one column
991 if (ColumnCount == 0)
994 for (int i = rows.Count; i < value; i++) {
995 DataGridViewRow row = (DataGridViewRow) RowTemplateFull;
996 rows.AddInternal (row, false);
998 foreach (DataGridViewColumn col in columns)
999 row.Cells.Add (col.CellTemplate.Clone () as DataGridViewCell);
1006 [DefaultValue (DataGridViewHeaderBorderStyle.Raised)]
1007 public DataGridViewHeaderBorderStyle RowHeadersBorderStyle {
1008 get { return rowHeadersBorderStyle; }
1010 if (rowHeadersBorderStyle != value) {
1011 rowHeadersBorderStyle = value;
1012 OnRowHeadersBorderStyleChanged(EventArgs.Empty);
1017 [AmbientValue (null)]
1018 public DataGridViewCellStyle RowHeadersDefaultCellStyle {
1019 get { return rowHeadersDefaultCellStyle; }
1021 if (rowHeadersDefaultCellStyle != value) {
1022 rowHeadersDefaultCellStyle = value;
1023 OnRowHeadersDefaultCellStyleChanged(EventArgs.Empty);
1028 [DefaultValue (true)]
1029 public bool RowHeadersVisible {
1030 get { return rowHeadersVisible; }
1032 if (rowHeadersVisible != value) {
1033 rowHeadersVisible = value;
1039 [Localizable (true)]
1040 public int RowHeadersWidth {
1041 get { return rowHeadersWidth; }
1043 if (rowHeadersWidth != value) {
1045 throw new ArgumentOutOfRangeException("RowHeadersWidth",
1046 "Row headers width cant be less than 4.");
1048 if (value > 32768 ) {
1049 throw new ArgumentOutOfRangeException("RowHeadersWidth",
1050 "Row headers width cannot be more than 32768.");
1052 rowHeadersWidth = value;
1053 OnRowHeadersWidthChanged(EventArgs.Empty);
1055 if (rowHeadersVisible)
1061 [RefreshProperties (RefreshProperties.All)]
1062 [DefaultValue (DataGridViewRowHeadersWidthSizeMode.EnableResizing)]
1063 public DataGridViewRowHeadersWidthSizeMode RowHeadersWidthSizeMode {
1064 get { return rowHeadersWidthSizeMode; }
1066 if (rowHeadersWidthSizeMode != value) {
1067 if (!Enum.IsDefined(typeof(DataGridViewRowHeadersWidthSizeMode), value)) {
1068 throw new InvalidEnumArgumentException("Value is not valid DataGridViewRowHeadersWidthSizeMode.");
1070 rowHeadersWidthSizeMode = value;
1071 OnRowHeadersWidthSizeModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
1077 public DataGridViewRowCollection Rows {
1078 get { return rows; }
1081 public DataGridViewCellStyle RowsDefaultCellStyle {
1082 get { return rowsDefaultCellStyle; }
1084 if (rowsDefaultCellStyle != value) {
1085 rowsDefaultCellStyle = value;
1086 OnRowsDefaultCellStyleChanged(EventArgs.Empty);
1091 // RowTemplate is just the row, it does not contain Cells
1093 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
1094 public DataGridViewRow RowTemplate {
1096 if (rowTemplate == null)
1097 rowTemplate = new DataGridViewRow ();
1102 rowTemplate = value;
1103 rowTemplate.SetDataGridView(this);
1107 // Take the RowTemplate, clone it, and add Cells
1108 // Note this is not stored, so you don't need to Clone it
1109 internal DataGridViewRow RowTemplateFull {
1111 DataGridViewRow row = (DataGridViewRow) RowTemplate.Clone ();
1113 for (int i = row.Cells.Count; i < Columns.Count; i++) {
1114 DataGridViewCell template = columns [i].CellTemplate;
1116 if (template == null)
1117 throw new InvalidOperationException ("At least one of the DataGridView control's columns has no cell template.");
1119 row.Cells.Add ((DataGridViewCell) template.Clone ());
1126 internal override bool ScaleChildrenInternal {
1127 get { return false; }
1130 [DefaultValue (ScrollBars.Both)]
1131 [Localizable (true)]
1132 public ScrollBars ScrollBars {
1133 get { return scrollBars; }
1135 if (!Enum.IsDefined(typeof(ScrollBars), value)) {
1136 throw new InvalidEnumArgumentException("Invalid ScrollBars value.");
1138 ////////////////////////////////////////////////////////////
1139 /// *** InvalidOperationException ***
1140 /// The System.Windows.Forms.DataGridView is unable to
1141 /// scroll due to a cell change that cannot be committed
1143 ///////////////////////////////////////////////////////////
1149 public DataGridViewSelectedCellCollection SelectedCells {
1151 DataGridViewSelectedCellCollection selectedCells = new DataGridViewSelectedCellCollection();
1152 foreach (DataGridViewRow row in rows) {
1153 foreach (DataGridViewCell cell in row.Cells) {
1154 if (cell.Selected) {
1155 selectedCells.InternalAdd(cell);
1159 return selectedCells;
1164 public DataGridViewSelectedColumnCollection SelectedColumns {
1167 DataGridViewSelectedColumnCollection result = new DataGridViewSelectedColumnCollection ();
1169 if (selectionMode != DataGridViewSelectionMode.FullColumnSelect && selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect)
1172 result.InternalAddRange (selected_columns);
1179 public DataGridViewSelectedRowCollection SelectedRows {
1181 DataGridViewSelectedRowCollection result = new DataGridViewSelectedRowCollection (this);
1183 if (selectionMode != DataGridViewSelectionMode.FullRowSelect && selectionMode != DataGridViewSelectionMode.RowHeaderSelect)
1186 result.InternalAddRange (selected_rows);
1193 [DefaultValue (DataGridViewSelectionMode.RowHeaderSelect)]
1194 public DataGridViewSelectionMode SelectionMode {
1195 get { return selectionMode; }
1197 if (!Enum.IsDefined (typeof(DataGridViewSelectionMode), value))
1198 throw new InvalidEnumArgumentException ("Value is not valid DataGridViewSelectionMode.");
1200 if (value == DataGridViewSelectionMode.ColumnHeaderSelect || value == DataGridViewSelectionMode.FullColumnSelect)
1201 foreach (DataGridViewColumn col in Columns)
1202 if (col.SortMode == DataGridViewColumnSortMode.Automatic)
1203 throw new InvalidOperationException (string.Format ("Cannot set SelectionMode to {0} because there are Automatic sort columns.", value));
1205 selectionMode = value;
1209 [DefaultValue (true)]
1210 public bool ShowCellErrors {
1211 get { return showCellErrors; }
1212 set { showCellErrors = value; }
1215 [DefaultValue (true)]
1216 public bool ShowCellToolTips {
1217 get { return showCellToolTips; }
1218 set { showCellToolTips = value; }
1221 [DefaultValue (true)]
1222 public bool ShowEditingIcon {
1223 get { return showEditingIcon; }
1224 set { showEditingIcon = value; }
1227 [DefaultValue (true)]
1228 public bool ShowRowErrors {
1229 get { return showRowErrors; }
1230 set { showRowErrors = value; }
1234 public DataGridViewColumn SortedColumn {
1235 get { return sortedColumn; }
1239 public SortOrder SortOrder {
1240 get { return sortOrder; }
1243 [DefaultValue (false)]
1244 [EditorBrowsable (EditorBrowsableState.Advanced)]
1245 public bool StandardTab {
1246 get { return standardTab; }
1247 set { standardTab = value; }
1252 [EditorBrowsable (EditorBrowsableState.Never)]
1253 public override string Text {
1254 get { return base.Text; }
1255 set { base.Text = value; }
1259 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1260 public DataGridViewHeaderCell TopLeftHeaderCell {
1262 if (topLeftHeaderCell == null) {
1263 topLeftHeaderCell = new DataGridViewTopLeftHeaderCell ();
1264 topLeftHeaderCell.SetDataGridView (this);
1266 return topLeftHeaderCell;
1269 topLeftHeaderCell = value;
1270 topLeftHeaderCell.SetDataGridView (this);
1275 [EditorBrowsable (EditorBrowsableState.Advanced)]
1276 public Cursor UserSetCursor {
1277 get { return userSetCursor; }
1281 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1282 public int VerticalScrollingOffset {
1283 get { return verticalScrollingOffset; }
1286 [MonoTODO ("VirtualMode is not supported.")]
1287 [EditorBrowsable (EditorBrowsableState.Advanced)]
1288 [DefaultValue (false)]
1289 public bool VirtualMode {
1290 get { return virtualMode; }
1291 set { virtualMode = value; }
1294 internal Control EditingControlInternal {
1296 return editingControl;
1299 if (value == editingControl)
1302 if (editingControl != null) {
1303 // Can't use Controls.Remove (editingControls), because that method
1304 // is overriden to not remove the editing control.
1305 DataGridView.DataGridViewControlCollection ctrls = Controls as DataGridView.DataGridViewControlCollection;
1306 if (ctrls != null) {
1307 ctrls.RemoveInternal (editingControl);
1309 Controls.Remove (editingControl);
1314 if (value != null) {
1315 value.Visible = false;
1316 Controls.Add (value);
1319 editingControl = value;
1323 static object AllowUserToAddRowsChangedEvent = new object ();
1324 static object AllowUserToDeleteRowsChangedEvent = new object ();
1325 static object AllowUserToOrderColumnsChangedEvent = new object ();
1326 static object AllowUserToResizeColumnsChangedEvent = new object ();
1327 static object AllowUserToResizeRowsChangedEvent = new object ();
1328 static object AlternatingRowsDefaultCellStyleChangedEvent = new object ();
1329 static object AutoGenerateColumnsChangedEvent = new object ();
1330 static object AutoSizeColumnModeChangedEvent = new object ();
1331 static object AutoSizeColumnsModeChangedEvent = new object ();
1332 static object AutoSizeRowsModeChangedEvent = new object ();
1333 static object BackgroundColorChangedEvent = new object ();
1334 static object BorderStyleChangedEvent = new object ();
1335 static object CancelRowEditEvent = new object ();
1336 static object CellBeginEditEvent = new object ();
1337 static object CellBorderStyleChangedEvent = new object ();
1338 static object CellClickEvent = new object ();
1339 static object CellContentClickEvent = new object ();
1340 static object CellContentDoubleClickEvent = new object ();
1341 static object CellContextMenuStripChangedEvent = new object ();
1342 static object CellContextMenuStripNeededEvent = new object ();
1343 static object CellDoubleClickEvent = new object ();
1344 static object CellEndEditEvent = new object ();
1345 static object CellEnterEvent = new object ();
1346 static object CellErrorTextChangedEvent = new object ();
1347 static object CellErrorTextNeededEvent = new object ();
1348 static object CellFormattingEvent = new object ();
1349 static object CellLeaveEvent = new object ();
1350 static object CellMouseClickEvent = new object ();
1351 static object CellMouseDoubleClickEvent = new object ();
1352 static object CellMouseDownEvent = new object ();
1353 static object CellMouseEnterEvent = new object ();
1354 static object CellMouseLeaveEvent = new object ();
1355 static object CellMouseMoveEvent = new object ();
1356 static object CellMouseUpEvent = new object ();
1357 static object CellPaintingEvent = new object ();
1358 static object CellParsingEvent = new object ();
1359 static object CellStateChangedEvent = new object ();
1360 static object CellStyleChangedEvent = new object ();
1361 static object CellStyleContentChangedEvent = new object ();
1362 static object CellToolTipTextChangedEvent = new object ();
1363 static object CellToolTipTextNeededEvent = new object ();
1364 static object CellValidatedEvent = new object ();
1365 static object CellValidatingEvent = new object ();
1366 static object CellValueChangedEvent = new object ();
1367 static object CellValueNeededEvent = new object ();
1368 static object CellValuePushedEvent = new object ();
1369 static object ColumnAddedEvent = new object ();
1370 static object ColumnContextMenuStripChangedEvent = new object ();
1371 static object ColumnDataPropertyNameChangedEvent = new object ();
1372 static object ColumnDefaultCellStyleChangedEvent = new object ();
1373 static object ColumnDisplayIndexChangedEvent = new object ();
1374 static object ColumnDividerDoubleClickEvent = new object ();
1375 static object ColumnDividerWidthChangedEvent = new object ();
1376 static object ColumnHeaderCellChangedEvent = new object ();
1377 static object ColumnHeaderMouseClickEvent = new object ();
1378 static object ColumnHeaderMouseDoubleClickEvent = new object ();
1379 static object ColumnHeadersBorderStyleChangedEvent = new object ();
1380 static object ColumnHeadersDefaultCellStyleChangedEvent = new object ();
1381 static object ColumnHeadersHeightChangedEvent = new object ();
1382 static object ColumnHeadersHeightSizeModeChangedEvent = new object ();
1383 static object ColumnMinimumWidthChangedEvent = new object ();
1384 static object ColumnNameChangedEvent = new object ();
1385 static object ColumnRemovedEvent = new object ();
1386 static object ColumnSortModeChangedEvent = new object ();
1387 static object ColumnStateChangedEvent = new object ();
1388 static object ColumnToolTipTextChangedEvent = new object ();
1389 static object ColumnWidthChangedEvent = new object ();
1390 static object CurrentCellChangedEvent = new object ();
1391 static object CurrentCellDirtyStateChangedEvent = new object ();
1392 static object DataBindingCompleteEvent = new object ();
1393 static object DataErrorEvent = new object ();
1394 static object DataMemberChangedEvent = new object ();
1395 static object DataSourceChangedEvent = new object ();
1396 static object DefaultCellStyleChangedEvent = new object ();
1397 static object DefaultValuesNeededEvent = new object ();
1398 static object EditingControlShowingEvent = new object ();
1399 static object EditModeChangedEvent = new object ();
1400 static object GridColorChangedEvent = new object ();
1401 static object MultiSelectChangedEvent = new object ();
1402 static object NewRowNeededEvent = new object ();
1403 static object ReadOnlyChangedEvent = new object ();
1404 static object RowContextMenuStripChangedEvent = new object ();
1405 static object RowContextMenuStripNeededEvent = new object ();
1406 static object RowDefaultCellStyleChangedEvent = new object ();
1407 static object RowDirtyStateNeededEvent = new object ();
1408 static object RowDividerDoubleClickEvent = new object ();
1409 static object RowDividerHeightChangedEvent = new object ();
1410 static object RowEnterEvent = new object ();
1411 static object RowErrorTextChangedEvent = new object ();
1412 static object RowErrorTextNeededEvent = new object ();
1413 static object RowHeaderCellChangedEvent = new object ();
1414 static object RowHeaderMouseClickEvent = new object ();
1415 static object RowHeaderMouseDoubleClickEvent = new object ();
1416 static object RowHeadersBorderStyleChangedEvent = new object ();
1417 static object RowHeadersDefaultCellStyleChangedEvent = new object ();
1418 static object RowHeadersWidthChangedEvent = new object ();
1419 static object RowHeadersWidthSizeModeChangedEvent = new object ();
1420 static object RowHeightChangedEvent = new object ();
1421 static object RowHeightInfoNeededEvent = new object ();
1422 static object RowHeightInfoPushedEvent = new object ();
1423 static object RowLeaveEvent = new object ();
1424 static object RowMinimumHeightChangedEvent = new object ();
1425 static object RowPostPaintEvent = new object ();
1426 static object RowPrePaintEvent = new object ();
1427 static object RowsAddedEvent = new object ();
1428 static object RowsDefaultCellStyleChangedEvent = new object ();
1429 static object RowsRemovedEvent = new object ();
1430 static object RowStateChangedEvent = new object ();
1431 static object RowUnsharedEvent = new object ();
1432 static object RowValidatedEvent = new object ();
1433 static object RowValidatingEvent = new object ();
1434 static object ScrollEvent = new object ();
1435 static object SelectionChangedEvent = new object ();
1436 static object SortCompareEvent = new object ();
1437 static object SortedEvent = new object ();
1438 static object UserAddedRowEvent = new object ();
1439 static object UserDeletedRowEvent = new object ();
1440 static object UserDeletingRowEvent = new object ();
1445 public event EventHandler AllowUserToAddRowsChanged {
1446 add { Events.AddHandler (AllowUserToAddRowsChangedEvent, value); }
1447 remove { Events.RemoveHandler (AllowUserToAddRowsChangedEvent, value); }
1450 public event EventHandler AllowUserToDeleteRowsChanged {
1451 add { Events.AddHandler (AllowUserToDeleteRowsChangedEvent, value); }
1452 remove { Events.RemoveHandler (AllowUserToDeleteRowsChangedEvent, value); }
1455 public event EventHandler AllowUserToOrderColumnsChanged {
1456 add { Events.AddHandler (AllowUserToOrderColumnsChangedEvent, value); }
1457 remove { Events.RemoveHandler (AllowUserToOrderColumnsChangedEvent, value); }
1460 public event EventHandler AllowUserToResizeColumnsChanged {
1461 add { Events.AddHandler (AllowUserToResizeColumnsChangedEvent, value); }
1462 remove { Events.RemoveHandler (AllowUserToResizeColumnsChangedEvent, value); }
1465 public event EventHandler AllowUserToResizeRowsChanged {
1466 add { Events.AddHandler (AllowUserToResizeRowsChangedEvent, value); }
1467 remove { Events.RemoveHandler (AllowUserToResizeRowsChangedEvent, value); }
1470 public event EventHandler AlternatingRowsDefaultCellStyleChanged {
1471 add { Events.AddHandler (AlternatingRowsDefaultCellStyleChangedEvent, value); }
1472 remove { Events.RemoveHandler (AlternatingRowsDefaultCellStyleChangedEvent, value); }
1476 [EditorBrowsable (EditorBrowsableState.Advanced)]
1477 public event EventHandler AutoGenerateColumnsChanged {
1478 add { Events.AddHandler (AutoGenerateColumnsChangedEvent, value); }
1479 remove { Events.RemoveHandler (AutoGenerateColumnsChangedEvent, value); }
1482 public event DataGridViewAutoSizeColumnModeEventHandler AutoSizeColumnModeChanged {
1483 add { Events.AddHandler (AutoSizeColumnModeChangedEvent, value); }
1484 remove { Events.RemoveHandler (AutoSizeColumnModeChangedEvent, value); }
1487 public event DataGridViewAutoSizeColumnsModeEventHandler AutoSizeColumnsModeChanged {
1488 add { Events.AddHandler (AutoSizeColumnsModeChangedEvent, value); }
1489 remove { Events.RemoveHandler (AutoSizeColumnsModeChangedEvent, value); }
1492 public event DataGridViewAutoSizeModeEventHandler AutoSizeRowsModeChanged {
1493 add { Events.AddHandler (AutoSizeRowsModeChangedEvent, value); }
1494 remove { Events.RemoveHandler (AutoSizeRowsModeChangedEvent, value); }
1498 [EditorBrowsable (EditorBrowsableState.Never)]
1499 public new event EventHandler BackColorChanged {
1500 add { base.BackColorChanged += value; }
1501 remove { base.BackColorChanged -= value; }
1504 public event EventHandler BackgroundColorChanged {
1505 add { Events.AddHandler (BackgroundColorChangedEvent, value); }
1506 remove { Events.RemoveHandler (BackgroundColorChangedEvent, value); }
1510 [EditorBrowsable (EditorBrowsableState.Never)]
1511 public new event EventHandler BackgroundImageChanged {
1512 add { base.BackgroundImageChanged += value; }
1513 remove { base.BackgroundImageChanged -= value; }
1517 [EditorBrowsable (EditorBrowsableState.Never)]
1518 public new event EventHandler BackgroundImageLayoutChanged {
1519 add { base.BackgroundImageLayoutChanged += value; }
1520 remove { base.BackgroundImageLayoutChanged -= value; }
1523 public event EventHandler BorderStyleChanged {
1524 add { Events.AddHandler (BorderStyleChangedEvent, value); }
1525 remove { Events.RemoveHandler (BorderStyleChangedEvent, value); }
1528 public event QuestionEventHandler CancelRowEdit {
1529 add { Events.AddHandler (CancelRowEditEvent, value); }
1530 remove { Events.RemoveHandler (CancelRowEditEvent, value); }
1533 public event DataGridViewCellCancelEventHandler CellBeginEdit {
1534 add { Events.AddHandler (CellBeginEditEvent, value); }
1535 remove { Events.RemoveHandler (CellBeginEditEvent, value); }
1538 public event EventHandler CellBorderStyleChanged {
1539 add { Events.AddHandler (CellBorderStyleChangedEvent, value); }
1540 remove { Events.RemoveHandler (CellBorderStyleChangedEvent, value); }
1543 public event DataGridViewCellEventHandler CellClick {
1544 add { Events.AddHandler (CellClickEvent, value); }
1545 remove { Events.RemoveHandler (CellClickEvent, value); }
1548 public event DataGridViewCellEventHandler CellContentClick {
1549 add { Events.AddHandler (CellContentClickEvent, value); }
1550 remove { Events.RemoveHandler (CellContentClickEvent, value); }
1553 public event DataGridViewCellEventHandler CellContentDoubleClick {
1554 add { Events.AddHandler (CellContentDoubleClickEvent, value); }
1555 remove { Events.RemoveHandler (CellContentDoubleClickEvent, value); }
1558 [EditorBrowsable (EditorBrowsableState.Advanced)]
1559 public event DataGridViewCellEventHandler CellContextMenuStripChanged {
1560 add { Events.AddHandler (CellContextMenuStripChangedEvent, value); }
1561 remove { Events.RemoveHandler (CellContextMenuStripChangedEvent, value); }
1564 [EditorBrowsable (EditorBrowsableState.Advanced)]
1565 public event DataGridViewCellContextMenuStripNeededEventHandler CellContextMenuStripNeeded {
1566 add { Events.AddHandler (CellContextMenuStripNeededEvent, value); }
1567 remove { Events.RemoveHandler (CellContextMenuStripNeededEvent, value); }
1570 public event DataGridViewCellEventHandler CellDoubleClick {
1571 add { Events.AddHandler (CellDoubleClickEvent, value); }
1572 remove { Events.RemoveHandler (CellDoubleClickEvent, value); }
1575 public event DataGridViewCellEventHandler CellEndEdit {
1576 add { Events.AddHandler (CellEndEditEvent, value); }
1577 remove { Events.RemoveHandler (CellEndEditEvent, value); }
1580 public event DataGridViewCellEventHandler CellEnter {
1581 add { Events.AddHandler (CellEnterEvent, value); }
1582 remove { Events.RemoveHandler (CellEnterEvent, value); }
1585 public event DataGridViewCellEventHandler CellErrorTextChanged {
1586 add { Events.AddHandler (CellErrorTextChangedEvent, value); }
1587 remove { Events.RemoveHandler (CellErrorTextChangedEvent, value); }
1590 [EditorBrowsable (EditorBrowsableState.Advanced)]
1591 public event DataGridViewCellErrorTextNeededEventHandler CellErrorTextNeeded {
1592 add { Events.AddHandler (CellErrorTextNeededEvent, value); }
1593 remove { Events.RemoveHandler (CellErrorTextNeededEvent, value); }
1596 public event DataGridViewCellFormattingEventHandler CellFormatting {
1597 add { Events.AddHandler (CellFormattingEvent, value); }
1598 remove { Events.RemoveHandler (CellFormattingEvent, value); }
1601 public event DataGridViewCellEventHandler CellLeave {
1602 add { Events.AddHandler (CellLeaveEvent, value); }
1603 remove { Events.RemoveHandler (CellLeaveEvent, value); }
1606 public event DataGridViewCellMouseEventHandler CellMouseClick {
1607 add { Events.AddHandler (CellMouseClickEvent, value); }
1608 remove { Events.RemoveHandler (CellMouseClickEvent, value); }
1611 public event DataGridViewCellMouseEventHandler CellMouseDoubleClick {
1612 add { Events.AddHandler (CellMouseDoubleClickEvent, value); }
1613 remove { Events.RemoveHandler (CellMouseDoubleClickEvent, value); }
1616 public event DataGridViewCellMouseEventHandler CellMouseDown {
1617 add { Events.AddHandler (CellMouseDownEvent, value); }
1618 remove { Events.RemoveHandler (CellMouseDownEvent, value); }
1621 public event DataGridViewCellEventHandler CellMouseEnter {
1622 add { Events.AddHandler (CellMouseEnterEvent, value); }
1623 remove { Events.RemoveHandler (CellMouseEnterEvent, value); }
1626 public event DataGridViewCellEventHandler CellMouseLeave {
1627 add { Events.AddHandler (CellMouseLeaveEvent, value); }
1628 remove { Events.RemoveHandler (CellMouseLeaveEvent, value); }
1631 public event DataGridViewCellMouseEventHandler CellMouseMove {
1632 add { Events.AddHandler (CellMouseMoveEvent, value); }
1633 remove { Events.RemoveHandler (CellMouseMoveEvent, value); }
1636 public event DataGridViewCellMouseEventHandler CellMouseUp {
1637 add { Events.AddHandler (CellMouseUpEvent, value); }
1638 remove { Events.RemoveHandler (CellMouseUpEvent, value); }
1641 public event DataGridViewCellPaintingEventHandler CellPainting {
1642 add { Events.AddHandler (CellPaintingEvent, value); }
1643 remove { Events.RemoveHandler (CellPaintingEvent, value); }
1646 public event DataGridViewCellParsingEventHandler CellParsing {
1647 add { Events.AddHandler (CellParsingEvent, value); }
1648 remove { Events.RemoveHandler (CellParsingEvent, value); }
1651 public event DataGridViewCellStateChangedEventHandler CellStateChanged {
1652 add { Events.AddHandler (CellStateChangedEvent, value); }
1653 remove { Events.RemoveHandler (CellStateChangedEvent, value); }
1656 public event DataGridViewCellEventHandler CellStyleChanged {
1657 add { Events.AddHandler (CellStyleChangedEvent, value); }
1658 remove { Events.RemoveHandler (CellStyleChangedEvent, value); }
1661 public event DataGridViewCellStyleContentChangedEventHandler CellStyleContentChanged {
1662 add { Events.AddHandler (CellStyleContentChangedEvent, value); }
1663 remove { Events.RemoveHandler (CellStyleContentChangedEvent, value); }
1666 public event DataGridViewCellEventHandler CellToolTipTextChanged {
1667 add { Events.AddHandler (CellToolTipTextChangedEvent, value); }
1668 remove { Events.RemoveHandler (CellToolTipTextChangedEvent, value); }
1671 [EditorBrowsable (EditorBrowsableState.Advanced)]
1672 public event DataGridViewCellToolTipTextNeededEventHandler CellToolTipTextNeeded {
1673 add { Events.AddHandler (CellToolTipTextNeededEvent, value); }
1674 remove { Events.RemoveHandler (CellToolTipTextNeededEvent, value); }
1677 public event DataGridViewCellEventHandler CellValidated {
1678 add { Events.AddHandler (CellValidatedEvent, value); }
1679 remove { Events.RemoveHandler (CellValidatedEvent, value); }
1682 public event DataGridViewCellValidatingEventHandler CellValidating {
1683 add { Events.AddHandler (CellValidatingEvent, value); }
1684 remove { Events.RemoveHandler (CellValidatingEvent, value); }
1687 public event DataGridViewCellEventHandler CellValueChanged {
1688 add { Events.AddHandler (CellValueChangedEvent, value); }
1689 remove { Events.RemoveHandler (CellValueChangedEvent, value); }
1692 [EditorBrowsable (EditorBrowsableState.Advanced)]
1693 public event DataGridViewCellValueEventHandler CellValueNeeded {
1694 add { Events.AddHandler (CellValueNeededEvent, value); }
1695 remove { Events.RemoveHandler (CellValueNeededEvent, value); }
1698 [EditorBrowsable (EditorBrowsableState.Advanced)]
1699 public event DataGridViewCellValueEventHandler CellValuePushed {
1700 add { Events.AddHandler (CellValuePushedEvent, value); }
1701 remove { Events.RemoveHandler (CellValuePushedEvent, value); }
1704 public event DataGridViewColumnEventHandler ColumnAdded {
1705 add { Events.AddHandler (ColumnAddedEvent, value); }
1706 remove { Events.RemoveHandler (ColumnAddedEvent, value); }
1709 public event DataGridViewColumnEventHandler ColumnContextMenuStripChanged {
1710 add { Events.AddHandler (ColumnContextMenuStripChangedEvent, value); }
1711 remove { Events.RemoveHandler (ColumnContextMenuStripChangedEvent, value); }
1714 public event DataGridViewColumnEventHandler ColumnDataPropertyNameChanged {
1715 add { Events.AddHandler (ColumnDataPropertyNameChangedEvent, value); }
1716 remove { Events.RemoveHandler (ColumnDataPropertyNameChangedEvent, value); }
1719 public event DataGridViewColumnEventHandler ColumnDefaultCellStyleChanged {
1720 add { Events.AddHandler (ColumnDefaultCellStyleChangedEvent, value); }
1721 remove { Events.RemoveHandler (ColumnDefaultCellStyleChangedEvent, value); }
1724 public event DataGridViewColumnEventHandler ColumnDisplayIndexChanged {
1725 add { Events.AddHandler (ColumnDisplayIndexChangedEvent, value); }
1726 remove { Events.RemoveHandler (ColumnDisplayIndexChangedEvent, value); }
1729 public event DataGridViewColumnDividerDoubleClickEventHandler ColumnDividerDoubleClick {
1730 add { Events.AddHandler (ColumnDividerDoubleClickEvent, value); }
1731 remove { Events.RemoveHandler (ColumnDividerDoubleClickEvent, value); }
1734 public event DataGridViewColumnEventHandler ColumnDividerWidthChanged {
1735 add { Events.AddHandler (ColumnDividerWidthChangedEvent, value); }
1736 remove { Events.RemoveHandler (ColumnDividerWidthChangedEvent, value); }
1739 public event DataGridViewColumnEventHandler ColumnHeaderCellChanged {
1740 add { Events.AddHandler (ColumnHeaderCellChangedEvent, value); }
1741 remove { Events.RemoveHandler (ColumnHeaderCellChangedEvent, value); }
1744 public event DataGridViewCellMouseEventHandler ColumnHeaderMouseClick {
1745 add { Events.AddHandler (ColumnHeaderMouseClickEvent, value); }
1746 remove { Events.RemoveHandler (ColumnHeaderMouseClickEvent, value); }
1749 public event DataGridViewCellMouseEventHandler ColumnHeaderMouseDoubleClick {
1750 add { Events.AddHandler (ColumnHeaderMouseDoubleClickEvent, value); }
1751 remove { Events.RemoveHandler (ColumnHeaderMouseDoubleClickEvent, value); }
1754 public event EventHandler ColumnHeadersBorderStyleChanged {
1755 add { Events.AddHandler (ColumnHeadersBorderStyleChangedEvent, value); }
1756 remove { Events.RemoveHandler (ColumnHeadersBorderStyleChangedEvent, value); }
1759 public event EventHandler ColumnHeadersDefaultCellStyleChanged {
1760 add { Events.AddHandler (ColumnHeadersDefaultCellStyleChangedEvent, value); }
1761 remove { Events.RemoveHandler (ColumnHeadersDefaultCellStyleChangedEvent, value); }
1764 public event EventHandler ColumnHeadersHeightChanged {
1765 add { Events.AddHandler (ColumnHeadersHeightChangedEvent, value); }
1766 remove { Events.RemoveHandler (ColumnHeadersHeightChangedEvent, value); }
1769 public event DataGridViewAutoSizeModeEventHandler ColumnHeadersHeightSizeModeChanged {
1770 add { Events.AddHandler (ColumnHeadersHeightSizeModeChangedEvent, value); }
1771 remove { Events.RemoveHandler (ColumnHeadersHeightSizeModeChangedEvent, value); }
1774 public event DataGridViewColumnEventHandler ColumnMinimumWidthChanged {
1775 add { Events.AddHandler (ColumnMinimumWidthChangedEvent, value); }
1776 remove { Events.RemoveHandler (ColumnMinimumWidthChangedEvent, value); }
1779 public event DataGridViewColumnEventHandler ColumnNameChanged {
1780 add { Events.AddHandler (ColumnNameChangedEvent, value); }
1781 remove { Events.RemoveHandler (ColumnNameChangedEvent, value); }
1784 public event DataGridViewColumnEventHandler ColumnRemoved {
1785 add { Events.AddHandler (ColumnRemovedEvent, value); }
1786 remove { Events.RemoveHandler (ColumnRemovedEvent, value); }
1789 public event DataGridViewColumnEventHandler ColumnSortModeChanged {
1790 add { Events.AddHandler (ColumnSortModeChangedEvent, value); }
1791 remove { Events.RemoveHandler (ColumnSortModeChangedEvent, value); }
1794 public event DataGridViewColumnStateChangedEventHandler ColumnStateChanged {
1795 add { Events.AddHandler (ColumnStateChangedEvent, value); }
1796 remove { Events.RemoveHandler (ColumnStateChangedEvent, value); }
1799 public event DataGridViewColumnEventHandler ColumnToolTipTextChanged {
1800 add { Events.AddHandler (ColumnToolTipTextChangedEvent, value); }
1801 remove { Events.RemoveHandler (ColumnToolTipTextChangedEvent, value); }
1804 public event DataGridViewColumnEventHandler ColumnWidthChanged {
1805 add { Events.AddHandler (ColumnWidthChangedEvent, value); }
1806 remove { Events.RemoveHandler (ColumnWidthChangedEvent, value); }
1809 public event EventHandler CurrentCellChanged {
1810 add { Events.AddHandler (CurrentCellChangedEvent, value); }
1811 remove { Events.RemoveHandler (CurrentCellChangedEvent, value); }
1814 [EditorBrowsable (EditorBrowsableState.Advanced)]
1815 public event EventHandler CurrentCellDirtyStateChanged {
1816 add { Events.AddHandler (CurrentCellDirtyStateChangedEvent, value); }
1817 remove { Events.RemoveHandler (CurrentCellDirtyStateChangedEvent, value); }
1820 public event DataGridViewBindingCompleteEventHandler DataBindingComplete {
1821 add { Events.AddHandler (DataBindingCompleteEvent, value); }
1822 remove { Events.RemoveHandler (DataBindingCompleteEvent, value); }
1825 public event DataGridViewDataErrorEventHandler DataError {
1826 add { Events.AddHandler (DataErrorEvent, value); }
1827 remove { Events.RemoveHandler (DataErrorEvent, value); }
1830 public event EventHandler DataMemberChanged {
1831 add { Events.AddHandler (DataMemberChangedEvent, value); }
1832 remove { Events.RemoveHandler (DataMemberChangedEvent, value); }
1835 public event EventHandler DataSourceChanged {
1836 add { Events.AddHandler (DataSourceChangedEvent, value); }
1837 remove { Events.RemoveHandler (DataSourceChangedEvent, value); }
1840 public event EventHandler DefaultCellStyleChanged {
1841 add { Events.AddHandler (DefaultCellStyleChangedEvent, value); }
1842 remove { Events.RemoveHandler (DefaultCellStyleChangedEvent, value); }
1845 [EditorBrowsable (EditorBrowsableState.Advanced)]
1846 public event DataGridViewRowEventHandler DefaultValuesNeeded {
1847 add { Events.AddHandler (DefaultValuesNeededEvent, value); }
1848 remove { Events.RemoveHandler (DefaultValuesNeededEvent, value); }
1851 public event DataGridViewEditingControlShowingEventHandler EditingControlShowing {
1852 add { Events.AddHandler (EditingControlShowingEvent, value); }
1853 remove { Events.RemoveHandler (EditingControlShowingEvent, value); }
1856 public event EventHandler EditModeChanged {
1857 add { Events.AddHandler (EditModeChangedEvent, value); }
1858 remove { Events.RemoveHandler (EditModeChangedEvent, value); }
1862 [EditorBrowsable (EditorBrowsableState.Advanced)]
1863 public new event EventHandler FontChanged {
1864 add { base.FontChanged += value; }
1865 remove { base.FontChanged -= value; }
1869 [EditorBrowsable (EditorBrowsableState.Advanced)]
1870 public new event EventHandler ForeColorChanged {
1871 add { base.ForeColorChanged += value; }
1872 remove { base.ForeColorChanged -= value; }
1876 [EditorBrowsable (EditorBrowsableState.Never)]
1877 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1878 public new event EventHandler PaddingChanged {
1879 add { base.PaddingChanged += value; }
1880 remove { base.PaddingChanged -= value; }
1883 public event EventHandler GridColorChanged {
1884 add { Events.AddHandler (GridColorChangedEvent, value); }
1885 remove { Events.RemoveHandler (GridColorChangedEvent, value); }
1888 public event EventHandler MultiSelectChanged {
1889 add { Events.AddHandler (MultiSelectChangedEvent, value); }
1890 remove { Events.RemoveHandler (MultiSelectChangedEvent, value); }
1893 public event DataGridViewRowEventHandler NewRowNeeded {
1894 add { Events.AddHandler (NewRowNeededEvent, value); }
1895 remove { Events.RemoveHandler (NewRowNeededEvent, value); }
1898 public event EventHandler ReadOnlyChanged {
1899 add { Events.AddHandler (ReadOnlyChangedEvent, value); }
1900 remove { Events.RemoveHandler (ReadOnlyChangedEvent, value); }
1903 public event DataGridViewRowEventHandler RowContextMenuStripChanged {
1904 add { Events.AddHandler (RowContextMenuStripChangedEvent, value); }
1905 remove { Events.RemoveHandler (RowContextMenuStripChangedEvent, value); }
1908 [EditorBrowsable (EditorBrowsableState.Advanced)]
1909 public event DataGridViewRowContextMenuStripNeededEventHandler RowContextMenuStripNeeded {
1910 add { Events.AddHandler (RowContextMenuStripNeededEvent, value); }
1911 remove { Events.RemoveHandler (RowContextMenuStripNeededEvent, value); }
1914 public event DataGridViewRowEventHandler RowDefaultCellStyleChanged {
1915 add { Events.AddHandler (RowDefaultCellStyleChangedEvent, value); }
1916 remove { Events.RemoveHandler (RowDefaultCellStyleChangedEvent, value); }
1919 [EditorBrowsable (EditorBrowsableState.Advanced)]
1920 public event QuestionEventHandler RowDirtyStateNeeded {
1921 add { Events.AddHandler (RowDirtyStateNeededEvent, value); }
1922 remove { Events.RemoveHandler (RowDirtyStateNeededEvent, value); }
1925 public event DataGridViewRowDividerDoubleClickEventHandler RowDividerDoubleClick {
1926 add { Events.AddHandler (RowDividerDoubleClickEvent, value); }
1927 remove { Events.RemoveHandler (RowDividerDoubleClickEvent, value); }
1930 public event DataGridViewRowEventHandler RowDividerHeightChanged {
1931 add { Events.AddHandler (RowDividerHeightChangedEvent, value); }
1932 remove { Events.RemoveHandler (RowDividerHeightChangedEvent, value); }
1935 public event DataGridViewCellEventHandler RowEnter {
1936 add { Events.AddHandler (RowEnterEvent, value); }
1937 remove { Events.RemoveHandler (RowEnterEvent, value); }
1940 public event DataGridViewRowEventHandler RowErrorTextChanged {
1941 add { Events.AddHandler (RowErrorTextChangedEvent, value); }
1942 remove { Events.RemoveHandler (RowErrorTextChangedEvent, value); }
1945 [EditorBrowsable (EditorBrowsableState.Advanced)]
1946 public event DataGridViewRowErrorTextNeededEventHandler RowErrorTextNeeded {
1947 add { Events.AddHandler (RowErrorTextNeededEvent, value); }
1948 remove { Events.RemoveHandler (RowErrorTextNeededEvent, value); }
1951 public event DataGridViewRowEventHandler RowHeaderCellChanged {
1952 add { Events.AddHandler (RowHeaderCellChangedEvent, value); }
1953 remove { Events.RemoveHandler (RowHeaderCellChangedEvent, value); }
1956 public event DataGridViewCellMouseEventHandler RowHeaderMouseClick {
1957 add { Events.AddHandler (RowHeaderMouseClickEvent, value); }
1958 remove { Events.RemoveHandler (RowHeaderMouseClickEvent, value); }
1961 public event DataGridViewCellMouseEventHandler RowHeaderMouseDoubleClick {
1962 add { Events.AddHandler (RowHeaderMouseDoubleClickEvent, value); }
1963 remove { Events.RemoveHandler (RowHeaderMouseDoubleClickEvent, value); }
1966 public event EventHandler RowHeadersBorderStyleChanged {
1967 add { Events.AddHandler (RowHeadersBorderStyleChangedEvent, value); }
1968 remove { Events.RemoveHandler (RowHeadersBorderStyleChangedEvent, value); }
1971 public event EventHandler RowHeadersDefaultCellStyleChanged {
1972 add { Events.AddHandler (RowHeadersDefaultCellStyleChangedEvent, value); }
1973 remove { Events.RemoveHandler (RowHeadersDefaultCellStyleChangedEvent, value); }
1976 public event EventHandler RowHeadersWidthChanged {
1977 add { Events.AddHandler (RowHeadersWidthChangedEvent, value); }
1978 remove { Events.RemoveHandler (RowHeadersWidthChangedEvent, value); }
1981 public event DataGridViewAutoSizeModeEventHandler RowHeadersWidthSizeModeChanged {
1982 add { Events.AddHandler (RowHeadersWidthSizeModeChangedEvent, value); }
1983 remove { Events.RemoveHandler (RowHeadersWidthSizeModeChangedEvent, value); }
1986 public event DataGridViewRowEventHandler RowHeightChanged {
1987 add { Events.AddHandler (RowHeightChangedEvent, value); }
1988 remove { Events.RemoveHandler (RowHeightChangedEvent, value); }
1991 [EditorBrowsable (EditorBrowsableState.Advanced)]
1992 public event DataGridViewRowHeightInfoNeededEventHandler RowHeightInfoNeeded {
1993 add { Events.AddHandler (RowHeightInfoNeededEvent, value); }
1994 remove { Events.RemoveHandler (RowHeightInfoNeededEvent, value); }
1997 [EditorBrowsable (EditorBrowsableState.Advanced)]
1998 public event DataGridViewRowHeightInfoPushedEventHandler RowHeightInfoPushed {
1999 add { Events.AddHandler (RowHeightInfoPushedEvent, value); }
2000 remove { Events.RemoveHandler (RowHeightInfoPushedEvent, value); }
2003 public event DataGridViewCellEventHandler RowLeave {
2004 add { Events.AddHandler (RowLeaveEvent, value); }
2005 remove { Events.RemoveHandler (RowLeaveEvent, value); }
2008 public event DataGridViewRowEventHandler RowMinimumHeightChanged {
2009 add { Events.AddHandler (RowMinimumHeightChangedEvent, value); }
2010 remove { Events.RemoveHandler (RowMinimumHeightChangedEvent, value); }
2013 public event DataGridViewRowPostPaintEventHandler RowPostPaint {
2014 add { Events.AddHandler (RowPostPaintEvent, value); }
2015 remove { Events.RemoveHandler (RowPostPaintEvent, value); }
2018 public event DataGridViewRowPrePaintEventHandler RowPrePaint {
2019 add { Events.AddHandler (RowPrePaintEvent, value); }
2020 remove { Events.RemoveHandler (RowPrePaintEvent, value); }
2023 public event DataGridViewRowsAddedEventHandler RowsAdded {
2024 add { Events.AddHandler (RowsAddedEvent, value); }
2025 remove { Events.RemoveHandler (RowsAddedEvent, value); }
2028 public event EventHandler RowsDefaultCellStyleChanged {
2029 add { Events.AddHandler (RowsDefaultCellStyleChangedEvent, value); }
2030 remove { Events.RemoveHandler (RowsDefaultCellStyleChangedEvent, value); }
2033 public event DataGridViewRowsRemovedEventHandler RowsRemoved {
2034 add { Events.AddHandler (RowsRemovedEvent, value); }
2035 remove { Events.RemoveHandler (RowsRemovedEvent, value); }
2038 public event DataGridViewRowStateChangedEventHandler RowStateChanged {
2039 add { Events.AddHandler (RowStateChangedEvent, value); }
2040 remove { Events.RemoveHandler (RowStateChangedEvent, value); }
2043 [EditorBrowsable (EditorBrowsableState.Advanced)]
2044 public event DataGridViewRowEventHandler RowUnshared {
2045 add { Events.AddHandler (RowUnsharedEvent, value); }
2046 remove { Events.RemoveHandler (RowUnsharedEvent, value); }
2049 public event DataGridViewCellEventHandler RowValidated {
2050 add { Events.AddHandler (RowValidatedEvent, value); }
2051 remove { Events.RemoveHandler (RowValidatedEvent, value); }
2054 public event DataGridViewCellCancelEventHandler RowValidating {
2055 add { Events.AddHandler (RowValidatingEvent, value); }
2056 remove { Events.RemoveHandler (RowValidatingEvent, value); }
2059 public event ScrollEventHandler Scroll {
2060 add { Events.AddHandler (ScrollEvent, value); }
2061 remove { Events.RemoveHandler (ScrollEvent, value); }
2064 public event EventHandler SelectionChanged {
2065 add { Events.AddHandler (SelectionChangedEvent, value); }
2066 remove { Events.RemoveHandler (SelectionChangedEvent, value); }
2069 [EditorBrowsable (EditorBrowsableState.Advanced)]
2070 public event DataGridViewSortCompareEventHandler SortCompare {
2071 add { Events.AddHandler (SortCompareEvent, value); }
2072 remove { Events.RemoveHandler (SortCompareEvent, value); }
2075 public event EventHandler Sorted {
2076 add { Events.AddHandler (SortedEvent, value); }
2077 remove { Events.RemoveHandler (SortedEvent, value); }
2080 public event DataGridViewRowEventHandler UserAddedRow {
2081 add { Events.AddHandler (UserAddedRowEvent, value); }
2082 remove { Events.RemoveHandler (UserAddedRowEvent, value); }
2085 public event DataGridViewRowEventHandler UserDeletedRow {
2086 add { Events.AddHandler (UserDeletedRowEvent, value); }
2087 remove { Events.RemoveHandler (UserDeletedRowEvent, value); }
2090 public event DataGridViewRowCancelEventHandler UserDeletingRow {
2091 add { Events.AddHandler (UserDeletingRowEvent, value); }
2092 remove { Events.RemoveHandler (UserDeletingRowEvent, value); }
2096 [EditorBrowsable (EditorBrowsableState.Never)]
2097 public new event EventHandler StyleChanged {
2098 add { base.StyleChanged += value; }
2099 remove { base.StyleChanged -= value; }
2103 [EditorBrowsable (EditorBrowsableState.Never)]
2104 public new event EventHandler TextChanged {
2105 add { base.TextChanged += value; }
2106 remove { base.TextChanged -= value; }
2109 [EditorBrowsable (EditorBrowsableState.Advanced)]
2110 public virtual DataGridViewAdvancedBorderStyle AdjustColumnHeaderBorderStyle (DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStyleInput, DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStylePlaceholder, bool isFirstDisplayedColumn, bool isLastVisibleColumn) {
2111 return (DataGridViewAdvancedBorderStyle) ((ICloneable)dataGridViewAdvancedBorderStyleInput).Clone();
2114 public bool AreAllCellsSelected (bool includeInvisibleCells) {
2115 foreach (DataGridViewRow row in rows) {
2116 foreach (DataGridViewCell cell in row.Cells) {
2117 if (includeInvisibleCells == false && cell.Visible == false) {
2120 if (!cell.Selected) {
2128 public void AutoResizeColumn (int columnIndex) {
2129 AutoResizeColumn (columnIndex, DataGridViewAutoSizeColumnMode.AllCells);
2132 public void AutoResizeColumn (int columnIndex, DataGridViewAutoSizeColumnMode autoSizeColumnMode)
2134 AutoResizeColumnInternal (columnIndex, autoSizeColumnMode);
2137 public void AutoResizeColumnHeadersHeight ()
2141 foreach (DataGridViewColumn col in Columns)
2142 new_height = Math.Max (new_height, col.HeaderCell.PreferredSize.Height);
2144 if (ColumnHeadersHeight != new_height)
2145 ColumnHeadersHeight = new_height;
2148 [MonoTODO ("columnIndex parameter is not used")]
2149 public void AutoResizeColumnHeadersHeight (int columnIndex)
2151 AutoResizeColumnHeadersHeight ();
2154 public void AutoResizeColumns () {
2155 AutoResizeColumns (DataGridViewAutoSizeColumnsMode.AllCells);
2158 public void AutoResizeColumns (DataGridViewAutoSizeColumnsMode autoSizeColumnsMode) {
2159 AutoResizeColumns (autoSizeColumnsMode, true);
2162 public void AutoResizeRow (int rowIndex)
2164 AutoResizeRow (rowIndex, DataGridViewAutoSizeRowMode.AllCells, true);
2167 public void AutoResizeRow (int rowIndex, DataGridViewAutoSizeRowMode autoSizeRowMode)
2169 AutoResizeRow (rowIndex, autoSizeRowMode, true);
2172 public void AutoResizeRowHeadersWidth (DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode)
2174 if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToFirstHeader) {
2175 RowHeadersWidth = GetRowInternal (0).HeaderCell.PreferredSize.Width;
2181 if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders) {
2182 foreach (DataGridViewRow row in Rows)
2184 new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
2186 if (RowHeadersWidth != new_width)
2187 RowHeadersWidth = new_width;
2192 if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders) {
2193 foreach (DataGridViewRow row in Rows)
2194 new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
2196 if (RowHeadersWidth != new_width)
2197 RowHeadersWidth = new_width;
2203 [MonoTODO ("Does not use rowIndex parameter.")]
2204 public void AutoResizeRowHeadersWidth (int rowIndex, DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode)
2206 AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
2209 public void AutoResizeRows ()
2211 AutoResizeRows (0, Rows.Count, DataGridViewAutoSizeRowMode.AllCells, false);
2214 public void AutoResizeRows (DataGridViewAutoSizeRowsMode autoSizeRowsMode)
2216 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeRowsMode), autoSizeRowsMode))
2217 throw new InvalidEnumArgumentException ("Parameter autoSizeRowsMode is not a valid DataGridViewRowsMode.");
2218 if ((autoSizeRowsMode == DataGridViewAutoSizeRowsMode.AllHeaders || autoSizeRowsMode == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && rowHeadersVisible == false)
2219 throw new InvalidOperationException ("Parameter autoSizeRowsMode cannot be AllHeaders or DisplayedHeaders in this DataGridView.");
2220 if (autoSizeRowsMode == DataGridViewAutoSizeRowsMode.None)
2221 throw new ArgumentException ("Parameter autoSizeRowsMode cannot be None.");
2223 AutoResizeRows (autoSizeRowsMode, false);
2226 public virtual bool BeginEdit (bool selectAll) {
2227 if (currentCell == null || currentCell.IsInEditMode)
2230 if (currentCell.RowIndex >= 0) {
2231 if ((currentCell.InheritedState & DataGridViewElementStates.ReadOnly) == DataGridViewElementStates.ReadOnly) {
2236 DataGridViewCell cell = currentCell;
2237 Type editType = cell.EditType;
2239 if (editType == null && !(cell is IDataGridViewEditingCell))
2242 // Give user a chance to cancel the edit
2243 DataGridViewCellCancelEventArgs e = new DataGridViewCellCancelEventArgs (cell.ColumnIndex, cell.RowIndex);
2244 OnCellBeginEdit (e);
2249 // If the user begins an edit in the NewRow, add a new row
2250 if (CurrentCell.RowIndex == NewRowIndex) {
2251 new_row_commited = false;
2252 OnUserAddedRow (new DataGridViewRowEventArgs (Rows[NewRowIndex]));
2255 cell.SetIsInEditMode (true);
2257 // The cell has an editing control we need to setup
2258 if (editType != null) {
2259 Control ctrl = EditingControlInternal;
2261 // Check if we can reuse the one we already have
2262 bool isCorrectType = ctrl != null && ctrl.GetType () == editType;
2267 // We couldn't use the existing one, create a new one
2269 ctrl = (Control) Activator.CreateInstance (editType);
2270 EditingControlInternal = ctrl;
2273 // Call some functions that allows the editing control to get setup
2274 DataGridViewCellStyle style = cell.RowIndex == -1 ? DefaultCellStyle : cell.InheritedStyle;
2276 cell.InitializeEditingControl (cell.RowIndex, cell.FormattedValue, style);
2277 cell.PositionEditingControl (true, true, this.GetCellDisplayRectangle (cell.ColumnIndex, cell.RowIndex, false), bounds, style, false, false, (columns [cell.ColumnIndex].DisplayIndex == 0), (cell.RowIndex == 0));
2279 // Show the editing control
2280 EditingControlInternal.Visible = true;
2282 // Allow editing control to set focus as needed
2283 (EditingControlInternal as IDataGridViewEditingControl).PrepareEditingControlForEdit (selectAll);
2288 // If we are here, it means we have a cell that does not have an editing control
2289 // and simply implements IDataGridViewEditingCell itself.
2290 (cell as IDataGridViewEditingCell).PrepareEditingCellForEdit (selectAll);
2295 public bool CancelEdit ()
2297 if (currentCell != null && currentCell.IsInEditMode) {
2298 // The user's typing caused a new row to be created, but
2299 // now they are canceling that typing, we have to remove
2300 // the new row we added.
2301 if (!new_row_commited) {
2302 DataGridViewRow delete_row = EditingRow;
2303 Rows.RemoveInternal (delete_row);
2304 editing_row = Rows[currentCell.RowIndex];
2305 OnUserDeletedRow (new DataGridViewRowEventArgs (delete_row));
2306 new_row_commited = true;
2309 currentCell.SetIsInEditMode (false);
2310 currentCell.DetachEditingControl ();
2311 OnCellEndEdit (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
2317 public void ClearSelection ()
2319 foreach (DataGridViewColumn col in SelectedColumns)
2320 col.Selected = false;
2321 foreach (DataGridViewRow row in SelectedRows)
2322 row.Selected = false;
2323 foreach (DataGridViewCell cell in SelectedCells)
2324 cell.Selected = false;
2327 public bool CommitEdit (DataGridViewDataErrorContexts context)
2329 if (currentCell != null && currentCell.IsInEditMode) {
2330 IDataGridViewEditingControl ctrl = EditingControl as IDataGridViewEditingControl;
2331 ctrl.GetEditingControlFormattedValue (DataGridViewDataErrorContexts.Commit);
2332 currentCell.Value = ctrl.GetEditingControlFormattedValue (DataGridViewDataErrorContexts.Commit);
2339 [MonoTODO ("Always includes partial columns")]
2340 public int DisplayedColumnCount (bool includePartialColumns)
2344 for (int i = first_col_index; i < Columns.Count; i++)
2345 if (Columns.ColumnDisplayIndexSortedArrayList[i].Displayed)
2353 [MonoTODO ("Always includes partial rows")]
2354 public int DisplayedRowCount (bool includePartialRow)
2358 for (int i = first_row_index; i < Rows.Count; i++)
2359 if (Rows[i].Displayed)
2367 public bool EndEdit ()
2369 if (currentCell != null && currentCell.IsInEditMode) {
2370 if (EditingControl != null) {
2371 IDataGridViewEditingControl ctrl = EditingControl as IDataGridViewEditingControl;
2372 ctrl.GetEditingControlFormattedValue (DataGridViewDataErrorContexts.Commit);
2373 currentCell.Value = ctrl.GetEditingControlFormattedValue (DataGridViewDataErrorContexts.Commit);
2375 currentCell.SetIsInEditMode (false);
2376 currentCell.DetachEditingControl ();
2377 } else if (currentCell is IDataGridViewEditingCell) {
2378 currentCell.Value = (currentCell as IDataGridViewEditingCell).EditingCellFormattedValue;
2379 currentCell.SetIsInEditMode (false);
2382 new_row_commited = true;
2383 OnCellEndEdit (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
2389 [MonoTODO ("Does not use context parameter")]
2390 public bool EndEdit (DataGridViewDataErrorContexts context)
2395 public int GetCellCount (DataGridViewElementStates includeFilter) {
2397 foreach (DataGridViewRow row in rows) {
2398 foreach (DataGridViewCell cell in row.Cells) {
2399 if ((cell.State & includeFilter) != 0) {
2407 internal DataGridViewRow GetRowInternal (int rowIndex)
2409 return Rows.SharedRow (rowIndex);
2412 internal DataGridViewCell GetCellInternal (int colIndex, int rowIndex)
2414 return GetRowInternal (rowIndex).Cells.GetCellInternal (colIndex);
2417 public Rectangle GetCellDisplayRectangle (int columnIndex, int rowIndex, bool cutOverflow) {
2418 if (columnIndex < 0 || columnIndex >= columns.Count) {
2419 throw new ArgumentOutOfRangeException("Column index is out of range.");
2422 int x = 0, y = 0, w = 0, h = 0;
2427 if (ColumnHeadersVisible)
2428 y += ColumnHeadersHeight;
2430 if (RowHeadersVisible)
2431 x += RowHeadersWidth;
2433 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2435 for (int i = first_col_index; i < cols.Count; i++) {
2436 if (!cols[i].Visible)
2439 if (cols[i].Index == columnIndex) {
2447 for (int i = first_row_index; i < Rows.Count; i++) {
2448 if (i == rowIndex) {
2449 h = rows [i].Height;
2453 y += rows [i].Height;
2456 return new Rectangle (x, y, w, h);
2459 public virtual DataObject GetClipboardContent () {
2461 if (clipboardCopyMode == DataGridViewClipboardCopyMode.Disable)
2462 throw new InvalidOperationException ("Generating Clipboard content is not supported when the ClipboardCopyMode property is Disable.");
2464 int start_row = int.MaxValue, end_row = int.MinValue;
2465 int start_col = int.MaxValue, end_col = int.MinValue;
2467 bool include_row_headers = false;
2468 bool include_col_headers = false;
2469 bool only_included_headers = false;
2470 bool headers_includable = false;
2472 switch (ClipboardCopyMode) {
2473 case DataGridViewClipboardCopyMode.EnableWithoutHeaderText:
2475 case DataGridViewClipboardCopyMode.EnableWithAutoHeaderText:
2476 // Headers are included if not selection mode is CellSelect, and any header is selected.
2477 headers_includable = selectionMode != DataGridViewSelectionMode.CellSelect;
2479 case DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText:
2480 include_col_headers = include_row_headers = true;
2484 BitArray included_rows = new BitArray (RowCount);
2485 BitArray included_cols = new BitArray (ColumnCount);
2487 // If there are any selected columns,
2488 // include the column headers (if headers are to be shown).
2489 if (headers_includable && !include_col_headers) {
2490 for (int c = 0; c < ColumnCount; c++) {
2491 if (Columns [c].Selected) {
2492 include_col_headers = true;
2498 // Find the smallest rectangle that encompasses all selected cells.
2499 for (int r = 0; r < RowCount; r++) {
2500 DataGridViewRow row = Rows [r];
2502 if (headers_includable && !include_row_headers && row.Selected) {
2503 include_row_headers = true;
2506 for (int c = 0; c < ColumnCount; c++) {
2507 DataGridViewCell cell = row.Cells [c];
2509 if (cell == null || !cell.Selected)
2512 included_cols [c] = true;
2513 included_rows [r] = true;
2515 start_row = Math.Min (start_row, r);
2516 start_col = Math.Min (start_col, c);
2517 end_row = Math.Max (end_row, r);
2518 end_col = Math.Max (end_col, c);
2522 // Mark rows/columns in between selected cells as included if the selection mode isn't FullHeaderSelect.
2523 switch (selectionMode){
2524 case DataGridViewSelectionMode.CellSelect:
2525 case DataGridViewSelectionMode.ColumnHeaderSelect:
2526 case DataGridViewSelectionMode.RowHeaderSelect:
2527 if (selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect) {
2528 for (int r = start_row; r <= end_row; r++) {
2529 included_rows.Set (r, true);
2531 } else if (start_row <= end_row) {
2532 included_rows.SetAll (true);
2534 if (selectionMode != DataGridViewSelectionMode.RowHeaderSelect) {
2535 for (int c = start_col; c <= end_col; c++) {
2536 included_cols.Set (c, true);
2540 case DataGridViewSelectionMode.FullColumnSelect:
2541 case DataGridViewSelectionMode.FullRowSelect:
2542 only_included_headers = true;
2546 if (start_row > end_row)
2549 if (start_col > end_col)
2552 DataObject result = new DataObject ();
2554 System.Text.StringBuilder text_builder = new System.Text.StringBuilder ();
2555 System.Text.StringBuilder utext_builder = new System.Text.StringBuilder ();
2556 System.Text.StringBuilder html_builder = new System.Text.StringBuilder ();
2557 System.Text.StringBuilder csv_builder = new System.Text.StringBuilder ();
2559 // Loop through all rows and columns to create the content.
2560 // -1 is the header row/column.
2561 int first_row = start_row;
2562 int first_col = start_col;
2563 if (include_col_headers) {
2566 for (int r = first_row; r <= end_row; r++) {
2567 DataGridViewRow row = null;
2570 if (!included_rows [r])
2576 if (include_row_headers) {
2580 for (int c = first_col; c <= end_col; c++) {
2581 DataGridViewCell cell = null;
2583 if (c >= 0 && only_included_headers && !included_cols [c])
2588 cell = TopLeftHeaderCell;
2590 cell = Columns [c].HeaderCell;
2594 cell = row.HeaderCell;
2596 cell = row.Cells [c];
2600 string text, utext, html, csv;
2601 bool is_first_cell = (c == first_col);
2602 bool is_last_cell = (c == end_col);
2603 bool is_first_row = (r == first_row);
2604 bool is_last_row = (r == end_row);
2607 text = string.Empty;
2608 utext = string.Empty;
2609 html = string.Empty;
2612 text = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.Text) as string;
2613 utext = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.UnicodeText) as string;
2614 html = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.Html) as string;
2615 csv = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.CommaSeparatedValue) as string;
2618 text_builder.Append (text);
2619 utext_builder.Append (utext);
2620 html_builder.Append (html);
2621 csv_builder.Append (csv);
2623 if (c == -1) { // If we just did the row header, jump to the first column.
2628 if (r == -1) {// If we just did the column header, jump to the first row.
2634 // Html content always get the \r\n newline
2635 // It's valid html anyway, and it eases testing quite a bit
2636 // (since otherwise we'd have to change the start indices
2637 // in the added prologue/epilogue text)
2639 int fragment_end = 135 + html_builder.Length;
2640 int html_end = fragment_end + 36;
2643 "StartHTML:00000097{0}" +
2644 "EndHTML:{1:00000000}{0}" +
2645 "StartFragment:00000133{0}" +
2646 "EndFragment:{2:00000000}{0}" +
2649 "<!--StartFragment-->";
2651 html_start = string.Format (html_start, "\r\n", html_end, fragment_end);
2652 html_builder.Insert (0, html_start);
2653 html_builder.AppendFormat ("{0}<!--EndFragment-->{0}</BODY>{0}</HTML>", "\r\n");
2655 result.SetData (DataFormats.CommaSeparatedValue, false, csv_builder.ToString ());
2656 result.SetData (DataFormats.Html, false, html_builder.ToString ());
2657 result.SetData (DataFormats.UnicodeText, false, utext_builder.ToString ());
2658 result.SetData (DataFormats.Text, false, text_builder.ToString ());
2663 [MonoTODO ("Does not use cutOverflow parameter")]
2664 public Rectangle GetColumnDisplayRectangle (int columnIndex, bool cutOverflow)
2666 if (columnIndex < 0 || columnIndex > Columns.Count - 1)
2667 throw new ArgumentOutOfRangeException ("columnIndex");
2674 if (RowHeadersVisible)
2675 x += RowHeadersWidth;
2677 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2679 for (int i = first_col_index; i < cols.Count; i++) {
2680 if (!cols[i].Visible)
2683 if (cols[i].Index == columnIndex) {
2691 return new Rectangle (x, 0, w, Height);
2694 [MonoTODO ("Does not use cutOverflow parameter")]
2695 public Rectangle GetRowDisplayRectangle (int rowIndex, bool cutOverflow)
2697 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
2698 throw new ArgumentOutOfRangeException ("rowIndex");
2705 if (ColumnHeadersVisible)
2706 y += ColumnHeadersHeight;
2708 for (int i = first_row_index; i < Rows.Count; i++) {
2709 if (i == rowIndex) {
2714 y += rows[i].Height;
2717 return new Rectangle (0, y, Width, h);
2720 public HitTestInfo HitTest (int x, int y) {
2721 ///////////////////////////////////////////////////////
2722 //Console.WriteLine ("HitTest ({0}, {1})", x, y);
2723 bool isInColHeader = columnHeadersVisible && y >= 0 && y <= ColumnHeadersHeight;
2724 bool isInRowHeader = rowHeadersVisible && x >= 0 && x <= RowHeadersWidth;
2727 if (isInColHeader && isInRowHeader)
2728 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.TopLeftHeader);
2730 // HorizontalScrollBar
2731 if (horizontalScrollBar.Visible && horizontalScrollBar.Bounds.Contains (x, y))
2732 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.HorizontalScrollBar);
2734 // VerticalScrollBar
2735 if (verticalScrollBar.Visible && verticalScrollBar.Bounds.Contains (x, y))
2736 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.VerticalScrollBar);
2738 // The little box in the bottom right if both scrollbars are shown is None
2739 if (verticalScrollBar.Visible && horizontalScrollBar.Visible)
2740 if (new Rectangle (verticalScrollBar.Left, horizontalScrollBar.Top, verticalScrollBar.Width, horizontalScrollBar.Height).Contains (x, y))
2741 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.None);
2746 int top = columnHeadersVisible ? columnHeadersHeight : 0;
2748 for (int i = first_row_index; i < Rows.Count; i++) {
2749 DataGridViewRow row = Rows[i];
2751 if (y > top && y <= (top + row.Height)) {
2759 int left = rowHeadersVisible ? RowHeadersWidth : 0;
2761 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2763 for (int i = first_col_index; i < cols.Count; i++) {
2764 if (!cols[i].Visible)
2767 if (x > left && x <= (left + cols[i].Width)) {
2768 colindex = cols[i].Index;
2772 left += cols[i].Width;
2775 if (colindex >= 0 && rowindex >= 0)
2776 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.Cell);
2778 if (isInColHeader && colindex > -1)
2779 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.ColumnHeader);
2781 if (isInRowHeader && rowindex > -1)
2782 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.RowHeader);
2784 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.None);
2787 [MonoTODO ("Invalidates whole grid")]
2788 public void InvalidateCell (DataGridViewCell dataGridViewCell)
2790 if (dataGridViewCell == null)
2791 throw new ArgumentNullException ("Cell is null");
2793 if (dataGridViewCell.DataGridView != this)
2794 throw new ArgumentException ("The specified cell does not belong to this DataGridView.");
2796 InvalidateCell (dataGridViewCell.ColumnIndex, dataGridViewCell.RowIndex);
2799 [MonoTODO ("Invalidates whole grid")]
2800 public void InvalidateCell (int columnIndex, int rowIndex)
2802 if (columnIndex < 0 || columnIndex >= columns.Count)
2803 throw new ArgumentOutOfRangeException ("Column index is out of range.");
2805 if (rowIndex < 0 || rowIndex >= rows.Count)
2806 throw new ArgumentOutOfRangeException ("Row index is out of range.");
2808 Invalidate (GetCellDisplayRectangle (columnIndex, rowIndex, true));
2811 [MonoTODO ("Invalidates whole grid")]
2812 public void InvalidateColumn (int columnIndex)
2814 if (columnIndex < 0 || columnIndex >= columns.Count)
2815 throw new ArgumentOutOfRangeException ("Column index is out of range.");
2817 Invalidate (GetColumnDisplayRectangle (columnIndex, true));
2820 [MonoTODO ("Invalidates whole grid")]
2821 public void InvalidateRow (int rowIndex)
2823 if (rowIndex < 0 || rowIndex >= rows.Count)
2824 throw new ArgumentOutOfRangeException ("Row index is out of range.");
2826 Invalidate (GetRowDisplayRectangle (rowIndex, true));
2829 public virtual void NotifyCurrentCellDirty (bool dirty) {
2830 throw new NotImplementedException();
2833 public bool RefreshEdit ()
2835 if (IsCurrentCellInEditMode) {
2836 currentCell.InitializeEditingControl (currentCell.RowIndex, currentCell.FormattedValue, currentCell.InheritedStyle);
2843 [EditorBrowsable (EditorBrowsableState.Never)]
2844 public override void ResetText ()
2846 Text = string.Empty;
2849 public void SelectAll () {
2850 switch (selectionMode) {
2851 case DataGridViewSelectionMode.FullRowSelect:
2852 foreach (DataGridViewRow row in rows) {
2853 (row as DataGridViewBand).Selected = true;
2856 case DataGridViewSelectionMode.FullColumnSelect:
2857 foreach (DataGridViewColumn col in columns) {
2858 (col as DataGridViewBand).Selected = true;
2862 foreach (DataGridViewRow row in rows) {
2863 foreach (DataGridViewCell cell in row.Cells) {
2864 cell.Selected = true;
2873 public virtual void Sort (IComparer comparer)
2875 if (comparer == null)
2876 throw new ArgumentNullException ("comparer");
2877 if (VirtualMode || DataSource != null)
2878 throw new InvalidOperationException ();
2880 if (SortedColumn != null)
2881 SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
2885 Rows.Sort (comparer);
2887 sortedColumn = null;
2888 sortOrder = SortOrder.None;
2894 OnSorted (EventArgs.Empty);
2897 public virtual void Sort (DataGridViewColumn dataGridViewColumn, ListSortDirection direction)
2899 if (dataGridViewColumn == null)
2900 throw new ArgumentNullException ("dataGridViewColumn");
2901 if (dataGridViewColumn.DataGridView != this)
2902 throw new ArgumentException ("dataGridViewColumn");
2903 // XXX: This is thrown too much, disable for now..
2904 //if (DataSource != null && !dataGridViewColumn.IsDataBound)
2905 // throw new ArgumentException ("dataGridViewColumn");
2906 //if (VirtualMode && !dataGridViewColumn.IsDataBound)
2907 // throw new InvalidOperationException ();
2909 if (SortedColumn != null)
2910 SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
2914 // Figure out if this is a numeric sort or text sort
2915 bool is_numeric = true;
2918 foreach (DataGridViewRow row in Rows) {
2919 object val = row.Cells[dataGridViewColumn.Index].Value;
2921 if (val != null && !double.TryParse (val.ToString (), out n)) {
2927 ColumnSorter sorter = new ColumnSorter (dataGridViewColumn, direction, is_numeric);
2930 sortedColumn = dataGridViewColumn;
2931 sortOrder = (SortOrder)direction + 1;
2933 dataGridViewColumn.HeaderCell.SortGlyphDirection = (SortOrder)direction + 1;
2937 OnSorted (EventArgs.Empty);
2940 public void UpdateCellErrorText (int columnIndex, int rowIndex)
2942 if (columnIndex < 0 || columnIndex > Columns.Count - 1)
2943 throw new ArgumentOutOfRangeException ("columnIndex");
2944 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
2945 throw new ArgumentOutOfRangeException ("rowIndex");
2947 InvalidateCell (columnIndex, rowIndex);
2950 public void UpdateCellValue (int columnIndex, int rowIndex)
2952 if (columnIndex < 0 || columnIndex > Columns.Count - 1)
2953 throw new ArgumentOutOfRangeException ("columnIndex");
2954 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
2955 throw new ArgumentOutOfRangeException ("rowIndex");
2957 InvalidateCell (columnIndex, rowIndex);
2960 public void UpdateRowErrorText (int rowIndex)
2962 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
2963 throw new ArgumentOutOfRangeException ("rowIndex");
2965 InvalidateRow (rowIndex);
2968 public void UpdateRowErrorText (int rowIndexStart, int rowIndexEnd)
2970 if (rowIndexStart < 0 || rowIndexStart > Rows.Count - 1)
2971 throw new ArgumentOutOfRangeException ("rowIndexStart");
2972 if (rowIndexEnd < 0 || rowIndexEnd > Rows.Count - 1)
2973 throw new ArgumentOutOfRangeException ("rowIndexEnd");
2974 if (rowIndexEnd < rowIndexStart)
2975 throw new ArgumentOutOfRangeException ("rowIndexEnd", "rowIndexEnd must be greater than rowIndexStart");
2977 for (int i = rowIndexStart; i <= rowIndexEnd; i++)
2981 public void UpdateRowHeightInfo (int rowIndex, bool updateToEnd) {
2982 throw new NotImplementedException();
2985 protected override bool CanEnableIme {
2987 if (CurrentCell != null && CurrentCell.EditType != null)
2994 protected override Size DefaultSize {
2995 get { return new Size (240, 150); }
2998 protected ScrollBar HorizontalScrollBar {
2999 get { return horizontalScrollBar; }
3002 protected ScrollBar VerticalScrollBar {
3003 get { return verticalScrollBar; }
3006 protected virtual void AccessibilityNotifyCurrentCellChanged (Point cellAddress)
3008 throw new NotImplementedException ();
3011 [MonoTODO ("Does not use fixedHeight parameter")]
3012 protected void AutoResizeColumn (int columnIndex, DataGridViewAutoSizeColumnMode autoSizeColumnMode, bool fixedHeight)
3014 AutoResizeColumn (columnIndex, autoSizeColumnMode);
3017 [MonoTODO ("Does not use fixedRowHeadersWidth or fixedColumnsWidth parameters")]
3018 protected void AutoResizeColumnHeadersHeight (bool fixedRowHeadersWidth, bool fixedColumnsWidth)
3020 AutoResizeColumnHeadersHeight ();
3023 [MonoTODO ("Does not use columnIndex or fixedRowHeadersWidth or fixedColumnsWidth parameters")]
3024 protected void AutoResizeColumnHeadersHeight (int columnIndex, bool fixedRowHeadersWidth, bool fixedColumnWidth)
3026 AutoResizeColumnHeadersHeight (columnIndex);
3029 protected void AutoResizeColumns (DataGridViewAutoSizeColumnsMode autoSizeColumnsMode, bool fixedHeight) {
3030 for (int i = 0; i < Columns.Count; i++) {
3031 AutoResizeColumn (i, (DataGridViewAutoSizeColumnMode) autoSizeColumnsMode, fixedHeight);
3035 [MonoTODO ("Does not use fixedWidth parameter")]
3036 protected void AutoResizeRow (int rowIndex, DataGridViewAutoSizeRowMode autoSizeRowMode, bool fixedWidth)
3038 if (autoSizeRowMode == DataGridViewAutoSizeRowMode.RowHeader && !rowHeadersVisible)
3039 throw new InvalidOperationException ("row headers are not visible");
3040 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
3041 throw new ArgumentOutOfRangeException ("rowIndex");
3043 DataGridViewRow row = GetRowInternal (rowIndex);
3045 int new_height = row.GetPreferredHeight (rowIndex, autoSizeRowMode, true);
3047 if (row.Height != new_height)
3048 row.SetAutoSizeHeight (new_height);
3051 [MonoTODO ("Does not use fixedColumnHeadersHeight or fixedRowsHeight parameter")]
3052 protected void AutoResizeRowHeadersWidth (DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode, bool fixedColumnHeadersHeight, bool fixedRowsHeight)
3054 AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
3057 [MonoTODO ("Does not use rowIndex or fixedColumnHeadersHeight or fixedRowsHeight parameter")]
3058 protected void AutoResizeRowHeadersWidth (int rowIndex, DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode, bool fixedColumnHeadersHeight, bool fixedRowHeight)
3060 AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
3063 [MonoTODO ("Does not use fixedWidth parameter")]
3064 protected void AutoResizeRows (DataGridViewAutoSizeRowsMode autoSizeRowsMode, bool fixedWidth)
3066 if (autoSizeRowsMode == DataGridViewAutoSizeRowsMode.None)
3069 bool displayed_only = false;
3070 DataGridViewAutoSizeRowMode mode = DataGridViewAutoSizeRowMode.AllCells;
3072 switch (autoSizeRowsMode) {
3073 case DataGridViewAutoSizeRowsMode.AllHeaders:
3074 mode = DataGridViewAutoSizeRowMode.RowHeader;
3076 case DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders:
3077 mode = DataGridViewAutoSizeRowMode.AllCellsExceptHeader;
3079 case DataGridViewAutoSizeRowsMode.AllCells:
3080 mode = DataGridViewAutoSizeRowMode.AllCells;
3082 case DataGridViewAutoSizeRowsMode.DisplayedHeaders:
3083 mode = DataGridViewAutoSizeRowMode.RowHeader;
3084 displayed_only = true;
3086 case DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders:
3087 mode = DataGridViewAutoSizeRowMode.AllCellsExceptHeader;
3088 displayed_only = true;
3090 case DataGridViewAutoSizeRowsMode.DisplayedCells:
3091 mode = DataGridViewAutoSizeRowMode.AllCells;
3092 displayed_only = true;
3096 foreach (DataGridViewRow row in Rows) {
3097 if (!displayed_only || row.Displayed) {
3098 int new_height = row.GetPreferredHeight (row.Index, mode, fixedWidth);
3100 if (row.Height != new_height)
3101 row.SetAutoSizeHeight (new_height);
3106 [MonoTODO ("Does not use fixedMode parameter")]
3107 protected void AutoResizeRows (int rowIndexStart, int rowsCount, DataGridViewAutoSizeRowMode autoSizeRowMode, bool fixedWidth)
3109 for (int i = rowIndexStart; i < rowIndexStart + rowsCount; i++)
3110 AutoResizeRow (i, autoSizeRowMode, fixedWidth);
3113 protected void ClearSelection (int columnIndexException, int rowIndexException, bool selectExceptionElement) {
3114 if (columnIndexException >= columns.Count) {
3115 throw new ArgumentOutOfRangeException("ColumnIndexException is greater than the highest column index.");
3117 if (selectionMode == DataGridViewSelectionMode.FullRowSelect) {
3118 if (columnIndexException < -1) {
3119 throw new ArgumentOutOfRangeException("ColumnIndexException is less than -1.");
3123 if (columnIndexException < 0) {
3124 throw new ArgumentOutOfRangeException("ColumnIndexException is less than 0.");
3127 if (rowIndexException >= rows.Count) {
3128 throw new ArgumentOutOfRangeException("RowIndexException is greater than the highest row index.");
3130 if (selectionMode == DataGridViewSelectionMode.FullColumnSelect) {
3131 if (rowIndexException < -1) {
3132 throw new ArgumentOutOfRangeException("RowIndexException is less than -1.");
3136 if (rowIndexException < 0) {
3137 throw new ArgumentOutOfRangeException("RowIndexException is less than 0.");
3140 switch (selectionMode) {
3141 case DataGridViewSelectionMode.FullRowSelect:
3142 foreach (DataGridViewRow row in rows) {
3143 if (selectExceptionElement && row.Index == rowIndexException) {
3146 SetSelectedRowCore (row.Index, false);
3149 case DataGridViewSelectionMode.FullColumnSelect:
3150 foreach (DataGridViewColumn col in columns) {
3151 if (selectExceptionElement && col.Index == columnIndexException) {
3154 SetSelectedColumnCore (col.Index, false);
3158 foreach (DataGridViewCell cell in SelectedCells) {
3159 if (selectExceptionElement && cell.RowIndex == rowIndexException && cell.ColumnIndex == columnIndexException) {
3162 SetSelectedCellCore (cell.ColumnIndex, cell.RowIndex, false);
3168 protected override AccessibleObject CreateAccessibilityInstance ()
3170 return new DataGridViewAccessibleObject(this);
3173 [EditorBrowsable (EditorBrowsableState.Advanced)]
3174 protected virtual DataGridViewColumnCollection CreateColumnsInstance ()
3176 return new DataGridViewColumnCollection(this);
3179 protected override Control.ControlCollection CreateControlsInstance ()
3181 return new DataGridViewControlCollection (this);
3184 [EditorBrowsable (EditorBrowsableState.Advanced)]
3185 protected virtual DataGridViewRowCollection CreateRowsInstance ()
3187 return new DataGridViewRowCollection(this);
3190 protected override void Dispose (bool disposing) {
3193 protected override AccessibleObject GetAccessibilityObjectById (int objectId)
3195 throw new NotImplementedException();
3198 protected override bool IsInputChar (char charCode)
3203 protected override bool IsInputKey (Keys keyData)
3205 // Don't look at the modifiers
3206 keyData = keyData & ~Keys.Modifiers;
3228 protected virtual void OnAllowUserToAddRowsChanged (EventArgs e)
3230 EventHandler eh = (EventHandler)(Events [AllowUserToAddRowsChangedEvent]);
3235 protected virtual void OnAllowUserToDeleteRowsChanged (EventArgs e)
3237 EventHandler eh = (EventHandler)(Events [AllowUserToDeleteRowsChangedEvent]);
3242 protected virtual void OnAllowUserToOrderColumnsChanged (EventArgs e)
3244 EventHandler eh = (EventHandler)(Events [AllowUserToOrderColumnsChangedEvent]);
3249 protected virtual void OnAllowUserToResizeColumnsChanged (EventArgs e)
3251 EventHandler eh = (EventHandler)(Events [AllowUserToResizeColumnsChangedEvent]);
3256 protected virtual void OnAllowUserToResizeRowsChanged (EventArgs e)
3258 EventHandler eh = (EventHandler)(Events [AllowUserToResizeRowsChangedEvent]);
3263 protected virtual void OnAlternatingRowsDefaultCellStyleChanged (EventArgs e)
3265 EventHandler eh = (EventHandler)(Events [AlternatingRowsDefaultCellStyleChangedEvent]);
3270 protected virtual void OnAutoGenerateColumnsChanged (EventArgs e)
3272 EventHandler eh = (EventHandler)(Events [AutoGenerateColumnsChangedEvent]);
3277 protected internal virtual void OnAutoSizeColumnModeChanged (DataGridViewAutoSizeColumnModeEventArgs e)
3279 DataGridViewAutoSizeColumnModeEventHandler eh = (DataGridViewAutoSizeColumnModeEventHandler)(Events [AutoSizeColumnModeChangedEvent]);
3284 protected virtual void OnAutoSizeColumnsModeChanged (DataGridViewAutoSizeColumnsModeEventArgs e)
3286 DataGridViewAutoSizeColumnsModeEventHandler eh = (DataGridViewAutoSizeColumnsModeEventHandler)(Events [AutoSizeColumnsModeChangedEvent]);
3291 protected virtual void OnAutoSizeRowsModeChanged (DataGridViewAutoSizeModeEventArgs e)
3293 DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [AutoSizeRowsModeChangedEvent]);
3298 protected virtual void OnBackgroundColorChanged (EventArgs e)
3300 EventHandler eh = (EventHandler)(Events [BackgroundColorChangedEvent]);
3305 protected override void OnBindingContextChanged (EventArgs e)
3307 base.OnBindingContextChanged(e);
3310 protected virtual void OnBorderStyleChanged (EventArgs e)
3312 EventHandler eh = (EventHandler)(Events [BorderStyleChangedEvent]);
3317 protected virtual void OnCancelRowEdit (QuestionEventArgs e) {
3318 QuestionEventHandler eh = (QuestionEventHandler)(Events [CancelRowEditEvent]);
3323 protected virtual void OnCellBeginEdit (DataGridViewCellCancelEventArgs e)
3325 DataGridViewCellCancelEventHandler eh = (DataGridViewCellCancelEventHandler)(Events [CellBeginEditEvent]);
3330 protected virtual void OnCellBorderStyleChanged (EventArgs e)
3332 EventHandler eh = (EventHandler)(Events [CellBorderStyleChangedEvent]);
3337 protected virtual void OnCellClick (DataGridViewCellEventArgs e)
3339 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3341 cell.OnClickInternal (e);
3343 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellClickEvent]);
3348 protected virtual void OnCellContentClick (DataGridViewCellEventArgs e)
3350 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3352 cell.OnContentClickInternal (e);
3354 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContentClickEvent]);
3359 protected virtual void OnCellContentDoubleClick (DataGridViewCellEventArgs e)
3361 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3363 cell.OnContentDoubleClickInternal (e);
3365 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContentDoubleClickEvent]);
3370 protected virtual void OnCellContextMenuStripChanged (DataGridViewCellEventArgs e)
3372 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContextMenuStripChangedEvent]);
3377 protected virtual void OnCellContextMenuStripNeeded (DataGridViewCellContextMenuStripNeededEventArgs e)
3379 DataGridViewCellContextMenuStripNeededEventHandler eh = (DataGridViewCellContextMenuStripNeededEventHandler)(Events [CellContextMenuStripNeededEvent]);
3384 protected virtual void OnCellDoubleClick (DataGridViewCellEventArgs e)
3386 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3388 cell.OnDoubleClickInternal (e);
3389 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellDoubleClickEvent]);
3394 protected virtual void OnCellEndEdit (DataGridViewCellEventArgs e)
3396 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellEndEditEvent]);
3401 protected virtual void OnCellEnter (DataGridViewCellEventArgs e)
3403 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellEnterEvent]);
3408 protected internal virtual void OnCellErrorTextChanged (DataGridViewCellEventArgs e)
3410 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellErrorTextChangedEvent]);
3415 protected virtual void OnCellErrorTextNeeded (DataGridViewCellErrorTextNeededEventArgs e)
3417 DataGridViewCellErrorTextNeededEventHandler eh = (DataGridViewCellErrorTextNeededEventHandler)(Events [CellErrorTextNeededEvent]);
3422 internal void OnCellFormattingInternal (DataGridViewCellFormattingEventArgs e)
3424 OnCellFormatting (e);
3427 protected virtual void OnCellFormatting (DataGridViewCellFormattingEventArgs e)
3429 DataGridViewCellFormattingEventHandler eh = (DataGridViewCellFormattingEventHandler)(Events [CellFormattingEvent]);
3434 protected virtual void OnCellLeave (DataGridViewCellEventArgs e)
3436 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellLeaveEvent]);
3441 protected virtual void OnCellMouseClick (DataGridViewCellMouseEventArgs e)
3443 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3445 cell.OnMouseClickInternal (e);
3447 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseClickEvent]);
3452 protected virtual void OnCellMouseDoubleClick (DataGridViewCellMouseEventArgs e)
3454 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3456 cell.OnMouseDoubleClickInternal (e);
3458 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseDoubleClickEvent]);
3463 protected virtual void OnCellMouseDown (DataGridViewCellMouseEventArgs e)
3466 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3468 cell.OnMouseDownInternal (e);
3470 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseDownEvent]);
3475 protected virtual void OnCellMouseEnter (DataGridViewCellEventArgs e)
3477 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3479 cell.OnMouseEnterInternal (e.RowIndex);
3481 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellMouseEnterEvent]);
3486 protected virtual void OnCellMouseLeave (DataGridViewCellEventArgs e)
3488 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3490 cell.OnMouseLeaveInternal (e.RowIndex);
3492 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellMouseLeaveEvent]);
3497 protected virtual void OnCellMouseMove (DataGridViewCellMouseEventArgs e)
3499 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3501 cell.OnMouseMoveInternal (e);
3503 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseMoveEvent]);
3508 protected virtual void OnCellMouseUp (DataGridViewCellMouseEventArgs e)
3510 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3512 cell.OnMouseUpInternal (e);
3514 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseUpEvent]);
3519 internal void OnCellPaintingInternal (DataGridViewCellPaintingEventArgs e)
3524 protected virtual void OnCellPainting (DataGridViewCellPaintingEventArgs e)
3526 DataGridViewCellPaintingEventHandler eh = (DataGridViewCellPaintingEventHandler)(Events [CellPaintingEvent]);
3531 protected internal virtual void OnCellParsing (DataGridViewCellParsingEventArgs e)
3533 DataGridViewCellParsingEventHandler eh = (DataGridViewCellParsingEventHandler)(Events [CellParsingEvent]);
3538 protected virtual void OnCellStateChanged (DataGridViewCellStateChangedEventArgs e)
3540 DataGridViewCellStateChangedEventHandler eh = (DataGridViewCellStateChangedEventHandler)(Events [CellStateChangedEvent]);
3545 protected virtual void OnCellStyleChanged (DataGridViewCellEventArgs e)
3547 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellStyleChangedEvent]);
3552 protected virtual void OnCellStyleContentChanged (DataGridViewCellStyleContentChangedEventArgs e) {
3553 DataGridViewCellStyleContentChangedEventHandler eh = (DataGridViewCellStyleContentChangedEventHandler)(Events [CellStyleContentChangedEvent]);
3558 protected virtual void OnCellToolTipTextChanged (DataGridViewCellEventArgs e) {
3559 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellToolTipTextChangedEvent]);
3564 protected virtual void OnCellToolTipTextNeeded (DataGridViewCellToolTipTextNeededEventArgs e)
3566 DataGridViewCellToolTipTextNeededEventHandler eh = (DataGridViewCellToolTipTextNeededEventHandler)(Events [CellToolTipTextNeededEvent]);
3571 protected virtual void OnCellValidated (DataGridViewCellEventArgs e)
3573 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellValidatedEvent]);
3578 protected virtual void OnCellValidating (DataGridViewCellValidatingEventArgs e)
3580 DataGridViewCellValidatingEventHandler eh = (DataGridViewCellValidatingEventHandler)(Events [CellValidatingEvent]);
3585 protected virtual void OnCellValueChanged (DataGridViewCellEventArgs e)
3587 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellValueChangedEvent]);
3592 protected internal virtual void OnCellValueNeeded (DataGridViewCellValueEventArgs e)
3594 DataGridViewCellValueEventHandler eh = (DataGridViewCellValueEventHandler)(Events [CellValueNeededEvent]);
3599 protected virtual void OnCellValuePushed (DataGridViewCellValueEventArgs e)
3601 DataGridViewCellValueEventHandler eh = (DataGridViewCellValueEventHandler)(Events [CellValuePushedEvent]);
3606 internal void OnColumnAddedInternal (DataGridViewColumnEventArgs e)
3608 if (e.Column.CellTemplate != null) {
3609 foreach (DataGridViewRow row in Rows)
3610 row.Cells.Add ((DataGridViewCell)e.Column.CellTemplate.Clone ());
3613 AutoResizeColumnsInternal ();
3615 PrepareEditingRow (false, true);
3618 protected virtual void OnColumnAdded (DataGridViewColumnEventArgs e)
3620 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnAddedEvent]);
3625 protected internal virtual void OnColumnContextMenuStripChanged (DataGridViewColumnEventArgs e)
3627 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnContextMenuStripChangedEvent]);
3632 protected internal virtual void OnColumnDataPropertyNameChanged (DataGridViewColumnEventArgs e)
3634 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDataPropertyNameChangedEvent]);
3639 protected internal virtual void OnColumnDefaultCellStyleChanged (DataGridViewColumnEventArgs e)
3641 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDefaultCellStyleChangedEvent]);
3646 protected internal virtual void OnColumnDisplayIndexChanged (DataGridViewColumnEventArgs e)
3648 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDisplayIndexChangedEvent]);
3653 protected virtual void OnColumnDividerDoubleClick (DataGridViewColumnDividerDoubleClickEventArgs e)
3655 DataGridViewColumnDividerDoubleClickEventHandler eh = (DataGridViewColumnDividerDoubleClickEventHandler)(Events [ColumnDividerDoubleClickEvent]);
3660 protected internal virtual void OnColumnDividerWidthChanged (DataGridViewColumnEventArgs e)
3662 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDividerWidthChangedEvent]);
3667 protected internal virtual void OnColumnHeaderCellChanged (DataGridViewColumnEventArgs e)
3669 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnHeaderCellChangedEvent]);
3674 protected virtual void OnColumnHeaderMouseClick (DataGridViewCellMouseEventArgs e)
3676 DataGridViewColumn col = Columns[e.ColumnIndex];
3678 if (col.SortMode == DataGridViewColumnSortMode.Automatic) {
3679 ListSortDirection new_order;
3681 // Always use ascending unless we are clicking on a
3682 // column that is already sorted ascending.
3683 if (SortedColumn != col || sortOrder != SortOrder.Ascending)
3684 new_order = ListSortDirection.Ascending;
3686 new_order = ListSortDirection.Descending;
3688 Sort (col, new_order);
3691 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [ColumnHeaderMouseClickEvent]);
3696 protected virtual void OnColumnHeaderMouseDoubleClick (DataGridViewCellMouseEventArgs e)
3698 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [ColumnHeaderMouseDoubleClickEvent]);
3703 protected virtual void OnColumnHeadersBorderStyleChanged (EventArgs e)
3705 EventHandler eh = (EventHandler)(Events [ColumnHeadersBorderStyleChangedEvent]);
3710 protected virtual void OnColumnHeadersDefaultCellStyleChanged (EventArgs e)
3712 EventHandler eh = (EventHandler)(Events [ColumnHeadersDefaultCellStyleChangedEvent]);
3717 protected virtual void OnColumnHeadersHeightChanged (EventArgs e)
3719 EventHandler eh = (EventHandler)(Events [ColumnHeadersHeightChangedEvent]);
3724 protected virtual void OnColumnHeadersHeightSizeModeChanged (DataGridViewAutoSizeModeEventArgs e)
3726 DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [ColumnHeadersHeightSizeModeChangedEvent]);
3731 protected internal virtual void OnColumnMinimumWidthChanged (DataGridViewColumnEventArgs e)
3733 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnMinimumWidthChangedEvent]);
3738 protected internal virtual void OnColumnNameChanged (DataGridViewColumnEventArgs e)
3740 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnNameChangedEvent]);
3745 internal void OnColumnRemovedInternal (DataGridViewColumnEventArgs e)
3747 if (e.Column.CellTemplate != null) {
3748 int index = e.Column.Index;
3750 foreach (DataGridViewRow row in Rows)
3751 row.Cells.RemoveAt (index);
3754 AutoResizeColumnsInternal ();
3755 OnColumnRemoved (e);
3756 PrepareEditingRow (false, true);
3759 protected virtual void OnColumnRemoved (DataGridViewColumnEventArgs e)
3761 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnRemovedEvent]);
3766 protected internal virtual void OnColumnSortModeChanged (DataGridViewColumnEventArgs e)
3768 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnSortModeChangedEvent]);
3773 protected internal virtual void OnColumnStateChanged (DataGridViewColumnStateChangedEventArgs e)
3775 DataGridViewColumnStateChangedEventHandler eh = (DataGridViewColumnStateChangedEventHandler)(Events [ColumnStateChangedEvent]);
3780 protected internal virtual void OnColumnToolTipTextChanged (DataGridViewColumnEventArgs e)
3782 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnToolTipTextChangedEvent]);
3787 protected internal virtual void OnColumnWidthChanged (DataGridViewColumnEventArgs e)
3789 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnWidthChangedEvent]);
3794 protected virtual void OnCurrentCellChanged (EventArgs e)
3796 EventHandler eh = (EventHandler)(Events [CurrentCellChangedEvent]);
3801 protected virtual void OnCurrentCellDirtyStateChanged (EventArgs e)
3803 EventHandler eh = (EventHandler)(Events [CurrentCellDirtyStateChangedEvent]);
3808 protected override void OnCursorChanged (EventArgs e)
3810 base.OnCursorChanged (e);
3813 protected virtual void OnDataBindingComplete (DataGridViewBindingCompleteEventArgs e)
3815 DataGridViewBindingCompleteEventHandler eh = (DataGridViewBindingCompleteEventHandler)(Events [DataBindingCompleteEvent]);
3820 protected virtual void OnDataError (bool displayErrorDialogIfNoHandler, DataGridViewDataErrorEventArgs e)
3822 DataGridViewDataErrorEventHandler eh = (DataGridViewDataErrorEventHandler)(Events [DataErrorEvent]);
3826 else if (displayErrorDialogIfNoHandler)
3827 MessageBox.Show (e.ToString ());
3829 protected virtual void OnDataMemberChanged (EventArgs e) {
3830 EventHandler eh = (EventHandler)(Events [DataMemberChangedEvent]);
3835 protected virtual void OnDataSourceChanged (EventArgs e) {
3836 EventHandler eh = (EventHandler)(Events [DataSourceChangedEvent]);
3841 protected virtual void OnDefaultCellStyleChanged (EventArgs e) {
3842 EventHandler eh = (EventHandler)(Events [DefaultCellStyleChangedEvent]);
3847 protected virtual void OnDefaultValuesNeeded (DataGridViewRowEventArgs e) {
3848 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [DefaultValuesNeededEvent]);
3853 protected override void OnDoubleClick (EventArgs e) {
3854 base.OnDoubleClick(e);
3857 protected virtual void OnEditingControlShowing (DataGridViewEditingControlShowingEventArgs e) {
3858 DataGridViewEditingControlShowingEventHandler eh = (DataGridViewEditingControlShowingEventHandler)(Events [EditingControlShowingEvent]);
3863 protected virtual void OnEditModeChanged (EventArgs e)
3865 EventHandler eh = (EventHandler)(Events [EditModeChangedEvent]);
3870 protected override void OnEnabledChanged (EventArgs e)
3872 base.OnEnabledChanged(e);
3875 protected override void OnEnter (EventArgs e )
3880 protected override void OnGotFocus(EventArgs e)
3882 base.OnGotFocus (e);
3884 // To add focus rectangle if needed
3885 if (currentCell != null && ShowFocusCues)
3886 InvalidateCell (currentCell);
3889 protected override void OnFontChanged (EventArgs e)
3891 base.OnFontChanged(e);
3894 protected override void OnForeColorChanged (EventArgs e)
3896 base.OnForeColorChanged(e);
3899 protected virtual void OnGridColorChanged (EventArgs e)
3901 EventHandler eh = (EventHandler)(Events [GridColorChangedEvent]);
3906 protected override void OnHandleCreated (EventArgs e)
3908 base.OnHandleCreated(e);
3910 if (Rows.Count > 0 && Columns.Count > 0)
3911 MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, false, false, false);
3914 protected override void OnHandleDestroyed(EventArgs e)
3916 base.OnHandleDestroyed (e);
3919 [EditorBrowsable (EditorBrowsableState.Advanced)]
3920 protected override void OnKeyDown (KeyEventArgs e)
3924 e.Handled = ProcessDataGridViewKey (e);
3927 [EditorBrowsable (EditorBrowsableState.Advanced)]
3928 protected override void OnKeyPress (KeyPressEventArgs e)
3933 [EditorBrowsable (EditorBrowsableState.Advanced)]
3934 protected override void OnKeyUp (KeyEventArgs e)
3939 protected override void OnLayout (LayoutEventArgs e)
3941 if (horizontalScrollBar.Visible && verticalScrollBar.Visible) {
3942 horizontalScrollBar.Bounds = new Rectangle (BorderWidth, Height - BorderWidth - horizontalScrollBar.Height, Width - (2 * BorderWidth) - verticalScrollBar.Width, horizontalScrollBar.Height);
3943 verticalScrollBar.Bounds = new Rectangle (Width - BorderWidth - verticalScrollBar.Width, BorderWidth, verticalScrollBar.Width, Height - (2 * BorderWidth) - horizontalScrollBar.Height);
3944 } else if (horizontalScrollBar.Visible)
3945 horizontalScrollBar.Bounds = new Rectangle (BorderWidth, Height - BorderWidth - horizontalScrollBar.Height, Width - (2 * BorderWidth), horizontalScrollBar.Height);
3946 else if (verticalScrollBar.Visible)
3947 verticalScrollBar.Bounds = new Rectangle (Width - BorderWidth - verticalScrollBar.Width, BorderWidth, verticalScrollBar.Width, Height - (2 * BorderWidth));
3949 AutoResizeColumnsInternal ();
3953 protected override void OnLeave (EventArgs e)
3958 protected override void OnLostFocus(EventArgs e)
3960 base.OnLostFocus (e);
3962 // To remove focus rectangle if needed
3963 if (currentCell != null && ShowFocusCues)
3964 InvalidateCell (currentCell);
3967 protected override void OnMouseClick (MouseEventArgs e)
3969 base.OnMouseClick(e);
3971 if (column_resize_active || row_resize_active)
3974 //Console.WriteLine("Mouse: Clicks: {0}; Delta: {1}; X: {2}; Y: {3};", e.Clicks, e.Delta, e.X, e.Y);
3975 HitTestInfo hit = HitTest (e.X, e.Y);
3978 case DataGridViewHitTestType.Cell:
3979 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
3980 Point cellpoint = new Point (e.X - display.X, e.Y - display.Y);
3982 OnCellMouseClick (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, cellpoint.X, cellpoint.Y, e));
3984 DataGridViewCell cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex);
3986 if (cell.GetContentBounds (hit.RowIndex).Contains (cellpoint)) {
3987 DataGridViewCellEventArgs dgvcea = new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex);
3988 OnCellContentClick (dgvcea);
3992 case DataGridViewHitTestType.ColumnHeader:
3993 Rectangle display2 = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
3994 Point cellpoint2 = new Point (e.X - display2.X, e.Y - display2.Y);
3996 OnColumnHeaderMouseClick (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, cellpoint2.X, cellpoint2.Y, e));
4001 protected override void OnMouseDoubleClick (MouseEventArgs e)
4003 base.OnMouseDoubleClick(e);
4006 private void DoSelectionOnMouseDown (HitTestInfo hitTest)
4008 Keys modifiers = Control.ModifierKeys;
4009 bool isControl = (modifiers & Keys.Control) != 0;
4010 bool isShift = (modifiers & Keys.Shift) != 0;
4011 //bool isRowHeader = hitTest.Type == DataGridViewHitTestType.RowHeader;
4012 //bool isColHeader = hitTest.Type == DataGridViewHitTestType.ColumnHeader;
4013 DataGridViewSelectionMode mode;
4015 switch (hitTest.Type) {
4016 case DataGridViewHitTestType.Cell:
4017 mode = selectionMode;
4019 case DataGridViewHitTestType.ColumnHeader:
4020 mode = selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect ? DataGridViewSelectionMode.FullColumnSelect : selectionMode;
4022 if (mode != DataGridViewSelectionMode.FullColumnSelect)
4025 case DataGridViewHitTestType.RowHeader:
4026 mode = selectionMode == DataGridViewSelectionMode.RowHeaderSelect ? DataGridViewSelectionMode.FullRowSelect : selectionMode;
4028 if (mode != DataGridViewSelectionMode.FullRowSelect)
4030 break; // Handled below
4036 // If SHIFT is pressed:
4037 // Select all from selected_row/column/cell to current row/column/cell, unselect everything else
4039 // Unselect all rows/columns/cells, select the clicked one
4040 int min_row, max_row;
4041 int min_col, max_col;
4043 selected_row = hitTest.RowIndex;
4044 selected_column = hitTest.ColumnIndex;
4047 if (selected_row != -1)
4048 selected_row = hitTest.RowIndex;
4049 if (selected_column != -1)
4050 selected_column = hitTest.ColumnIndex;
4052 if (selected_row >= hitTest.RowIndex) {
4053 min_row = hitTest.RowIndex;
4054 max_row = isShift ? selected_row : min_row;
4056 max_row = hitTest.RowIndex;
4057 min_row = isShift ? selected_row : max_row;
4059 if (selected_column >= hitTest.ColumnIndex) {
4060 min_col = hitTest.ColumnIndex;
4061 max_col = isShift ? selected_column : min_col;
4063 max_col = hitTest.ColumnIndex;
4064 min_col = isShift ? selected_column : max_col;
4068 case DataGridViewSelectionMode.FullRowSelect:
4069 for (int i = 0; i < RowCount; i++) {
4070 bool select = i >= min_row && i <= max_row;
4072 for (int c = 0; c < ColumnCount; c++) {
4073 if (Rows [i].Cells [c].Selected) {
4074 SetSelectedCellCore (c, i, false);
4078 if (select != Rows [i].Selected) {
4079 SetSelectedRowCore (i, select);
4083 case DataGridViewSelectionMode.FullColumnSelect:
4084 for (int i = 0; i < ColumnCount; i++) {
4085 bool select = i >= min_col && i <= max_col;
4087 for (int r = 0; r < RowCount; r++) {
4088 if (Rows [r].Cells [i].Selected) {
4089 SetSelectedCellCore (i, r, false);
4093 if (select != Columns [i].Selected) {
4094 SetSelectedColumnCore (i, select);
4098 case DataGridViewSelectionMode.ColumnHeaderSelect:
4099 case DataGridViewSelectionMode.RowHeaderSelect:
4101 case DataGridViewSelectionMode.CellSelect:
4103 for (int c = 0; c < ColumnCount; c++) {
4104 if (columns [c].Selected)
4105 SetSelectedColumnCore (c, false);
4108 for (int r = 0; r < RowCount; r++) {
4109 if (rows [r].Selected)
4110 SetSelectedRowCore (r, false);
4113 for (int r = 0; r < RowCount; r++) {
4114 for (int c = 0; c < ColumnCount; c++) {
4115 bool select = (r >= min_row && r <= max_row) && (c >= min_col && c <= max_col);
4116 if (select != Rows [r].Cells [c].Selected)
4117 SetSelectedCellCore (c, r, select);
4123 } else if (isControl) {
4124 // Switch the selected state of the row.
4126 case DataGridViewSelectionMode.FullRowSelect:
4127 SetSelectedRowCore (hitTest.RowIndex, !rows [hitTest.RowIndex].Selected);
4129 case DataGridViewSelectionMode.FullColumnSelect:
4130 SetSelectedColumnCore (hitTest.ColumnIndex, !columns [hitTest.ColumnIndex].Selected);
4132 case DataGridViewSelectionMode.ColumnHeaderSelect:
4133 case DataGridViewSelectionMode.RowHeaderSelect:
4135 case DataGridViewSelectionMode.CellSelect:
4136 if (hitTest.ColumnIndex >= 0 && hitTest.RowIndex >= 0) {
4137 SetSelectedCellCore (hitTest.ColumnIndex, hitTest.RowIndex, !Rows [hitTest.RowIndex].Cells [hitTest.ColumnIndex].Selected);
4145 protected override void OnMouseDown (MouseEventArgs e)
4147 base.OnMouseDown(e);
4149 HitTestInfo hitTest = HitTest(e.X, e.Y);
4151 DataGridViewCell cell = null;
4152 DataGridViewRow row = null;
4153 Rectangle cellBounds;
4155 if (hitTest.Type == DataGridViewHitTestType.ColumnHeader && MouseOverColumnResize (hitTest.ColumnIndex, e.X)) {
4156 if (e.Clicks == 2) {
4158 AutoResizeColumn (hitTest.ColumnIndex);
4162 resize_band = hitTest.ColumnIndex;
4163 column_resize_active = true;
4164 resize_band_start = e.X;
4165 resize_band_delta = 0;
4167 DrawVerticalResizeLine (resize_band_start);
4171 if (hitTest.Type == DataGridViewHitTestType.RowHeader && MouseOverRowResize (hitTest.RowIndex, e.Y)) {
4172 if (e.Clicks == 2) {
4174 AutoResizeRow (hitTest.RowIndex);
4178 resize_band = hitTest.RowIndex;
4179 row_resize_active = true;
4180 resize_band_start = e.Y;
4181 resize_band_delta = 0;
4183 DrawHorizontalResizeLine (resize_band_start);
4187 if (hitTest.Type == DataGridViewHitTestType.Cell) {
4188 cellBounds = GetCellDisplayRectangle (hitTest.ColumnIndex, hitTest.RowIndex, false);
4189 OnCellMouseDown (new DataGridViewCellMouseEventArgs (hitTest.ColumnIndex, hitTest.RowIndex, e.X - cellBounds.X, e.Y - cellBounds.Y, e));
4190 OnCellClick (new DataGridViewCellEventArgs (hitTest.ColumnIndex, hitTest.RowIndex));
4191 row = rows [hitTest.RowIndex];
4192 cell = row.Cells [hitTest.ColumnIndex];
4195 DoSelectionOnMouseDown (hitTest);
4197 if (hitTest.Type != DataGridViewHitTestType.Cell) {
4198 if (hitTest.Type == DataGridViewHitTestType.ColumnHeader)
4199 pressed_header_cell = columns [hitTest.ColumnIndex].HeaderCell;
4200 else if (hitTest.Type == DataGridViewHitTestType.RowHeader)
4201 pressed_header_cell = rows [hitTest.RowIndex].HeaderCell;
4206 if (cell == currentCell) {
4209 } else if (currentCell != null) {
4211 OnCellLeave(new DataGridViewCellEventArgs(currentCell.ColumnIndex, currentCell.RowIndex));
4214 currentCellAddress = new Point (currentCell.ColumnIndex, currentCell.RowIndex);
4215 currentRow = cell.OwningRow;
4216 OnCurrentCellChanged(EventArgs.Empty);
4217 OnCellEnter(new DataGridViewCellEventArgs(cell.ColumnIndex, cell.RowIndex));
4218 if (editMode == DataGridViewEditMode.EditOnEnter) {
4225 protected override void OnMouseEnter (EventArgs e)
4227 base.OnMouseEnter(e);
4230 protected override void OnMouseLeave (EventArgs e)
4232 base.OnMouseLeave (e);
4234 if (hover_cell != null) {
4235 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4239 EnteredHeaderCell = null;
4242 protected override void OnMouseMove (MouseEventArgs e)
4244 base.OnMouseMove (e);
4246 if (column_resize_active) {
4247 // Erase the old line
4248 DrawVerticalResizeLine (resize_band_start + resize_band_delta);
4250 resize_band_delta = e.X - resize_band_start;
4252 // Draw the new line
4253 DrawVerticalResizeLine (resize_band_start + resize_band_delta);
4257 if (row_resize_active) {
4258 // Erase the old line
4259 DrawHorizontalResizeLine (resize_band_start + resize_band_delta);
4261 resize_band_delta = e.Y - resize_band_start;
4263 // Draw the new line
4264 DrawHorizontalResizeLine (resize_band_start + resize_band_delta);
4268 Cursor new_cursor = Cursors.Default;
4269 HitTestInfo hit = this.HitTest (e.X, e.Y);
4271 if (hit.Type == DataGridViewHitTestType.Cell) {
4272 EnteredHeaderCell = null;
4274 DataGridViewCell new_cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex);
4276 // Check if we have moved into an error icon area
4277 Rectangle icon = new_cell.ErrorIconBounds;
4279 if (!icon.IsEmpty) {
4280 Point loc = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false).Location;
4285 if (icon.Contains (e.X, e.Y)) {
4286 if (tooltip_currently_showing != new_cell)
4287 MouseEnteredErrorIcon (new_cell);
4289 MouseLeftErrorIcon (new_cell);
4292 // We have never been in a cell before
4293 if (hover_cell == null) {
4294 hover_cell = new_cell;
4295 OnCellMouseEnter (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex));
4297 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4298 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4303 // Were we already in this cell?
4304 if (hover_cell.RowIndex == hit.RowIndex && hover_cell.ColumnIndex == hit.ColumnIndex) {
4305 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4306 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4311 // We are changing cells
4312 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4314 hover_cell = new_cell;
4316 OnCellMouseEnter (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex));
4318 Rectangle display2 = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4319 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display2.X, e.Y - display2.Y, e));
4322 } else if (hit.Type == DataGridViewHitTestType.RowHeader) {
4323 DataGridViewRowHeaderCell new_cell = Rows[hit.RowIndex].HeaderCell;
4325 EnteredHeaderCell = new_cell;
4327 if (MouseOverRowResize (hit.RowIndex, e.Y))
4328 new_cursor = Cursors.HSplit;
4330 // Check if we have moved into an error icon area
4331 Rectangle icon = new_cell.InternalErrorIconsBounds;
4333 if (!icon.IsEmpty) {
4334 Point loc = GetCellDisplayRectangle (0, hit.RowIndex, false).Location;
4336 icon.X += BorderWidth;
4339 if (icon.Contains (e.X, e.Y)) {
4340 if (tooltip_currently_showing != new_cell)
4341 MouseEnteredErrorIcon (new_cell);
4343 MouseLeftErrorIcon (new_cell);
4345 } else if (hit.Type == DataGridViewHitTestType.TopLeftHeader) {
4346 EnteredHeaderCell = null;
4348 DataGridViewTopLeftHeaderCell new_cell = (DataGridViewTopLeftHeaderCell)TopLeftHeaderCell;
4350 // Check if we have moved into an error icon area
4351 Rectangle icon = new_cell.InternalErrorIconsBounds;
4353 if (!icon.IsEmpty) {
4354 Point loc = Point.Empty;
4356 icon.X += BorderWidth;
4359 if (icon.Contains (e.X, e.Y)) {
4360 if (tooltip_currently_showing != new_cell)
4361 MouseEnteredErrorIcon (new_cell);
4363 MouseLeftErrorIcon (new_cell);
4367 if (hit.Type == DataGridViewHitTestType.ColumnHeader) {
4368 EnteredHeaderCell = Columns [hit.ColumnIndex].HeaderCell;
4370 if (MouseOverColumnResize (hit.ColumnIndex, e.X))
4371 new_cursor = Cursors.VSplit;
4373 EnteredHeaderCell = null;
4375 // We have left the cell area
4376 if (hover_cell != null) {
4377 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4382 Cursor = new_cursor;
4385 protected override void OnMouseUp (MouseEventArgs e)
4389 if (column_resize_active) {
4390 column_resize_active = false;
4392 if (resize_band_delta + Columns[resize_band].Width < 0)
4393 resize_band_delta = -Columns[resize_band].Width;
4395 Columns[resize_band].Width = Math.Max (resize_band_delta + Columns[resize_band].Width, Columns[resize_band].MinimumWidth);
4400 if (row_resize_active) {
4401 row_resize_active = false;
4403 if (resize_band_delta + Rows[resize_band].Height < 0)
4404 resize_band_delta = -Rows[resize_band].Height;
4406 Rows[resize_band].Height = Math.Max (resize_band_delta + Rows[resize_band].Height, Rows[resize_band].MinimumHeight);
4411 HitTestInfo hit = this.HitTest (e.X, e.Y);
4413 if (hit.Type == DataGridViewHitTestType.Cell) {
4414 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4415 OnCellMouseUp (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4418 if (pressed_header_cell != null) {
4419 DataGridViewHeaderCell cell = pressed_header_cell;
4420 pressed_header_cell = null;
4421 if (ThemeEngine.Current.DataGridViewHeaderCellHasPressedStyle (this))
4422 Invalidate (GetHeaderCellBounds (cell));
4426 protected override void OnMouseWheel (MouseEventArgs e)
4428 base.OnMouseWheel(e);
4431 protected virtual void OnMultiSelectChanged (EventArgs e)
4433 EventHandler eh = (EventHandler)(Events [MultiSelectChangedEvent]);
4434 if (eh != null) eh (this, e);
4437 protected virtual void OnNewRowNeeded (DataGridViewRowEventArgs e) {
4438 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [NewRowNeededEvent]);
4439 if (eh != null) eh (this, e);
4442 int first_row_index = 0;
4443 internal int first_col_index = 0;
4445 protected override void OnPaint (PaintEventArgs e)
4449 Graphics g = e.Graphics;
4450 Rectangle bounds = ClientRectangle;
4452 // Paint the background
4453 PaintBackground (g, e.ClipRectangle, bounds);
4455 List<DataGridViewColumn> sortedColumns = columns.ColumnDisplayIndexSortedArrayList;
4457 // Take borders into account
4458 bounds.Inflate (-BorderWidth, -BorderWidth);
4460 // Paint the top left cell
4461 if (rowHeadersVisible && columnHeadersVisible && ColumnCount > 0) {
4462 Rectangle topleftbounds = new Rectangle (bounds.X, bounds.Y, rowHeadersWidth, columnHeadersHeight);
4464 TopLeftHeaderCell.PaintWork (g, e.ClipRectangle, topleftbounds, -1, TopLeftHeaderCell.State, ColumnHeadersDefaultCellStyle, AdvancedColumnHeadersBorderStyle, DataGridViewPaintParts.All);
4467 // Paint the column headers
4468 if (columnHeadersVisible) {
4469 Rectangle headerBounds = bounds;
4470 headerBounds.Height = columnHeadersHeight;
4472 if (rowHeadersVisible)
4473 headerBounds.X += rowHeadersWidth;
4475 for (int index = first_col_index; index < sortedColumns.Count; index++) {
4476 DataGridViewColumn col = sortedColumns[index];
4481 headerBounds.Width = col.Width;
4482 DataGridViewCell cell = col.HeaderCell;
4484 DataGridViewAdvancedBorderStyle intermediateBorderStyle = (DataGridViewAdvancedBorderStyle)((ICloneable)this.AdvancedColumnHeadersBorderStyle).Clone ();
4485 DataGridViewAdvancedBorderStyle borderStyle = AdjustColumnHeaderBorderStyle (this.AdvancedColumnHeadersBorderStyle, intermediateBorderStyle, cell.ColumnIndex == 0, cell.ColumnIndex == columns.Count - 1);
4487 cell.PaintWork (g, e.ClipRectangle, headerBounds, -1, cell.State, cell.InheritedStyle, borderStyle, DataGridViewPaintParts.All);
4489 headerBounds.X += col.Width;
4492 bounds.Y += columnHeadersHeight;
4495 gridWidth = rowHeadersVisible ? rowHeadersWidth : 0;
4498 int rows_displayed = 0;
4499 int first_row_height = Rows.Count > 0 ? Rows[Math.Min (Rows.Count - 1, first_row_index)].Height : 0;
4500 // int room_left = this.Height;
4502 // Reset all columns to !Displayed
4503 for (int i = 0; i < Columns.Count; i++)
4504 Columns[i].DisplayedInternal = false;
4506 // Set Displayed columns
4507 for (int i = first_col_index; i < Columns.Count; i++) {
4508 DataGridViewColumn col = Columns.ColumnDisplayIndexSortedArrayList[i];
4513 col.DisplayedInternal = true;
4514 gridWidth += col.Width;
4516 if (gridWidth >= Width)
4520 // Reset all rows to !Displayed
4521 for (int i = 0; i < Rows.Count; i++)
4522 GetRowInternal (i).DisplayedInternal = false;
4525 for (int index = first_row_index; index < Rows.Count; index++) {
4526 DataGridViewRow row = Rows[index];
4527 GetRowInternal (index).DisplayedInternal = true;
4529 bounds.Height = row.Height;
4530 bool is_first = row.Index == 0;
4531 bool is_last = row.Index == rows.Count - 1;
4533 row.Paint (g, e.ClipRectangle, bounds, row.Index, row.GetState (row.Index), is_first, is_last);
4535 bounds.Y += bounds.Height;
4536 bounds.X = BorderWidth;
4538 if (bounds.Y < ClientSize.Height - (horizontalScrollBar.Visible ? horizontalScrollBar.Height : 0))
4543 gridHeight += row.Height;
4548 foreach (DataGridViewColumn col in sortedColumns)
4550 gridWidth += col.Width;
4554 foreach (DataGridViewRow row in Rows)
4555 gridHeight += row.Height;
4557 if (rowHeadersVisible)
4558 gridWidth += rowHeadersWidth;
4560 if (columnHeadersVisible)
4561 gridHeight += columnHeadersHeight;
4563 bool horizontalVisible = false;
4564 bool verticalVisible = false;
4567 if (gridWidth > Size.Width || gridHeight > Size.Height) {
4568 Size = new Size(gridWidth, gridHeight);
4572 if (gridWidth > Size.Width) {
4573 horizontalVisible = true;
4575 if (gridHeight > Size.Height) {
4576 verticalVisible = true;
4578 if (horizontalScrollBar.Visible && (gridHeight + horizontalScrollBar.Height) > Size.Height) {
4579 verticalVisible = true;
4581 if (verticalScrollBar.Visible && (gridWidth + verticalScrollBar.Width) > Size.Width) {
4582 horizontalVisible = true;
4584 if (horizontalVisible) {
4585 horizontalScrollBar.Minimum = 0;
4586 horizontalScrollBar.Maximum = gridWidth;
4587 horizontalScrollBar.SmallChange = Columns[first_col_index].Width;
4588 horizontalScrollBar.LargeChange = ClientSize.Width - rowHeadersWidth;
4590 if (verticalVisible) {
4591 verticalScrollBar.Minimum = 0;
4592 verticalScrollBar.Maximum = gridHeight;
4593 verticalScrollBar.SmallChange = first_row_height + 1;
4594 verticalScrollBar.LargeChange = ClientSize.Height - columnHeadersHeight;
4598 horizontalScrollBar.Visible = horizontalVisible;
4599 verticalScrollBar.Visible = verticalVisible;
4601 // Paint the bottom right square if both scrollbars are displayed
4602 if (horizontalScrollBar.Visible && verticalScrollBar.Visible)
4603 g.FillRectangle (SystemBrushes.Control, new Rectangle (horizontalScrollBar.Right, verticalScrollBar.Bottom, verticalScrollBar.Width, horizontalScrollBar.Height));
4606 bounds = ClientRectangle;
4608 switch (BorderStyle) {
4609 case BorderStyle.FixedSingle:
4610 g.DrawRectangle (Pens.Black, new Rectangle (bounds.Left, bounds.Top, bounds.Width - 1, bounds.Height - 1));
4612 case BorderStyle.Fixed3D:
4613 ControlPaint.DrawBorder3D (g, bounds, Border3DStyle.Sunken);
4618 protected virtual void OnReadOnlyChanged (EventArgs e) {
4619 EventHandler eh = (EventHandler)(Events [ReadOnlyChangedEvent]);
4624 protected override void OnResize (EventArgs e) {
4626 AutoResizeColumnsInternal ();
4628 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
4629 OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
4632 protected override void OnRightToLeftChanged (EventArgs e) {
4633 base.OnRightToLeftChanged(e);
4636 // In MSDN2 documentation there's no internal here
4637 protected internal virtual void OnRowContextMenuStripChanged (DataGridViewRowEventArgs e)
4639 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowContextMenuStripChangedEvent]);
4640 if (eh != null) eh (this, e);
4643 protected virtual void OnRowContextMenuStripNeeded (DataGridViewRowContextMenuStripNeededEventArgs e)
4645 DataGridViewRowContextMenuStripNeededEventHandler eh = (DataGridViewRowContextMenuStripNeededEventHandler)(Events [RowContextMenuStripNeededEvent]);
4646 if (eh != null) eh (this, e);
4649 protected internal virtual void OnRowDefaultCellStyleChanged (DataGridViewRowEventArgs e)
4651 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowDefaultCellStyleChangedEvent]);
4652 if (eh != null) eh (this, e);
4655 protected virtual void OnRowDirtyStateNeeded (QuestionEventArgs e)
4657 QuestionEventHandler eh = (QuestionEventHandler)(Events [RowDirtyStateNeededEvent]);
4658 if (eh != null) eh (this, e);
4661 protected virtual void OnRowDividerDoubleClick (DataGridViewRowDividerDoubleClickEventArgs e)
4663 DataGridViewRowDividerDoubleClickEventHandler eh = (DataGridViewRowDividerDoubleClickEventHandler)(Events [RowDividerDoubleClickEvent]);
4664 if (eh != null) eh (this, e);
4667 protected virtual void OnRowDividerHeightChanged (DataGridViewRowEventArgs e)
4669 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowDividerHeightChangedEvent]);
4670 if (eh != null) eh (this, e);
4673 protected virtual void OnRowEnter (DataGridViewCellEventArgs e)
4675 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowEnterEvent]);
4676 if (eh != null) eh (this, e);
4679 protected internal virtual void OnRowErrorTextChanged (DataGridViewRowEventArgs e)
4681 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowErrorTextChangedEvent]);
4682 if (eh != null) eh (this, e);
4685 protected virtual void OnRowErrorTextNeeded (DataGridViewRowErrorTextNeededEventArgs e)
4687 DataGridViewRowErrorTextNeededEventHandler eh = (DataGridViewRowErrorTextNeededEventHandler)(Events [RowErrorTextNeededEvent]);
4688 if (eh != null) eh (this, e);
4691 protected internal virtual void OnRowHeaderCellChanged (DataGridViewRowEventArgs e)
4693 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowHeaderCellChangedEvent]);
4694 if (eh != null) eh (this, e);
4697 protected virtual void OnRowHeaderMouseClick (DataGridViewCellMouseEventArgs e)
4699 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [RowHeaderMouseClickEvent]);
4700 if (eh != null) eh (this, e);
4703 protected virtual void OnRowHeaderMouseDoubleClick (DataGridViewCellMouseEventArgs e)
4705 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [RowHeaderMouseDoubleClickEvent]);
4706 if (eh != null) eh (this, e);
4709 protected virtual void OnRowHeadersBorderStyleChanged (EventArgs e)
4711 EventHandler eh = (EventHandler)(Events [RowHeadersBorderStyleChangedEvent]);
4712 if (eh != null) eh (this, e);
4715 protected virtual void OnRowHeadersDefaultCellStyleChanged (EventArgs e)
4717 EventHandler eh = (EventHandler)(Events [RowHeadersDefaultCellStyleChangedEvent]);
4718 if (eh != null) eh (this, e);
4721 protected virtual void OnRowHeadersWidthChanged (EventArgs e)
4723 EventHandler eh = (EventHandler)(Events [RowHeadersWidthChangedEvent]);
4724 if (eh != null) eh (this, e);
4727 protected virtual void OnRowHeadersWidthSizeModeChanged (DataGridViewAutoSizeModeEventArgs e)
4729 DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [RowHeadersWidthSizeModeChangedEvent]);
4730 if (eh != null) eh (this, e);
4733 protected internal virtual void OnRowHeightChanged (DataGridViewRowEventArgs e)
4735 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowHeightChangedEvent]);
4736 if (eh != null) eh (this, e);
4739 protected virtual void OnRowHeightInfoNeeded (DataGridViewRowHeightInfoNeededEventArgs e)
4741 DataGridViewRowHeightInfoNeededEventHandler eh = (DataGridViewRowHeightInfoNeededEventHandler)(Events [RowHeightInfoNeededEvent]);
4742 if (eh != null) eh (this, e);
4745 protected virtual void OnRowHeightInfoPushed (DataGridViewRowHeightInfoPushedEventArgs e)
4747 DataGridViewRowHeightInfoPushedEventHandler eh = (DataGridViewRowHeightInfoPushedEventHandler)(Events [RowHeightInfoPushedEvent]);
4748 if (eh != null) eh (this, e);
4751 protected virtual void OnRowLeave (DataGridViewCellEventArgs e)
4753 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowLeaveEvent]);
4754 if (eh != null) eh (this, e);
4757 protected internal virtual void OnRowMinimumHeightChanged (DataGridViewRowEventArgs e)
4759 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowMinimumHeightChangedEvent]);
4760 if (eh != null) eh (this, e);
4763 protected internal virtual void OnRowPostPaint (DataGridViewRowPostPaintEventArgs e)
4765 DataGridViewRowPostPaintEventHandler eh = (DataGridViewRowPostPaintEventHandler)(Events [RowPostPaintEvent]);
4766 if (eh != null) eh (this, e);
4769 protected internal virtual void OnRowPrePaint (DataGridViewRowPrePaintEventArgs e)
4771 DataGridViewRowPrePaintEventHandler eh = (DataGridViewRowPrePaintEventHandler)(Events [RowPrePaintEvent]);
4772 if (eh != null) eh (this, e);
4775 internal void OnRowsAddedInternal (DataGridViewRowsAddedEventArgs e)
4781 protected internal virtual void OnRowsAdded (DataGridViewRowsAddedEventArgs e)
4783 DataGridViewRowsAddedEventHandler eh = (DataGridViewRowsAddedEventHandler)(Events [RowsAddedEvent]);
4784 if (eh != null) eh (this, e);
4787 protected virtual void OnRowsDefaultCellStyleChanged (EventArgs e)
4789 EventHandler eh = (EventHandler)(Events [RowsDefaultCellStyleChangedEvent]);
4790 if (eh != null) eh (this, e);
4793 protected internal virtual void OnRowsRemoved (DataGridViewRowsRemovedEventArgs e)
4795 DataGridViewRowsRemovedEventHandler eh = (DataGridViewRowsRemovedEventHandler)(Events [RowsRemovedEvent]);
4796 if (eh != null) eh (this, e);
4799 protected internal virtual void OnRowStateChanged (int rowIndex, DataGridViewRowStateChangedEventArgs e)
4801 DataGridViewRowStateChangedEventHandler eh = (DataGridViewRowStateChangedEventHandler)(Events [RowStateChangedEvent]);
4802 if (eh != null) eh (this, e);
4805 protected virtual void OnRowUnshared (DataGridViewRowEventArgs e)
4807 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowUnsharedEvent]);
4808 if (eh != null) eh (this, e);
4811 protected virtual void OnRowValidated (DataGridViewCellEventArgs e)
4813 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowValidatedEvent]);
4814 if (eh != null) eh (this, e);
4817 protected virtual void OnRowValidating (DataGridViewCellCancelEventArgs e)
4819 DataGridViewCellCancelEventHandler eh = (DataGridViewCellCancelEventHandler)(Events [RowValidatingEvent]);
4820 if (eh != null) eh (this, e);
4823 protected virtual void OnScroll (ScrollEventArgs e)
4825 ScrollEventHandler eh = (ScrollEventHandler)(Events [ScrollEvent]);
4826 if (eh != null) eh (this, e);
4829 protected virtual void OnSelectionChanged (EventArgs e)
4831 EventHandler eh = (EventHandler)(Events [SelectionChangedEvent]);
4832 if (eh != null) eh (this, e);
4835 protected virtual void OnSortCompare (DataGridViewSortCompareEventArgs e) {
4836 DataGridViewSortCompareEventHandler eh = (DataGridViewSortCompareEventHandler)(Events [SortCompareEvent]);
4837 if (eh != null) eh (this, e);
4840 protected virtual void OnSorted (EventArgs e)
4842 EventHandler eh = (EventHandler)(Events [SortedEvent]);
4843 if (eh != null) eh (this, e);
4846 protected virtual void OnUserAddedRow (DataGridViewRowEventArgs e)
4849 PrepareEditingRow (false, false);
4851 e = new DataGridViewRowEventArgs (editing_row);
4853 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [UserAddedRowEvent]);
4854 if (eh != null) eh (this, e);
4857 protected virtual void OnUserDeletedRow (DataGridViewRowEventArgs e)
4859 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [UserDeletedRowEvent]);
4860 if (eh != null) eh (this, e);
4864 protected virtual void OnUserDeletingRow (DataGridViewRowCancelEventArgs e)
4866 DataGridViewRowCancelEventHandler eh = (DataGridViewRowCancelEventHandler)(Events [UserDeletingRowEvent]);
4867 if (eh != null) eh (this, e);
4870 protected override void OnValidating (CancelEventArgs e)
4872 base.OnValidating(e);
4875 protected override void OnVisibleChanged (EventArgs e)
4877 base.OnVisibleChanged(e);
4880 protected virtual void PaintBackground (Graphics graphics, Rectangle clipBounds, Rectangle gridBounds)
4882 graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (backgroundColor), gridBounds);
4885 protected bool ProcessAKey (Keys keyData)
4890 if ((keyData & Keys.Control) == Keys.Control) {
4898 protected virtual bool ProcessDataGridViewKey (KeyEventArgs e)
4900 switch (e.KeyData & ~Keys.Modifiers) {
4902 return ProcessAKey (e.KeyData);
4904 return ProcessDeleteKey (e.KeyData);
4906 return ProcessDownKey (e.KeyData);
4908 return ProcessEscapeKey (e.KeyData);
4910 return ProcessEndKey (e.KeyData);
4912 return ProcessEnterKey (e.KeyData);
4914 return ProcessF2Key (e.KeyData);
4916 return ProcessHomeKey (e.KeyData);
4918 return ProcessLeftKey (e.KeyData);
4920 return ProcessNextKey (e.KeyData);
4922 return ProcessPriorKey (e.KeyData);
4924 return ProcessRightKey (e.KeyData);
4926 return ProcessSpaceKey (e.KeyData);
4928 return ProcessTabKey (e.KeyData);
4930 return ProcessUpKey (e.KeyData);
4933 return ProcessZeroKey (e.KeyData);
4939 protected bool ProcessDeleteKey (Keys keyData)
4941 if (!allowUserToDeleteRows || SelectedRows.Count == 0)
4944 int index = Math.Max (selected_row - SelectedRows.Count + 1, 0);
4946 for (int i = SelectedRows.Count - 1; i >= 0; i--) {
4947 DataGridViewRow row = SelectedRows[i];
4952 if (hover_cell != null && hover_cell.OwningRow == row)
4955 if (DataSource != null && DataSource is DataSet)
4956 (DataSource as DataSet).Tables[dataMember].Rows.RemoveAt (row.Index);
4958 Rows.RemoveAt (row.Index);
4961 if (selected_rows != null)
4962 selected_rows.InternalClear ();
4963 if (selected_columns != null)
4964 selected_columns.InternalClear ();
4966 SetSelectedCellCore (0, Math.Min (index, Rows.Count - 1), true);
4972 protected override bool ProcessDialogKey (Keys keyData)
4976 case Keys.Shift | Keys.Tab:
4978 return base.ProcessDialogKey (keyData & ~Keys.Control);
4980 if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
4984 case Keys.Control | Keys.Tab:
4985 case Keys.Control | Keys.Shift | Keys.Tab:
4987 return base.ProcessDialogKey (keyData & ~Keys.Control);
4989 if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
4995 if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
5001 return base.ProcessDialogKey(keyData);
5004 protected bool ProcessDownKey (Keys keyData)
5006 int current_row = CurrentCellAddress.Y;
5008 if (current_row < Rows.Count - 1) {
5009 // Move to the last cell in the column
5010 if ((keyData & Keys.Control) == Keys.Control)
5011 MoveCurrentCell (CurrentCellAddress.X, Rows.Count - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5012 // Move one cell down
5014 MoveCurrentCell (CurrentCellAddress.X, current_row + 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5022 protected bool ProcessEndKey (Keys keyData)
5024 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5026 // Move to the last cell in the control
5027 if ((keyData & Keys.Control) == Keys.Control) {
5028 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), Rows.Count - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5032 // Move to the last cell in the row
5033 if (disp_index < Columns.Count - 1) {
5034 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5041 protected bool ProcessEnterKey (Keys keyData)
5043 if (ProcessDownKey (keyData))
5046 // ProcessDown may fail if we are on the last row,
5047 // but Enter should still EndEdit if this is the last row
5052 protected bool ProcessEscapeKey (Keys keyData)
5054 if (!IsCurrentCellInEditMode)
5061 protected bool ProcessF2Key (Keys keyData)
5063 if (editMode == DataGridViewEditMode.EditOnF2 || editMode == DataGridViewEditMode.EditOnKeystrokeOrF2) {
5071 protected bool ProcessHomeKey (Keys keyData)
5073 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5075 // Move to the first cell in the control
5076 if ((keyData & Keys.Control) == Keys.Control) {
5077 MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5081 // Move to the first cell in the row
5082 if (disp_index > 0) {
5083 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5090 [MonoTODO ("What does insert do?")]
5091 protected bool ProcessInsertKey (Keys keyData)
5096 protected override bool ProcessKeyEventArgs (ref Message m)
5098 DataGridViewCell cell = CurrentCell;
5101 if (cell.KeyEntersEditMode (new KeyEventArgs ((Keys)m.WParam.ToInt32 ())))
5104 return base.ProcessKeyEventArgs (ref m);
5107 protected override bool ProcessKeyPreview (ref Message m)
5109 if ((Msg)m.Msg == Msg.WM_KEYDOWN && (IsCurrentCellInEditMode || m.HWnd == horizontalScrollBar.Handle || m.HWnd == verticalScrollBar.Handle)) {
5110 KeyEventArgs e = new KeyEventArgs ((Keys)m.WParam.ToInt32 ());
5112 IDataGridViewEditingControl ctrl = (IDataGridViewEditingControl)EditingControlInternal;
5115 if (ctrl.EditingControlWantsInputKey (e.KeyData, false))
5118 switch (e.KeyData) {
5127 return ProcessDataGridViewKey (e);
5131 return base.ProcessKeyPreview (ref m);
5134 protected bool ProcessLeftKey (Keys keyData)
5136 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5138 if (disp_index > 0) {
5139 // Move to the first cell in the row
5140 if ((keyData & Keys.Control) == Keys.Control)
5141 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5142 // Move one cell to the left
5144 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5153 protected bool ProcessNextKey (Keys keyData)
5155 int current_row = CurrentCellAddress.Y;
5157 if (current_row < Rows.Count - 1) {
5158 // Move one "page" of cells down
5159 int new_row = Math.Min (Rows.Count - 1, current_row + DisplayedRowCount (false));
5161 MoveCurrentCell (CurrentCellAddress.X, new_row, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5170 protected bool ProcessPriorKey (Keys keyData)
5172 int current_row = CurrentCellAddress.Y;
5174 if (current_row > 0) {
5175 // Move one "page" of cells up
5176 int new_row = Math.Max (0, current_row - DisplayedRowCount (false));
5178 MoveCurrentCell (CurrentCellAddress.X, new_row, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5186 protected bool ProcessRightKey (Keys keyData)
5188 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5190 if (disp_index < Columns.Count - 1) {
5191 // Move to the last cell in the row
5192 if ((keyData & Keys.Control) == Keys.Control)
5193 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5194 // Move one cell to the right
5196 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index + 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5204 protected bool ProcessSpaceKey (Keys keyData)
5206 if ((keyData & Keys.Shift) == Keys.Shift) {
5207 if (selectionMode == DataGridViewSelectionMode.RowHeaderSelect) {
5208 SetSelectedRowCore (CurrentCellAddress.Y, true);
5209 InvalidateRow (CurrentCellAddress.Y);
5212 if (selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect) {
5213 SetSelectedColumnCore (CurrentCellAddress.X, true);
5214 InvalidateColumn (CurrentCellAddress.X);
5219 if (CurrentCell is DataGridViewButtonCell || CurrentCell is DataGridViewLinkCell || CurrentCell is DataGridViewCheckBoxCell) {
5220 DataGridViewCellEventArgs e = new DataGridViewCellEventArgs (CurrentCell.ColumnIndex, CurrentCell.RowIndex);
5223 OnCellContentClick (e);
5225 if (CurrentCell is DataGridViewButtonCell)
5226 (CurrentCell as DataGridViewButtonCell).OnClickInternal (e);
5227 if (CurrentCell is DataGridViewCheckBoxCell)
5228 (CurrentCell as DataGridViewCheckBoxCell).OnClickInternal (e);
5236 protected bool ProcessTabKey (Keys keyData)
5238 Form f = FindForm ();
5241 f.ActivateFocusCues ();
5243 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5246 // Shift-tab goes backwards
5247 if ((keyData & Keys.Shift) == Keys.Shift) {
5248 if (disp_index > 0) {
5249 // Move one cell to the left
5250 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, false, true);
5252 } else if (currentCellAddress.Y > 0) {
5253 // Move to the last cell in the previous row
5254 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y - 1, true, false, false, true);
5259 if (disp_index < Columns.Count - 1) {
5260 // Move one cell to the right
5261 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index + 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, false, true);
5264 } else if (currentCellAddress.Y < Rows.Count - 1) {
5265 // Move to the first cell in the next row
5266 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y + 1, true, false, false, true);
5276 protected bool ProcessUpKey (Keys keyData)
5278 int current_row = CurrentCellAddress.Y;
5280 if (current_row > 0) {
5281 // Move to the first cell in the column
5282 if ((keyData & Keys.Control) == Keys.Control)
5283 MoveCurrentCell (CurrentCellAddress.X, 0, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5286 MoveCurrentCell (CurrentCellAddress.X, current_row - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5294 protected bool ProcessZeroKey (Keys keyData)
5296 if ((keyData & Keys.Control) == Keys.Control && CurrentCell.EditType != null) {
5297 CurrentCell.Value = DBNull.Value;
5298 InvalidateCell (CurrentCell);
5305 protected override void SetBoundsCore (int x, int y, int width, int height, BoundsSpecified specified) {
5306 base.SetBoundsCore(x, y, width, height, specified);
5309 [MonoTODO ("Does not use validateCurrentCell or throughMouseClick")]
5310 protected virtual bool SetCurrentCellAddressCore (int columnIndex, int rowIndex, bool setAnchorCellAddress, bool validateCurrentCell, bool throughMouseClick)
5312 if ((columnIndex < 0 || columnIndex > Columns.Count - 1) && rowIndex != -1)
5313 throw new ArgumentOutOfRangeException ("columnIndex");
5314 if ((rowIndex < 0 || rowIndex > Rows.Count - 1) && columnIndex != -1)
5315 throw new ArgumentOutOfRangeException ("rowIndex");
5317 DataGridViewCell cell;
5319 if (columnIndex == -1 && rowIndex == -1)
5322 cell = Rows.SharedRow (rowIndex).Cells[columnIndex];
5324 if (cell != null && !cell.Visible)
5325 throw new InvalidOperationException ("cell is not visible");
5327 if (setAnchorCellAddress)
5328 anchor_cell = new Point (columnIndex, rowIndex);
5330 currentCellAddress = new Point (columnIndex, rowIndex);
5333 OnCurrentCellChanged (EventArgs.Empty);
5338 protected virtual void SetSelectedCellCore (int columnIndex, int rowIndex, bool selected) {
5339 rows [rowIndex].Cells [columnIndex].Selected = selected;
5341 OnSelectionChanged (EventArgs.Empty);
5344 internal void SetSelectedColumnCoreInternal (int columnIndex, bool selected) {
5345 SetSelectedColumnCore (columnIndex, selected);
5348 protected virtual void SetSelectedColumnCore (int columnIndex, bool selected) {
5349 if (selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect && selectionMode != DataGridViewSelectionMode.FullColumnSelect)
5352 DataGridViewColumn col = columns [columnIndex];
5354 col.SelectedInternal = selected;
5356 if (selected_columns == null)
5357 selected_columns = new DataGridViewSelectedColumnCollection ();
5359 if (!selected && selected_columns.Contains (col)) {
5360 selected_columns.InternalRemove (col);
5361 } else if (selected && !selected_columns.Contains (col)) {
5362 selected_columns.InternalAdd (col);
5366 internal void SetSelectedRowCoreInternal (int rowIndex, bool selected) {
5367 SetSelectedRowCore (rowIndex, selected);
5370 protected virtual void SetSelectedRowCore (int rowIndex, bool selected) {
5371 DataGridViewRow row = rows [rowIndex];
5373 row.SelectedInternal = selected;
5375 if (selected_rows == null)
5376 selected_rows = new DataGridViewSelectedRowCollection (this);
5378 if (!selected && selected_rows.Contains (row)) {
5379 selected_rows.InternalRemove (row);
5380 } else if (selected && !selected_rows.Contains (row)) {
5381 selected_rows.InternalAdd (row);
5385 protected override void WndProc (ref Message m)
5387 base.WndProc (ref m);
5390 internal void InternalOnCellClick (DataGridViewCellEventArgs e)
5395 internal void InternalOnCellContentClick (DataGridViewCellEventArgs e)
5397 OnCellContentClick (e);
5400 internal void InternalOnCellContentDoubleClick (DataGridViewCellEventArgs e)
5402 OnCellContentDoubleClick (e);
5405 internal void InternalOnCellValueChanged (DataGridViewCellEventArgs e)
5407 OnCellValueChanged (e);
5410 internal void InternalOnDataError (DataGridViewDataErrorEventArgs e)
5412 /////////////// false? ////////////
5413 OnDataError (false, e);
5416 internal void InternalOnMouseWheel (MouseEventArgs e)
5421 internal void OnHScrollBarScroll (object sender, ScrollEventArgs e)
5423 horizontalScrollingOffset = e.NewValue;
5426 for (int index = 0; index < Columns.Count; index++) {
5427 DataGridViewColumn col = Columns[index];
5429 if (e.NewValue < left + col.Width) {
5430 if (first_col_index != index) {
5431 first_col_index = index;
5443 internal void OnVScrollBarScroll (object sender, ScrollEventArgs e)
5445 verticalScrollingOffset = e.NewValue;
5448 for (int index = 0; index < Rows.Count; index++) {
5449 DataGridViewRow row = Rows[index];
5451 if (e.NewValue <= top + row.Height) {
5452 if (first_row_index != index) {
5453 first_row_index = index;
5464 if (Rows.Count == 0)
5467 first_row_index = Rows.Count - DisplayedRowCount (false) + 1;
5472 internal void RaiseCellStyleChanged (DataGridViewCellEventArgs e) {
5473 OnCellStyleChanged(e);
5476 internal void OnColumnCollectionChanged (object sender, CollectionChangeEventArgs e) {
5478 case CollectionChangeAction.Add:
5479 OnColumnAddedInternal(new DataGridViewColumnEventArgs(e.Element as DataGridViewColumn));
5481 case CollectionChangeAction.Remove:
5482 OnColumnRemovedInternal(new DataGridViewColumnEventArgs(e.Element as DataGridViewColumn));
5484 case CollectionChangeAction.Refresh:
5489 // Resizes all columns according to their AutoResizeMode property.
5490 // First all the columns that aren't Filled are resized, then we resize all the Filled columns.
5491 internal void AutoResizeColumnsInternal ()
5493 for (int i = 0; i < Columns.Count; i++)
5494 AutoResizeColumnInternal (i, Columns [i].InheritedAutoSizeMode);
5496 AutoFillColumnsInternal ();
5499 internal void AutoFillColumnsInternal ()
5501 float totalFillWeight = 0;
5502 int FillCount = 0; // The number of columns that has AutoSizeMode.Fill set
5503 int spaceLeft = ClientSize.Width - (verticalScrollBar.VisibleInternal ? verticalScrollBar.Width : 0);
5505 if (RowHeadersVisible) {
5506 spaceLeft -= RowHeadersWidth;
5508 spaceLeft -= BorderWidth * 2;
5510 int [] fixed_widths = new int [Columns.Count];
5511 int [] new_widths = new int [Columns.Count];
5512 bool fixed_any = false;
5514 for (int i = 0; i < Columns.Count; i++) {
5515 DataGridViewColumn col = Columns [i];
5517 switch (col.InheritedAutoSizeMode) {
5518 case DataGridViewAutoSizeColumnMode.Fill:
5520 totalFillWeight += col.FillWeight;
5522 case DataGridViewAutoSizeColumnMode.AllCellsExceptHeader:
5523 case DataGridViewAutoSizeColumnMode.AllCells:
5524 case DataGridViewAutoSizeColumnMode.DisplayedCells:
5525 case DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader:
5526 case DataGridViewAutoSizeColumnMode.None:
5527 case DataGridViewAutoSizeColumnMode.NotSet:
5528 spaceLeft -= Columns [i].Width;
5533 spaceLeft = Math.Max (0, spaceLeft);
5537 for (int i = 0; i < columns.Count; i++) {
5538 DataGridViewColumn col = Columns [i];
5541 if (col.InheritedAutoSizeMode != DataGridViewAutoSizeColumnMode.Fill)
5544 if (fixed_widths [i] != 0)
5547 width = (totalFillWeight == 0) ? 0 : (int) Math.Round (spaceLeft * (col.FillWeight / totalFillWeight), 0);
5552 if (width < col.MinimumWidth) {
5553 width = col.MinimumWidth;
5554 fixed_widths [i] = width;
5557 totalFillWeight -= col.FillWeight;
5560 new_widths [i] = width;
5562 } while (fixed_any);
5564 for (int i = 0; i < columns.Count; i++) {
5565 if (Columns [i].InheritedAutoSizeMode != DataGridViewAutoSizeColumnMode.Fill)
5568 Columns [i].Width = new_widths [i];
5572 internal void AutoResizeColumnInternal (int columnIndex, DataGridViewAutoSizeColumnMode mode)
5574 // http://msdn2.microsoft.com/en-us/library/ms171605.aspx
5577 DataGridViewColumn col = Columns [columnIndex];
5580 case DataGridViewAutoSizeColumnMode.Fill:
5582 case DataGridViewAutoSizeColumnMode.AllCellsExceptHeader:
5583 case DataGridViewAutoSizeColumnMode.AllCells:
5584 case DataGridViewAutoSizeColumnMode.DisplayedCells:
5585 case DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader:
5586 size = CalculateColumnCellWidth (columnIndex, col.InheritedAutoSizeMode);
5588 case DataGridViewAutoSizeColumnMode.ColumnHeader:
5589 size = col.HeaderCell.ContentBounds.Width;
5598 if (size < col.MinimumWidth)
5599 size = col.MinimumWidth;
5604 internal int CalculateColumnCellWidth (int index, DataGridViewAutoSizeColumnMode mode)
5608 bool only_visible = false;
5610 if (mode == DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader ||
5611 mode == DataGridViewAutoSizeColumnMode.AllCellsExceptHeader)
5614 only_visible = (mode == DataGridViewAutoSizeColumnMode.DisplayedCells || mode == DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader);
5616 for (int i = first_row; i < Rows.Count; i++) {
5618 Rectangle row_rect = this.GetRowDisplayRectangle (i, false);
5619 if (!ClientRectangle.IntersectsWith (row_rect))
5623 int cell_width = Rows[i].Cells[index].PreferredSize.Width;
5625 result = Math.Max (result, cell_width);
5631 Rectangle GetHeaderCellBounds (DataGridViewHeaderCell cell)
5633 Rectangle bounds = new Rectangle (ClientRectangle.Location, cell.Size);
5634 if (cell is DataGridViewColumnHeaderCell) {
5635 if (RowHeadersVisible)
5636 bounds.X += RowHeadersWidth;
5637 List<DataGridViewColumn> sortedColumns = columns.ColumnDisplayIndexSortedArrayList;
5638 for (int index = first_col_index; index < sortedColumns.Count; index++) {
5639 DataGridViewColumn column = sortedColumns [index];
5640 if (column.Index == cell.ColumnIndex)
5642 bounds.X += column.Width;
5645 if (ColumnHeadersVisible)
5646 bounds.Y += ColumnHeadersHeight;
5647 for (int index = first_row_index; index < Rows.Count; index++) {
5648 DataGridViewRow row = GetRowInternal (index);
5649 if (row.HeaderCell == cell)
5651 bounds.Y += row.Height;
5657 internal void PrepareEditingRow (bool cell_changed, bool column_changed)
5661 show = ColumnCount > 0 && AllowUserToAddRows;
5663 if (!show && editing_row != null) {
5664 Rows.RemoveInternal (editing_row);
5667 if (editing_row != null) {
5669 // The row changed, it's no longer an editing row.
5671 } else if (column_changed) {
5672 // The number of columns has changed, we need a new editing row.
5673 Rows.RemoveInternal (editing_row);
5677 if (editing_row == null) {
5678 editing_row = RowTemplateFull;
5679 Rows.AddInternal (editing_row, false);
5686 internal DataGridViewRow EditingRow {
5687 get { return editing_row; }
5690 private void BindIList (IList list) {
5691 if (autoGenerateColumns) {
5692 // Stuff from a DataSet
5693 if (list is DataView) {
5694 DataView dataView = (DataView) list;
5695 DataTable table = dataView.Table;
5697 foreach (DataColumn dataColumn in table.Columns) {
5698 DataGridViewColumn col = CreateColumnByType (dataColumn.DataType);
5700 col.Name = dataColumn.ColumnName;
5701 col.DataPropertyName = dataColumn.ColumnName;
5702 col.SetIsDataBound (true);
5703 col.ValueType = dataColumn.DataType;
5704 col.AutoGenerated = true;
5709 // Its a generic something or other, like a BindingList<T>, so
5710 // we can figure out the type from the generic type
5711 else if (list.GetType ().GetGenericArguments ().Length > 0) {
5712 GenerateColumnsFromType (list.GetType ().GetGenericArguments ()[0]);
5714 // Its a normal array/collection type thing
5715 else if (list.GetType ().IsArray) {
5716 GenerateColumnsFromType (list.GetType ().GetElementType ());
5717 } else if (list is BindingSource && (list as BindingSource).item_type != null) {
5718 foreach (PropertyDescriptor property in TypeDescriptor.GetProperties ((list as BindingSource).item_type)) {
5719 DataGridViewColumn col = CreateColumnByType (property.PropertyType);
5720 col.Name = property.DisplayName;
5721 col.ReadOnly = property.IsReadOnly;
5722 col.AutoGenerated = true;
5726 AllowUserToAddRows = (list as BindingSource).AllowNew;
5730 // Subscribe to the dataset's change notification
5731 if (list is DataView) {
5732 (list as DataView).ListChanged += OnListChanged;
5733 (list as DataView).Table.ColumnChanged += OnTableColumnChanged;
5737 foreach (object element in list)
5738 AddBoundRow (element);
5741 private void AddBoundRow (object element)
5743 // Don't add rows if there are no columns
5744 if (ColumnCount == 0)
5747 DataGridViewRow row = (DataGridViewRow)RowTemplateFull;
5748 rows.InternalAdd (row);
5750 PropertyDescriptorCollection properties = TypeDescriptor.GetProperties (element);
5752 foreach (PropertyDescriptor property in properties) {
5753 if (property.PropertyType == typeof (IBindingList))
5756 // We do it this way because there may not be a column
5757 // for every cell, ignore cells with no column
5758 DataGridViewCell cell = row.Cells.GetBoundCell (property.Name);
5763 cell.valuex = property.GetValue (element);
5764 cell.valueType = property.PropertyType;
5768 private void GenerateColumnsFromType (Type type)
5770 foreach (PropertyDescriptor property in TypeDescriptor.GetProperties (type)) {
5771 // This keeps out things like arrays
5772 if ((typeof(ICollection).IsAssignableFrom (property.PropertyType)))
5775 DataGridViewColumn col = CreateColumnByType (property.PropertyType);
5776 col.Name = property.DisplayName;
5777 col.DataPropertyName = property.DisplayName;
5778 col.ReadOnly = property.IsReadOnly;
5779 col.SetIsDataBound (true);
5780 col.ValueType = property.PropertyType;
5781 col.AutoGenerated = true;
5786 private DataGridViewColumn CreateColumnByType (Type type)
5788 if (type == typeof (bool))
5789 return new DataGridViewCheckBoxColumn ();
5791 return new DataGridViewTextBoxColumn ();
5794 private void ClearBinding ()
5796 columns.ClearAutoGeneratedColumns ();
5798 PrepareEditingRow (false, true);
5800 if (dataSource != null) {
5801 if (dataSource is DataSet) {
5802 (dataSource as DataSet).Tables.CollectionChanged -= OnDataSetTableChanged;
5804 DataTable dt = (dataSource as DataSet).Tables[dataMember];
5807 DataView dv = dt.DefaultView;
5810 (dv as DataView).Table.ColumnChanged -= OnTableColumnChanged;
5811 (dv as DataView).ListChanged -= OnListChanged;
5814 } else if (dataSource is DataView) {
5815 (dataSource as DataView).ListChanged -= OnListChanged;
5816 (dataSource as DataView).Table.ColumnChanged -= OnTableColumnChanged;
5817 } else if (dataSource is DataTable)
5818 ((dataSource as IListSource).GetList () as DataView).ListChanged -= OnListChanged;
5822 private void DoBinding ()
5824 /* 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:
5825 - the System.Collections.IList interface, including one-dimensional arrays.
5826 - the System.ComponentModel.IListSource interface, such as the System.Data.DataTable and System.Data.DataSet classes.
5827 - the System.ComponentModel.IBindingList interface, such as the System.ComponentModel.Collections.BindingList<> class.
5828 - the System.ComponentModel.IBindingListView interface, such as the System.Windows.Forms.BindingSource class.
5831 if (dataSource != null) {
5832 object value = dataSource;
5835 if (value is DataSet && string.IsNullOrEmpty (dataMember)) {
5839 if (value is DataSet) {
5840 (value as DataSet).Tables.CollectionChanged += OnDataSetTableChanged;
5841 value = (value as DataSet).Tables[dataMember];
5843 if (value is BindingSource)
5844 value = (value as BindingSource).List;
5847 BindIList (value as IList);
5848 else if (value is IListSource)
5849 BindIListSource (value as IListSource);
5850 else if (value is IBindingList)
5851 BindIBindingList (value as IBindingList);
5852 else if (value is IBindingListView)
5853 BindIBindingListView (value as IBindingListView);
5855 OnDataBindingComplete (new DataGridViewBindingCompleteEventArgs (ListChangedType.Reset));
5861 private void BindIListSource (IListSource list) {
5862 BindIList(list.GetList());
5865 private void BindIBindingList (IBindingList list) {
5869 private void BindIBindingListView (IBindingListView list) {
5873 private void MoveCurrentCell (int x, int y, bool select, bool isControl, bool isShift, bool scroll)
5875 bool full_row_selected = Rows.SharedRow(CurrentCellAddress.Y).Selected;
5876 bool full_col_selected = Columns[CurrentCellAddress.X].Selected;
5879 DataGridViewSelectionMode mode = selectionMode;
5881 // If we are row header select and we clicked a row header, use full row
5882 if (mode == DataGridViewSelectionMode.RowHeaderSelect && (x == -1 || (full_row_selected && CurrentCellAddress.X == x)))
5883 mode = DataGridViewSelectionMode.FullRowSelect;
5884 else if (mode == DataGridViewSelectionMode.RowHeaderSelect)
5885 mode = DataGridViewSelectionMode.CellSelect;
5887 // If we are col header select and we clicked a col header, use full col
5888 if (mode == DataGridViewSelectionMode.ColumnHeaderSelect && (y == -1 || (full_col_selected && CurrentCellAddress.Y == y)))
5889 mode = DataGridViewSelectionMode.FullColumnSelect;
5890 else if (mode == DataGridViewSelectionMode.ColumnHeaderSelect)
5891 mode = DataGridViewSelectionMode.CellSelect;
5893 // End edit if the old cell was editing, and fire CellLeave for the old cell
5894 if (currentCell != null) {
5895 OnCellLeave (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
5897 if (currentCell.IsInEditMode)
5902 SetCurrentCellAddressCore (x, y, true, false, false);
5904 // If the current cell isn't visible, scroll to it
5906 int disp_x = ColumnIndexToDisplayIndex (x);
5908 if (disp_x < first_col_index) {
5912 delta_x = horizontalScrollBar.Value;
5914 for (int i = disp_x; i < first_col_index; i++)
5915 delta_x += Columns[ColumnDisplayIndexToIndex (i)].Width;
5917 horizontalScrollBar.SafeValueSet (horizontalScrollBar.Value - delta_x);
5918 OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
5923 if (disp_y < first_row_index) {
5927 delta_y = verticalScrollBar.Value;
5929 for (int i = disp_y; i < first_row_index; i++)
5930 delta_y += GetRowInternal (i).Height;
5932 verticalScrollBar.SafeValueSet (verticalScrollBar.Value - delta_y);
5933 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
5934 } else if (disp_y > first_row_index + DisplayedRowCount (false) - 2) {
5937 if (disp_y == Rows.Count - 1)
5938 delta_y = verticalScrollBar.Maximum - verticalScrollBar.Value;
5940 for (int i = first_row_index + DisplayedRowCount (false) - 2; i < disp_y; i++)
5941 delta_y += GetRowInternal (i).Height;
5943 verticalScrollBar.SafeValueSet (verticalScrollBar.Value + delta_y);
5944 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
5951 // Clear old selection unless multi-selecting
5956 case DataGridViewSelectionMode.CellSelect:
5957 SetSelectedCellCore (x, y, true);
5959 case DataGridViewSelectionMode.FullRowSelect:
5960 SetSelectedRowCore (y, true);
5962 case DataGridViewSelectionMode.FullColumnSelect:
5963 SetSelectedColumnCore (x, true);
5968 OnCellEnter (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
5973 private int ColumnIndexToDisplayIndex (int index)
5975 return Columns[index].DisplayIndex;
5978 private int ColumnDisplayIndexToIndex (int index)
5980 return Columns.ColumnDisplayIndexSortedArrayList[index].Index;
5983 private void OnListChanged (object sender, ListChangedEventArgs args)
5985 switch (args.ListChangedType) {
5986 case ListChangedType.ItemAdded:
5987 AddBoundRow ((sender as DataView)[args.NewIndex]);
5989 case ListChangedType.ItemDeleted:
5990 Rows.RemoveAt (args.NewIndex);
5997 private void OnTableColumnChanged (object sender, DataColumnChangeEventArgs e)
6003 private void OnDataSetTableChanged (object sender, CollectionChangeEventArgs e)
6009 private bool MouseOverColumnResize (int col, int mousex)
6011 if (!allowUserToResizeColumns)
6014 Rectangle col_bounds = GetCellDisplayRectangle (col, 0, false);
6016 if (mousex >= col_bounds.Right - 4 && mousex <= col_bounds.Right)
6022 private bool MouseOverRowResize (int row, int mousey)
6024 if (!allowUserToResizeRows)
6027 Rectangle row_bounds = GetCellDisplayRectangle (0, row, false);
6029 if (mousey >= row_bounds.Bottom - 4 && mousey <= row_bounds.Bottom)
6035 private void DrawVerticalResizeLine (int x)
6037 Rectangle splitter = new Rectangle (x, Bounds.Y + 3 + (ColumnHeadersVisible ? ColumnHeadersHeight : 0), 1, Bounds.Height - 3 - (ColumnHeadersVisible ? ColumnHeadersHeight : 0));
6038 XplatUI.DrawReversibleRectangle (Handle, splitter, 2);
6041 private void DrawHorizontalResizeLine (int y)
6043 Rectangle splitter = new Rectangle (Bounds.X + 3 + (RowHeadersVisible ? RowHeadersWidth : 0), y, Bounds.Width - 3 + (RowHeadersVisible ? RowHeadersWidth : 0), 1);
6044 XplatUI.DrawReversibleRectangle (Handle, splitter, 2);
6047 #region Stuff for ToolTips
6048 private void MouseEnteredErrorIcon (DataGridViewCell item)
6050 tooltip_currently_showing = item;
6051 ToolTipTimer.Start ();
6054 private void MouseLeftErrorIcon (DataGridViewCell item)
6056 ToolTipTimer.Stop ();
6057 ToolTipWindow.Hide (this);
6058 tooltip_currently_showing = null;
6061 private Timer ToolTipTimer {
6063 if (tooltip_timer == null) {
6064 tooltip_timer = new Timer ();
6065 tooltip_timer.Enabled = false;
6066 tooltip_timer.Interval = 500;
6067 tooltip_timer.Tick += new EventHandler (ToolTipTimer_Tick);
6070 return tooltip_timer;
6074 private ToolTip ToolTipWindow {
6076 if (tooltip_window == null)
6077 tooltip_window = new ToolTip ();
6079 return tooltip_window;
6083 private void ToolTipTimer_Tick (object o, EventArgs args)
6085 string tooltip = tooltip_currently_showing.ErrorText;
6087 if (!string.IsNullOrEmpty (tooltip))
6088 ToolTipWindow.Present (this, tooltip);
6090 ToolTipTimer.Stop ();
6094 private class ColumnSorter : IComparer
6100 public ColumnSorter (DataGridViewColumn column, ListSortDirection direction, bool numeric)
6102 this.column = column.Index;
6103 this.numeric_sort = numeric;
6105 if (direction == ListSortDirection.Descending)
6106 this.direction = -1;
6109 #region IComparer Members
6110 public int Compare (object x, object y)
6112 DataGridViewRow row1 = (DataGridViewRow)x;
6113 DataGridViewRow row2 = (DataGridViewRow)y;
6115 if (row1.Cells[column].ValueType == typeof (DateTime) && row2.Cells[column].ValueType == typeof (DateTime))
6116 return DateTime.Compare ((DateTime)row1.Cells[column].valuex, (DateTime)row2.Cells[column].valuex) * direction;
6118 object val1 = row1.Cells[column].FormattedValue;
6119 object val2 = row2.Cells[column].FormattedValue;
6121 if (val1 == null && val2 == null)
6126 return -1 * direction;
6129 return (int)(double.Parse (val1.ToString ()) - double.Parse (val2.ToString ())) * direction;
6131 return string.Compare (val1.ToString (), val2.ToString ()) * direction;
6136 public sealed class HitTestInfo {
6138 public static readonly HitTestInfo Nowhere = new HitTestInfo(-1, -1, -1, -1, DataGridViewHitTestType.None);
6140 private int columnIndex;
6141 private int columnX;
6142 private int rowIndex;
6144 private DataGridViewHitTestType type;
6146 internal HitTestInfo (int columnIndex, int columnX, int rowIndex, int rowY, DataGridViewHitTestType type) {
6147 this.columnIndex = columnIndex;
6148 this.columnX = columnX;
6149 this.rowIndex = rowIndex;
6154 public int ColumnIndex {
6155 get { return columnIndex; }
6158 public int ColumnX {
6159 get { return columnX; }
6162 public int RowIndex {
6163 get { return rowIndex; }
6167 get { return rowY; }
6170 public DataGridViewHitTestType Type {
6171 get { return type; }
6174 public override bool Equals (object value) {
6175 if (value is HitTestInfo) {
6176 HitTestInfo aux = (HitTestInfo) value;
6177 if (aux.columnIndex == columnIndex && aux.columnX == columnX && aux.rowIndex == rowIndex && aux.rowY == rowY && aux.type == type) {
6184 public override int GetHashCode () {
6185 return base.GetHashCode();
6188 public override string ToString () {
6189 return string.Format ("Type:{0}, Column:{1}, Row:{2}", type, columnIndex, rowIndex);
6194 [ComVisible (false)]
6195 public class DataGridViewControlCollection : Control.ControlCollection
6197 private DataGridView owner;
6199 public DataGridViewControlCollection (DataGridView owner) : base (owner)
6204 public override void Clear ()
6207 // This is severely buggy, just as MS' implementation is.
6209 for (int i = 0; i < Count; i++) {
6214 public void CopyTo (Control [] array, int index)
6216 base.CopyTo (array, index);
6219 public void Insert (int index, Control value)
6221 throw new NotSupportedException ();
6224 public override void Remove (Control value)
6226 if (value == owner.horizontalScrollBar)
6229 if (value == owner.verticalScrollBar)
6232 if (value == owner.editingControl)
6235 base.Remove (value);
6238 internal void RemoveInternal (Control value)
6240 base.Remove (value);
6246 [ComVisibleAttribute(true)]
6247 protected class DataGridViewAccessibleObject : ControlAccessibleObject {
6249 public DataGridViewAccessibleObject (DataGridView owner) : base (owner){
6252 public override AccessibleRole Role {
6253 get { return base.Role; }
6256 public override string Name {
6257 get { return base.Name; }
6260 public override AccessibleObject GetChild (int index) {
6261 return base.GetChild(index);
6264 public override int GetChildCount () {
6265 return base.GetChildCount();
6268 public override AccessibleObject GetFocused () {
6269 return base.GetFocused();
6272 public override AccessibleObject GetSelected () {
6273 return base.GetSelected();
6276 public override AccessibleObject HitTest (int x, int y) {
6277 return base.HitTest(x, y);
6280 public override AccessibleObject Navigate( AccessibleNavigation navigationDirection) {
6281 return base.Navigate(navigationDirection);
6287 protected class DataGridViewTopRowAccessibleObject : AccessibleObject
6289 #region Constructors
6290 public DataGridViewTopRowAccessibleObject ()
6294 public DataGridViewTopRowAccessibleObject (DataGridView owner)
6300 #region Public Methods
6301 public override AccessibleObject GetChild (int index)
6303 return base.GetChild (index);
6306 public override int GetChildCount ()
6308 return base.GetChildCount ();
6311 public override AccessibleObject Navigate (AccessibleNavigation navigationDirection)
6313 return base.Navigate (navigationDirection);
6317 #region Public Properties
6318 public override Rectangle Bounds {
6319 get { return base.Bounds; }
6322 public override string Name {
6323 get { return base.Name; }
6326 public DataGridView Owner {
6327 get { return (DataGridView)owner; }
6330 throw new InvalidOperationException ("owner has already been set");
6336 public override AccessibleObject Parent {
6337 get { return base.Parent; }
6340 public override AccessibleRole Role {
6341 get { return base.Role; }
6344 public override string Value {
6345 get { return base.Value; }