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;
121 // These are used to implement selection behaviour with SHIFT pressed.
122 private int selected_row = -1;
123 private int selected_column = -1;
125 // Stuff for error Tooltips
126 private Timer tooltip_timer;
127 private ToolTip tooltip_window;
128 private DataGridViewCell tooltip_currently_showing;
130 private DataGridViewSelectedRowCollection selected_rows;
131 private DataGridViewSelectedColumnCollection selected_columns;
132 private DataGridViewRow editing_row;
134 private int gridWidth;
135 private int gridHeight;
137 DataGridViewHeaderCell pressed_header_cell;
138 DataGridViewHeaderCell entered_header_cell;
140 public DataGridView ()
142 SetStyle (ControlStyles.Opaque, true);
143 //SetStyle (ControlStyles.UserMouse, true);
144 SetStyle (ControlStyles.OptimizedDoubleBuffer, true);
146 adjustedTopLeftHeaderBorderStyle = new DataGridViewAdvancedBorderStyle();
147 adjustedTopLeftHeaderBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
148 advancedCellBorderStyle = new DataGridViewAdvancedBorderStyle();
149 advancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
150 advancedColumnHeadersBorderStyle = new DataGridViewAdvancedBorderStyle();
151 advancedColumnHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
152 advancedRowHeadersBorderStyle = new DataGridViewAdvancedBorderStyle();
153 advancedRowHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
154 alternatingRowsDefaultCellStyle = new DataGridViewCellStyle();
155 allowUserToAddRows = true;
156 allowUserToDeleteRows = true;
157 allowUserToOrderColumns = false;
158 allowUserToResizeColumns = true;
159 allowUserToResizeRows = true;
160 autoGenerateColumns = true;
161 autoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
162 autoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
163 backColor = Control.DefaultBackColor;
164 backgroundColor = SystemColors.AppWorkspace;
165 borderStyle = BorderStyle.FixedSingle;
166 cellBorderStyle = DataGridViewCellBorderStyle.None;
167 clipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithAutoHeaderText;
168 columnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
169 columnHeadersDefaultCellStyle = new DataGridViewCellStyle();
170 columnHeadersDefaultCellStyle.BackColor = SystemColors.Control;
171 columnHeadersDefaultCellStyle.ForeColor = SystemColors.WindowText;
172 columnHeadersDefaultCellStyle.SelectionBackColor = SystemColors.Highlight;
173 columnHeadersDefaultCellStyle.SelectionForeColor = SystemColors.HighlightText;
174 columnHeadersDefaultCellStyle.Font = this.Font;
175 columnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
176 columnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.True;
177 columnHeadersHeight = 23;
178 columnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
179 columnHeadersVisible = true;
180 columns = CreateColumnsInstance();
181 columns.CollectionChanged += OnColumnCollectionChanged;
182 dataMember = String.Empty;
183 defaultCellStyle = new DataGridViewCellStyle();
184 defaultCellStyle.BackColor = SystemColors.Window;
185 defaultCellStyle.ForeColor = SystemColors.ControlText;
186 defaultCellStyle.SelectionBackColor = SystemColors.Highlight;
187 defaultCellStyle.SelectionForeColor = SystemColors.HighlightText;
188 defaultCellStyle.Font = this.Font;
189 defaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
190 defaultCellStyle.WrapMode = DataGridViewTriState.False;
191 editMode = DataGridViewEditMode.EditOnKeystrokeOrF2;
194 rowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
195 rowHeadersDefaultCellStyle = (DataGridViewCellStyle) columnHeadersDefaultCellStyle.Clone ();
196 rowHeadersVisible = true;
197 rowHeadersWidth = 41;
198 rowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing;
199 rows = CreateRowsInstance();
200 rowsDefaultCellStyle = new DataGridViewCellStyle();
201 selectionMode = DataGridViewSelectionMode.RowHeaderSelect;
202 showCellErrors = true;
203 showEditingIcon = true;
204 userSetCursor = Cursor.Current;
207 horizontalScrollBar = new HScrollBar();
208 horizontalScrollBar.Scroll += OnHScrollBarScroll;
209 horizontalScrollBar.Visible = false;
211 verticalScrollBar = new VScrollBar();
212 verticalScrollBar.Scroll += OnVScrollBarScroll;
213 verticalScrollBar.Visible = false;
215 Controls.AddRange (new Control[] {horizontalScrollBar, verticalScrollBar});
218 void ISupportInitialize.BeginInit ()
222 void ISupportInitialize.EndInit ()
229 [EditorBrowsable (EditorBrowsableState.Advanced)]
230 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
231 public virtual DataGridViewAdvancedBorderStyle AdjustedTopLeftHeaderBorderStyle {
232 get { return adjustedTopLeftHeaderBorderStyle; }
236 [EditorBrowsable (EditorBrowsableState.Advanced)]
237 public DataGridViewAdvancedBorderStyle AdvancedCellBorderStyle {
238 get { return advancedCellBorderStyle; }
242 [EditorBrowsable (EditorBrowsableState.Advanced)]
243 public DataGridViewAdvancedBorderStyle AdvancedColumnHeadersBorderStyle {
244 get { return advancedColumnHeadersBorderStyle; }
248 [EditorBrowsable (EditorBrowsableState.Advanced)]
249 public DataGridViewAdvancedBorderStyle AdvancedRowHeadersBorderStyle {
250 get { return advancedRowHeadersBorderStyle; }
253 [DefaultValue (true)]
254 public bool AllowUserToAddRows {
255 get { return allowUserToAddRows; }
257 if (allowUserToAddRows != value) {
258 allowUserToAddRows = value;
259 OnAllowUserToAddRowsChanged(EventArgs.Empty);
260 PrepareEditingRow (false, false);
266 [DefaultValue (true)]
267 public bool AllowUserToDeleteRows {
268 get { return allowUserToDeleteRows; }
270 if (allowUserToDeleteRows != value) {
271 allowUserToDeleteRows = value;
272 OnAllowUserToDeleteRowsChanged(EventArgs.Empty);
277 [DefaultValue (false)]
278 public bool AllowUserToOrderColumns {
279 get { return allowUserToOrderColumns; }
281 if (allowUserToOrderColumns != value) {
282 allowUserToOrderColumns = value;
283 OnAllowUserToOrderColumnsChanged(EventArgs.Empty);
288 [DefaultValue (true)]
289 public bool AllowUserToResizeColumns {
290 get { return allowUserToResizeColumns; }
292 if (allowUserToResizeColumns != value) {
293 allowUserToResizeColumns = value;
294 OnAllowUserToResizeColumnsChanged(EventArgs.Empty);
299 [DefaultValue (true)]
300 public bool AllowUserToResizeRows {
301 get { return allowUserToResizeRows; }
303 if (allowUserToResizeRows != value) {
304 allowUserToResizeRows = value;
305 OnAllowUserToResizeRowsChanged(EventArgs.Empty);
310 public DataGridViewCellStyle AlternatingRowsDefaultCellStyle {
311 get { return alternatingRowsDefaultCellStyle; }
313 if (alternatingRowsDefaultCellStyle != value) {
314 alternatingRowsDefaultCellStyle = value;
315 OnAlternatingRowsDefaultCellStyleChanged(EventArgs.Empty);
322 [EditorBrowsable (EditorBrowsableState.Advanced)]
323 [DefaultValue (true)]
324 public bool AutoGenerateColumns {
325 get { return autoGenerateColumns; }
327 if (autoGenerateColumns != value) {
328 autoGenerateColumns = value;
329 OnAutoGenerateColumnsChanged(EventArgs.Empty);
334 public override bool AutoSize {
335 get { return autoSize; }
337 if (autoSize != value) {
339 //OnAutoSizeChanged(EventArgs.Empty);
344 [DefaultValue (DataGridViewAutoSizeColumnsMode.None)]
345 public DataGridViewAutoSizeColumnsMode AutoSizeColumnsMode {
346 get { return autoSizeColumnsMode; }
348 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeColumnsMode), value)) {
349 throw new InvalidEnumArgumentException("Value is not valid DataGridViewAutoSizeColumnsMode.");
351 if (value == DataGridViewAutoSizeColumnsMode.ColumnHeader && columnHeadersVisible == false) {
352 foreach (DataGridViewColumn col in columns) {
353 if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet) {
354 throw new InvalidOperationException("Cant set this property to ColumnHeader in this DataGridView.");
358 if (value == DataGridViewAutoSizeColumnsMode.Fill) {
359 foreach (DataGridViewColumn col in columns) {
360 if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet) {
362 throw new InvalidOperationException("Cant set this property to Fill in this DataGridView.");
368 autoSizeColumnsMode = value;
369 AutoResizeColumns (value);
374 [DefaultValue (DataGridViewAutoSizeRowsMode.None)]
375 public DataGridViewAutoSizeRowsMode AutoSizeRowsMode {
376 get { return autoSizeRowsMode; }
378 if (autoSizeRowsMode != value) {
379 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeRowsMode), value)) {
380 throw new InvalidEnumArgumentException("Value is not valid DataGridViewRowsMode.");
382 if ((value == DataGridViewAutoSizeRowsMode.AllHeaders || value == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && rowHeadersVisible == false) {
383 throw new InvalidOperationException("Cant set this property to AllHeaders or DisplayedHeaders in this DataGridView.");
385 autoSizeRowsMode = value;
386 AutoResizeRows (value);
387 OnAutoSizeRowsModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
389 ////////////////////////////////////////////////////////////////
395 [EditorBrowsable (EditorBrowsableState.Never)]
396 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
397 public override Color BackColor {
398 get { return backColor; }
400 if (backColor != value) {
402 OnBackColorChanged(EventArgs.Empty);
407 public Color BackgroundColor {
408 get { return backgroundColor; }
410 if (backgroundColor != value) {
411 if (value == Color.Empty) {
412 throw new ArgumentException("Cant set an Empty color.");
414 backgroundColor = value;
415 OnBackgroundColorChanged(EventArgs.Empty);
421 [EditorBrowsable (EditorBrowsableState.Never)]
422 public override Image BackgroundImage {
423 get { return backgroundImage; }
425 if (backgroundImage != value) {
426 backgroundImage = value;
427 OnBackgroundImageChanged(EventArgs.Empty);
433 [EditorBrowsable (EditorBrowsableState.Never)]
434 public override ImageLayout BackgroundImageLayout {
435 get { return base.BackgroundImageLayout; }
436 set { base.BackgroundImageLayout = value; }
439 [DefaultValue (BorderStyle.FixedSingle)]
440 public BorderStyle BorderStyle {
441 get { return borderStyle; }
443 if (borderStyle != value) {
444 if (!Enum.IsDefined(typeof(BorderStyle), value)) {
445 throw new InvalidEnumArgumentException("Invalid border style.");
448 OnBorderStyleChanged(EventArgs.Empty);
453 internal int BorderWidth {
455 switch (BorderStyle) {
456 case BorderStyle.Fixed3D:
458 case BorderStyle.FixedSingle:
460 case BorderStyle.None:
468 [DefaultValue (DataGridViewCellBorderStyle.Single)]
469 public DataGridViewCellBorderStyle CellBorderStyle {
470 get { return cellBorderStyle; }
472 if (cellBorderStyle != value) {
473 cellBorderStyle = value;
474 OnCellBorderStyleChanged(EventArgs.Empty);
480 [DefaultValue (DataGridViewClipboardCopyMode.EnableWithAutoHeaderText)]
481 public DataGridViewClipboardCopyMode ClipboardCopyMode {
482 get { return clipboardCopyMode; }
483 set { clipboardCopyMode = value; }
487 [EditorBrowsable (EditorBrowsableState.Advanced)]
488 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
490 public int ColumnCount {
491 get { return columns.Count; }
494 throw new ArgumentOutOfRangeException("ColumnCount",
495 "ColumnCount must be >= 0.");
497 if (dataSource != null) {
498 throw new InvalidOperationException("Cant change column count if DataSource is set.");
500 if (value < columns.Count) {
501 for (int i = value; i < columns.Count; i++) {
505 else if (value > columns.Count) {
506 for (int i = 0; i < value; i++) {
507 DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn ();
515 [DefaultValue (DataGridViewHeaderBorderStyle.Raised)]
516 public DataGridViewHeaderBorderStyle ColumnHeadersBorderStyle {
517 get { return columnHeadersBorderStyle; }
519 if (columnHeadersBorderStyle != value) {
520 columnHeadersBorderStyle = value;
521 OnColumnHeadersBorderStyleChanged(EventArgs.Empty);
526 [AmbientValue (null)]
527 public DataGridViewCellStyle ColumnHeadersDefaultCellStyle {
528 get { return columnHeadersDefaultCellStyle; }
530 if (columnHeadersDefaultCellStyle != value) {
531 columnHeadersDefaultCellStyle = value;
532 OnColumnHeadersDefaultCellStyleChanged(EventArgs.Empty);
538 public int ColumnHeadersHeight {
539 get { return columnHeadersHeight; }
541 if (columnHeadersHeight != value) {
543 throw new ArgumentOutOfRangeException("ColumnHeadersHeight",
544 "Column headers height cant be less than 4.");
546 if (value > 32768 ) {
547 throw new ArgumentOutOfRangeException("ColumnHeadersHeight",
548 "Column headers height cannot be more than 32768.");
550 columnHeadersHeight = value;
551 OnColumnHeadersHeightChanged(EventArgs.Empty);
553 if (columnHeadersVisible)
559 [RefreshProperties (RefreshProperties.All)]
560 [DefaultValue (DataGridViewColumnHeadersHeightSizeMode.EnableResizing)]
561 public DataGridViewColumnHeadersHeightSizeMode ColumnHeadersHeightSizeMode {
562 get { return columnHeadersHeightSizeMode; }
564 if (columnHeadersHeightSizeMode != value) {
565 if (!Enum.IsDefined(typeof(DataGridViewColumnHeadersHeightSizeMode), value)) {
566 throw new InvalidEnumArgumentException("Value is not a valid DataGridViewColumnHeadersHeightSizeMode.");
568 columnHeadersHeightSizeMode = value;
569 OnColumnHeadersHeightSizeModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
574 [DefaultValue (true)]
575 public bool ColumnHeadersVisible {
576 get { return columnHeadersVisible; }
578 if (columnHeadersVisible != value) {
579 columnHeadersVisible = value;
585 [MergableProperty (false)]
586 [Editor ("System.Windows.Forms.Design.DataGridViewColumnCollectionEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
587 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
588 public DataGridViewColumnCollection Columns {
589 get { return columns; }
593 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
594 public DataGridViewCell CurrentCell {
595 get { return currentCell; }
597 /////////////////////////////////////////////////////
598 /// *** InvalidOperationException ***
599 /// Changes to the specified cell cannot be committed
600 /// to the data cache, or the new cell is in a hidden
602 /////////////////////////////////////////////////////
603 if (value.DataGridView != this) {
604 throw new ArgumentException("The cell is not in this DataGridView.");
607 currentRow = currentCell.OwningRow;
612 public Point CurrentCellAddress {
613 get { return currentCellAddress; }
617 public DataGridViewRow CurrentRow {
618 get { return currentRow; }
622 [Editor ("System.Windows.Forms.Design.DataMemberListEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
623 public string DataMember {
624 get { return dataMember; }
626 if (dataMember != value) {
630 OnDataMemberChanged(EventArgs.Empty);
637 [RefreshProperties (RefreshProperties.Repaint)]
638 [DefaultValue (null)]
639 [AttributeProvider (typeof (IListSource))]
640 public object DataSource {
641 get { return dataSource; }
643 if (dataSource != value) {
644 /* 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:
645 - the System.Collections.IList interface, including one-dimensional arrays.
646 - the System.ComponentModel.IListSource interface, such as the System.Data.DataTable and System.Data.DataSet classes.
647 - the System.ComponentModel.IBindingList interface, such as the System.ComponentModel.Collections.BindingList<> class.
648 - the System.ComponentModel.IBindingListView interface, such as the System.Windows.Forms.BindingSource class.
650 if (!(value == null || value is IList || value is IListSource || value is IBindingList || value is IBindingListView)) {
651 throw new NotSupportedException("Type cant be binded.");
657 OnDataSourceChanged (EventArgs.Empty);
664 [AmbientValue (null)]
665 public DataGridViewCellStyle DefaultCellStyle {
666 get { return defaultCellStyle; }
668 if (defaultCellStyle != value) {
669 defaultCellStyle = value;
670 OnDefaultCellStyleChanged(EventArgs.Empty);
675 public override Rectangle DisplayRectangle {
676 get { return base.DisplayRectangle; }
680 [EditorBrowsable (EditorBrowsableState.Advanced)]
681 public Control EditingControl {
683 return editingControl;
688 [EditorBrowsable (EditorBrowsableState.Advanced)]
689 public Panel EditingPanel {
690 get { throw new NotImplementedException(); }
693 [DefaultValue (DataGridViewEditMode.EditOnKeystrokeOrF2)]
694 public DataGridViewEditMode EditMode {
695 get { return editMode; }
697 if (editMode != value) {
699 OnEditModeChanged(EventArgs.Empty);
704 [DefaultValue (true)]
705 public bool EnableHeadersVisualStyles {
706 get { return enableHeadersVisualStyles; }
707 set { enableHeadersVisualStyles = value; }
710 internal DataGridViewHeaderCell EnteredHeaderCell {
711 get { return entered_header_cell; }
713 if (entered_header_cell == value)
715 if (ThemeEngine.Current.DataGridViewHeaderCellHasHotStyle (this)) {
716 Region area_to_invalidate = new Region ();
717 area_to_invalidate.MakeEmpty ();
718 if (entered_header_cell != null)
719 area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell));
720 entered_header_cell = value;
721 if (entered_header_cell != null)
722 area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell));
723 Invalidate (area_to_invalidate);
724 area_to_invalidate.Dispose ();
726 entered_header_cell = value;
731 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
732 public DataGridViewCell FirstDisplayedCell {
733 get { return firstDisplayedCell; }
735 if (value.DataGridView != this) {
736 throw new ArgumentException("The cell is not in this DataGridView.");
738 firstDisplayedCell = value;
743 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
744 [EditorBrowsable (EditorBrowsableState.Advanced)]
745 public int FirstDisplayedScrollingColumnHiddenWidth {
746 get { return firstDisplayedScrollingColumnHiddenWidth; }
750 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
751 public int FirstDisplayedScrollingColumnIndex {
752 get { return firstDisplayedScrollingColumnIndex; }
753 set { firstDisplayedScrollingColumnIndex = value; }
757 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
758 public int FirstDisplayedScrollingRowIndex {
759 get { return firstDisplayedScrollingRowIndex; }
760 set { firstDisplayedScrollingRowIndex = value; }
764 [EditorBrowsable (EditorBrowsableState.Advanced)]
765 public override Font Font {
766 get { return base.Font; }
767 set { base.Font = value; }
771 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
772 [EditorBrowsable (EditorBrowsableState.Advanced)]
773 public override Color ForeColor {
774 get { return base.ForeColor; }
775 set { base.ForeColor = value; }
778 public Color GridColor {
779 get { return gridColor; }
781 if (gridColor != value) {
782 if (value == Color.Empty) {
783 throw new ArgumentException("Cant set an Empty color.");
786 OnGridColorChanged(EventArgs.Empty);
792 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
793 public int HorizontalScrollingOffset {
794 get { return horizontalScrollingOffset; }
795 set { horizontalScrollingOffset = value; }
799 public bool IsCurrentCellDirty {
800 get { return isCurrentCellDirty; }
804 public bool IsCurrentCellInEditMode {
806 if (currentCell == null) {
809 return currentCell.IsInEditMode;
814 public bool IsCurrentRowDirty {
817 return IsCurrentCellDirty;
820 throw new NotImplementedException();
825 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
826 public DataGridViewCell this [int columnIndex, int rowIndex] {
827 get { return rows[rowIndex].Cells[columnIndex]; }
828 set { rows[rowIndex].Cells[columnIndex] = value; }
832 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
833 public DataGridViewCell this [string columnName, int rowIndex] {
835 int columnIndex = -1;
836 foreach (DataGridViewColumn col in columns) {
837 if (col.Name == columnName) {
838 columnIndex = col.Index;
842 return this[columnIndex, rowIndex];
845 int columnIndex = -1;
846 foreach (DataGridViewColumn col in columns) {
847 if (col.Name == columnName) {
848 columnIndex = col.Index;
852 this[columnIndex, rowIndex] = value;
856 [DefaultValue (true)]
857 public bool MultiSelect {
858 get { return multiSelect; }
860 if (multiSelect != value) {
862 OnMultiSelectChanged(EventArgs.Empty);
868 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
869 public int NewRowIndex {
871 if (!allowUserToAddRows) {
874 return rows.Count - 1;
879 [EditorBrowsable (EditorBrowsableState.Never)]
880 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
881 public new Padding Padding {
882 get { return Padding.Empty; }
886 internal DataGridViewHeaderCell PressedHeaderCell {
887 get { return pressed_header_cell; }
891 [DefaultValue (false)]
892 public bool ReadOnly {
893 get { return readOnly; }
895 if (readOnly != value) {
897 OnReadOnlyChanged(EventArgs.Empty);
903 [EditorBrowsable (EditorBrowsableState.Advanced)]
904 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
906 public int RowCount {
907 get { return rows.Count; }
910 throw new ArgumentException("RowCount must be >= 0.");
912 if (value < 1 && allowUserToAddRows) {
913 throw new ArgumentException("RowCount must be >= 1 if AllowUserToAddRows is true.");
915 if (dataSource != null) {
916 throw new InvalidOperationException("Cant change row count if DataSource is set.");
918 if (value < rows.Count) {
919 for (int i = value; i < rows.Count; i++) {
923 else if (value > rows.Count) {
924 // If we need to add rows and don't have any columns,
925 // we create one column
926 if (ColumnCount == 0)
929 for (int i = rows.Count; i < value; i++) {
930 DataGridViewRow row = (DataGridViewRow) RowTemplate.Clone ();
931 rows.AddInternal (row, false);
933 foreach (DataGridViewColumn col in columns)
934 row.Cells.Add (col.CellTemplate.Clone () as DataGridViewCell);
941 [DefaultValue (DataGridViewHeaderBorderStyle.Raised)]
942 public DataGridViewHeaderBorderStyle RowHeadersBorderStyle {
943 get { return rowHeadersBorderStyle; }
945 if (rowHeadersBorderStyle != value) {
946 rowHeadersBorderStyle = value;
947 OnRowHeadersBorderStyleChanged(EventArgs.Empty);
952 [AmbientValue (null)]
953 public DataGridViewCellStyle RowHeadersDefaultCellStyle {
954 get { return rowHeadersDefaultCellStyle; }
956 if (rowHeadersDefaultCellStyle != value) {
957 rowHeadersDefaultCellStyle = value;
958 OnRowHeadersDefaultCellStyleChanged(EventArgs.Empty);
963 [DefaultValue (true)]
964 public bool RowHeadersVisible {
965 get { return rowHeadersVisible; }
967 if (rowHeadersVisible != value) {
968 rowHeadersVisible = value;
975 public int RowHeadersWidth {
976 get { return rowHeadersWidth; }
978 if (rowHeadersWidth != value) {
980 throw new ArgumentOutOfRangeException("RowHeadersWidth",
981 "Row headers width cant be less than 4.");
983 if (value > 32768 ) {
984 throw new ArgumentOutOfRangeException("RowHeadersWidth",
985 "Row headers width cannot be more than 32768.");
987 rowHeadersWidth = value;
988 OnRowHeadersWidthChanged(EventArgs.Empty);
990 if (rowHeadersVisible)
996 [RefreshProperties (RefreshProperties.All)]
997 [DefaultValue (DataGridViewRowHeadersWidthSizeMode.EnableResizing)]
998 public DataGridViewRowHeadersWidthSizeMode RowHeadersWidthSizeMode {
999 get { return rowHeadersWidthSizeMode; }
1001 if (rowHeadersWidthSizeMode != value) {
1002 if (!Enum.IsDefined(typeof(DataGridViewRowHeadersWidthSizeMode), value)) {
1003 throw new InvalidEnumArgumentException("Value is not valid DataGridViewRowHeadersWidthSizeMode.");
1005 rowHeadersWidthSizeMode = value;
1006 OnRowHeadersWidthSizeModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
1012 public DataGridViewRowCollection Rows {
1013 get { return rows; }
1016 public DataGridViewCellStyle RowsDefaultCellStyle {
1017 get { return rowsDefaultCellStyle; }
1019 if (rowsDefaultCellStyle != value) {
1020 rowsDefaultCellStyle = value;
1021 OnRowsDefaultCellStyleChanged(EventArgs.Empty);
1027 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
1028 public DataGridViewRow RowTemplate {
1030 if (rowTemplate == null)
1031 rowTemplate = new DataGridViewRow ();
1036 rowTemplate = value;
1037 rowTemplate.SetDataGridView(this);
1041 internal DataGridViewRow RowTemplateFull {
1043 DataGridViewRow row = (DataGridViewRow) RowTemplate.Clone ();
1045 for (int i = row.Cells.Count; i < Columns.Count; i++) {
1046 DataGridViewCell template = columns [i].CellTemplate;
1048 if (template == null)
1049 throw new InvalidOperationException ("At least one of the DataGridView control's columns has no cell template.");
1051 row.Cells.Add ((DataGridViewCell) template.Clone ());
1058 internal override bool ScaleChildrenInternal {
1059 get { return false; }
1062 [DefaultValue (ScrollBars.Both)]
1063 [Localizable (true)]
1064 public ScrollBars ScrollBars {
1065 get { return scrollBars; }
1067 if (!Enum.IsDefined(typeof(ScrollBars), value)) {
1068 throw new InvalidEnumArgumentException("Invalid ScrollBars value.");
1070 ////////////////////////////////////////////////////////////
1071 /// *** InvalidOperationException ***
1072 /// The System.Windows.Forms.DataGridView is unable to
1073 /// scroll due to a cell change that cannot be committed
1075 ///////////////////////////////////////////////////////////
1081 public DataGridViewSelectedCellCollection SelectedCells {
1083 DataGridViewSelectedCellCollection selectedCells = new DataGridViewSelectedCellCollection();
1084 foreach (DataGridViewRow row in rows) {
1085 foreach (DataGridViewCell cell in row.Cells) {
1086 if (cell.Selected) {
1087 selectedCells.InternalAdd(cell);
1091 return selectedCells;
1096 public DataGridViewSelectedColumnCollection SelectedColumns {
1099 DataGridViewSelectedColumnCollection result = new DataGridViewSelectedColumnCollection ();
1101 if (selectionMode != DataGridViewSelectionMode.FullColumnSelect && selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect)
1104 result.InternalAddRange (selected_columns);
1111 public DataGridViewSelectedRowCollection SelectedRows {
1113 DataGridViewSelectedRowCollection result = new DataGridViewSelectedRowCollection (this);
1115 if (selectionMode != DataGridViewSelectionMode.FullRowSelect && selectionMode != DataGridViewSelectionMode.RowHeaderSelect)
1118 result.InternalAddRange (selected_rows);
1125 [DefaultValue (DataGridViewSelectionMode.RowHeaderSelect)]
1126 public DataGridViewSelectionMode SelectionMode {
1127 get { return selectionMode; }
1129 if (!Enum.IsDefined (typeof(DataGridViewSelectionMode), value))
1130 throw new InvalidEnumArgumentException ("Value is not valid DataGridViewSelectionMode.");
1132 if (value == DataGridViewSelectionMode.ColumnHeaderSelect || value == DataGridViewSelectionMode.FullColumnSelect)
1133 foreach (DataGridViewColumn col in Columns)
1134 if (col.SortMode == DataGridViewColumnSortMode.Automatic)
1135 throw new InvalidOperationException (string.Format ("Cannot set SelectionMode to {0} because there are Automatic sort columns.", value));
1137 selectionMode = value;
1141 [DefaultValue (true)]
1142 public bool ShowCellErrors {
1143 get { return showCellErrors; }
1144 set { showCellErrors = value; }
1147 [DefaultValue (true)]
1148 public bool ShowCellToolTips {
1149 get { return showCellToolTips; }
1150 set { showCellToolTips = value; }
1153 [DefaultValue (true)]
1154 public bool ShowEditingIcon {
1155 get { return showEditingIcon; }
1156 set { showEditingIcon = value; }
1159 [DefaultValue (true)]
1160 public bool ShowRowErrors {
1161 get { return showRowErrors; }
1162 set { showRowErrors = value; }
1166 public DataGridViewColumn SortedColumn {
1167 get { return sortedColumn; }
1171 public SortOrder SortOrder {
1172 get { return sortOrder; }
1175 [DefaultValue (false)]
1176 [EditorBrowsable (EditorBrowsableState.Advanced)]
1177 public bool StandardTab {
1178 get { return standardTab; }
1179 set { standardTab = value; }
1184 [EditorBrowsable (EditorBrowsableState.Never)]
1185 public override string Text {
1186 get { return base.Text; }
1187 set { base.Text = value; }
1191 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1192 public DataGridViewHeaderCell TopLeftHeaderCell {
1194 if (topLeftHeaderCell == null) {
1195 topLeftHeaderCell = new DataGridViewTopLeftHeaderCell ();
1196 topLeftHeaderCell.SetDataGridView (this);
1198 return topLeftHeaderCell;
1201 topLeftHeaderCell = value;
1202 topLeftHeaderCell.SetDataGridView (this);
1207 [EditorBrowsable (EditorBrowsableState.Advanced)]
1208 public Cursor UserSetCursor {
1209 get { return userSetCursor; }
1213 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1214 public int VerticalScrollingOffset {
1215 get { return verticalScrollingOffset; }
1218 [EditorBrowsable (EditorBrowsableState.Advanced)]
1219 [DefaultValue (false)]
1220 public bool VirtualMode {
1221 get { return virtualMode; }
1222 set { virtualMode = value; }
1225 internal Control EditingControlInternal {
1227 return editingControl;
1230 if (value == editingControl)
1233 if (editingControl != null) {
1234 // Can't use Controls.Remove (editingControls), because that method
1235 // is overriden to not remove the editing control.
1236 DataGridView.DataGridViewControlCollection ctrls = Controls as DataGridView.DataGridViewControlCollection;
1237 if (ctrls != null) {
1238 ctrls.RemoveInternal (editingControl);
1240 Controls.Remove (editingControl);
1245 if (value != null) {
1246 value.Visible = false;
1247 Controls.Add (value);
1250 editingControl = value;
1254 static object AllowUserToAddRowsChangedEvent = new object ();
1255 static object AllowUserToDeleteRowsChangedEvent = new object ();
1256 static object AllowUserToOrderColumnsChangedEvent = new object ();
1257 static object AllowUserToResizeColumnsChangedEvent = new object ();
1258 static object AllowUserToResizeRowsChangedEvent = new object ();
1259 static object AlternatingRowsDefaultCellStyleChangedEvent = new object ();
1260 static object AutoGenerateColumnsChangedEvent = new object ();
1261 static object AutoSizeColumnModeChangedEvent = new object ();
1262 static object AutoSizeColumnsModeChangedEvent = new object ();
1263 static object AutoSizeRowsModeChangedEvent = new object ();
1264 static object BackgroundColorChangedEvent = new object ();
1265 static object BorderStyleChangedEvent = new object ();
1266 static object CancelRowEditEvent = new object ();
1267 static object CellBeginEditEvent = new object ();
1268 static object CellBorderStyleChangedEvent = new object ();
1269 static object CellClickEvent = new object ();
1270 static object CellContentClickEvent = new object ();
1271 static object CellContentDoubleClickEvent = new object ();
1272 static object CellContextMenuStripChangedEvent = new object ();
1273 static object CellContextMenuStripNeededEvent = new object ();
1274 static object CellDoubleClickEvent = new object ();
1275 static object CellEndEditEvent = new object ();
1276 static object CellEnterEvent = new object ();
1277 static object CellErrorTextChangedEvent = new object ();
1278 static object CellErrorTextNeededEvent = new object ();
1279 static object CellFormattingEvent = new object ();
1280 static object CellLeaveEvent = new object ();
1281 static object CellMouseClickEvent = new object ();
1282 static object CellMouseDoubleClickEvent = new object ();
1283 static object CellMouseDownEvent = new object ();
1284 static object CellMouseEnterEvent = new object ();
1285 static object CellMouseLeaveEvent = new object ();
1286 static object CellMouseMoveEvent = new object ();
1287 static object CellMouseUpEvent = new object ();
1288 static object CellPaintingEvent = new object ();
1289 static object CellParsingEvent = new object ();
1290 static object CellStateChangedEvent = new object ();
1291 static object CellStyleChangedEvent = new object ();
1292 static object CellStyleContentChangedEvent = new object ();
1293 static object CellToolTipTextChangedEvent = new object ();
1294 static object CellToolTipTextNeededEvent = new object ();
1295 static object CellValidatedEvent = new object ();
1296 static object CellValidatingEvent = new object ();
1297 static object CellValueChangedEvent = new object ();
1298 static object CellValueNeededEvent = new object ();
1299 static object CellValuePushedEvent = new object ();
1300 static object ColumnAddedEvent = new object ();
1301 static object ColumnContextMenuStripChangedEvent = new object ();
1302 static object ColumnDataPropertyNameChangedEvent = new object ();
1303 static object ColumnDefaultCellStyleChangedEvent = new object ();
1304 static object ColumnDisplayIndexChangedEvent = new object ();
1305 static object ColumnDividerDoubleClickEvent = new object ();
1306 static object ColumnDividerWidthChangedEvent = new object ();
1307 static object ColumnHeaderCellChangedEvent = new object ();
1308 static object ColumnHeaderMouseClickEvent = new object ();
1309 static object ColumnHeaderMouseDoubleClickEvent = new object ();
1310 static object ColumnHeadersBorderStyleChangedEvent = new object ();
1311 static object ColumnHeadersDefaultCellStyleChangedEvent = new object ();
1312 static object ColumnHeadersHeightChangedEvent = new object ();
1313 static object ColumnHeadersHeightSizeModeChangedEvent = new object ();
1314 static object ColumnMinimumWidthChangedEvent = new object ();
1315 static object ColumnNameChangedEvent = new object ();
1316 static object ColumnRemovedEvent = new object ();
1317 static object ColumnSortModeChangedEvent = new object ();
1318 static object ColumnStateChangedEvent = new object ();
1319 static object ColumnToolTipTextChangedEvent = new object ();
1320 static object ColumnWidthChangedEvent = new object ();
1321 static object CurrentCellChangedEvent = new object ();
1322 static object CurrentCellDirtyStateChangedEvent = new object ();
1323 static object DataBindingCompleteEvent = new object ();
1324 static object DataErrorEvent = new object ();
1325 static object DataMemberChangedEvent = new object ();
1326 static object DataSourceChangedEvent = new object ();
1327 static object DefaultCellStyleChangedEvent = new object ();
1328 static object DefaultValuesNeededEvent = new object ();
1329 static object EditingControlShowingEvent = new object ();
1330 static object EditModeChangedEvent = new object ();
1331 static object GridColorChangedEvent = new object ();
1332 static object MultiSelectChangedEvent = new object ();
1333 static object NewRowNeededEvent = new object ();
1334 static object ReadOnlyChangedEvent = new object ();
1335 static object RowContextMenuStripChangedEvent = new object ();
1336 static object RowContextMenuStripNeededEvent = new object ();
1337 static object RowDefaultCellStyleChangedEvent = new object ();
1338 static object RowDirtyStateNeededEvent = new object ();
1339 static object RowDividerDoubleClickEvent = new object ();
1340 static object RowDividerHeightChangedEvent = new object ();
1341 static object RowEnterEvent = new object ();
1342 static object RowErrorTextChangedEvent = new object ();
1343 static object RowErrorTextNeededEvent = new object ();
1344 static object RowHeaderCellChangedEvent = new object ();
1345 static object RowHeaderMouseClickEvent = new object ();
1346 static object RowHeaderMouseDoubleClickEvent = new object ();
1347 static object RowHeadersBorderStyleChangedEvent = new object ();
1348 static object RowHeadersDefaultCellStyleChangedEvent = new object ();
1349 static object RowHeadersWidthChangedEvent = new object ();
1350 static object RowHeadersWidthSizeModeChangedEvent = new object ();
1351 static object RowHeightChangedEvent = new object ();
1352 static object RowHeightInfoNeededEvent = new object ();
1353 static object RowHeightInfoPushedEvent = new object ();
1354 static object RowLeaveEvent = new object ();
1355 static object RowMinimumHeightChangedEvent = new object ();
1356 static object RowPostPaintEvent = new object ();
1357 static object RowPrePaintEvent = new object ();
1358 static object RowsAddedEvent = new object ();
1359 static object RowsDefaultCellStyleChangedEvent = new object ();
1360 static object RowsRemovedEvent = new object ();
1361 static object RowStateChangedEvent = new object ();
1362 static object RowUnsharedEvent = new object ();
1363 static object RowValidatedEvent = new object ();
1364 static object RowValidatingEvent = new object ();
1365 static object ScrollEvent = new object ();
1366 static object SelectionChangedEvent = new object ();
1367 static object SortCompareEvent = new object ();
1368 static object SortedEvent = new object ();
1369 static object UserAddedRowEvent = new object ();
1370 static object UserDeletedRowEvent = new object ();
1371 static object UserDeletingRowEvent = new object ();
1376 public event EventHandler AllowUserToAddRowsChanged {
1377 add { Events.AddHandler (AllowUserToAddRowsChangedEvent, value); }
1378 remove { Events.RemoveHandler (AllowUserToAddRowsChangedEvent, value); }
1381 public event EventHandler AllowUserToDeleteRowsChanged {
1382 add { Events.AddHandler (AllowUserToDeleteRowsChangedEvent, value); }
1383 remove { Events.RemoveHandler (AllowUserToDeleteRowsChangedEvent, value); }
1386 public event EventHandler AllowUserToOrderColumnsChanged {
1387 add { Events.AddHandler (AllowUserToOrderColumnsChangedEvent, value); }
1388 remove { Events.RemoveHandler (AllowUserToOrderColumnsChangedEvent, value); }
1391 public event EventHandler AllowUserToResizeColumnsChanged {
1392 add { Events.AddHandler (AllowUserToResizeColumnsChangedEvent, value); }
1393 remove { Events.RemoveHandler (AllowUserToResizeColumnsChangedEvent, value); }
1396 public event EventHandler AllowUserToResizeRowsChanged {
1397 add { Events.AddHandler (AllowUserToResizeRowsChangedEvent, value); }
1398 remove { Events.RemoveHandler (AllowUserToResizeRowsChangedEvent, value); }
1401 public event EventHandler AlternatingRowsDefaultCellStyleChanged {
1402 add { Events.AddHandler (AlternatingRowsDefaultCellStyleChangedEvent, value); }
1403 remove { Events.RemoveHandler (AlternatingRowsDefaultCellStyleChangedEvent, value); }
1407 [EditorBrowsable (EditorBrowsableState.Advanced)]
1408 public event EventHandler AutoGenerateColumnsChanged {
1409 add { Events.AddHandler (AutoGenerateColumnsChangedEvent, value); }
1410 remove { Events.RemoveHandler (AutoGenerateColumnsChangedEvent, value); }
1413 public event DataGridViewAutoSizeColumnModeEventHandler AutoSizeColumnModeChanged {
1414 add { Events.AddHandler (AutoSizeColumnModeChangedEvent, value); }
1415 remove { Events.RemoveHandler (AutoSizeColumnModeChangedEvent, value); }
1418 public event DataGridViewAutoSizeColumnsModeEventHandler AutoSizeColumnsModeChanged {
1419 add { Events.AddHandler (AutoSizeColumnsModeChangedEvent, value); }
1420 remove { Events.RemoveHandler (AutoSizeColumnsModeChangedEvent, value); }
1423 public event DataGridViewAutoSizeModeEventHandler AutoSizeRowsModeChanged {
1424 add { Events.AddHandler (AutoSizeRowsModeChangedEvent, value); }
1425 remove { Events.RemoveHandler (AutoSizeRowsModeChangedEvent, value); }
1429 [EditorBrowsable (EditorBrowsableState.Never)]
1430 public new event EventHandler BackColorChanged {
1431 add { base.BackColorChanged += value; }
1432 remove { base.BackColorChanged -= value; }
1435 public event EventHandler BackgroundColorChanged {
1436 add { Events.AddHandler (BackgroundColorChangedEvent, value); }
1437 remove { Events.RemoveHandler (BackgroundColorChangedEvent, value); }
1441 [EditorBrowsable (EditorBrowsableState.Never)]
1442 public new event EventHandler BackgroundImageChanged {
1443 add { base.BackgroundImageChanged += value; }
1444 remove { base.BackgroundImageChanged -= value; }
1448 [EditorBrowsable (EditorBrowsableState.Never)]
1449 public new event EventHandler BackgroundImageLayoutChanged {
1450 add { base.BackgroundImageLayoutChanged += value; }
1451 remove { base.BackgroundImageLayoutChanged -= value; }
1454 public event EventHandler BorderStyleChanged {
1455 add { Events.AddHandler (BorderStyleChangedEvent, value); }
1456 remove { Events.RemoveHandler (BorderStyleChangedEvent, value); }
1459 public event QuestionEventHandler CancelRowEdit {
1460 add { Events.AddHandler (CancelRowEditEvent, value); }
1461 remove { Events.RemoveHandler (CancelRowEditEvent, value); }
1464 public event DataGridViewCellCancelEventHandler CellBeginEdit {
1465 add { Events.AddHandler (CellBeginEditEvent, value); }
1466 remove { Events.RemoveHandler (CellBeginEditEvent, value); }
1469 public event EventHandler CellBorderStyleChanged {
1470 add { Events.AddHandler (CellBorderStyleChangedEvent, value); }
1471 remove { Events.RemoveHandler (CellBorderStyleChangedEvent, value); }
1474 public event DataGridViewCellEventHandler CellClick {
1475 add { Events.AddHandler (CellClickEvent, value); }
1476 remove { Events.RemoveHandler (CellClickEvent, value); }
1479 public event DataGridViewCellEventHandler CellContentClick {
1480 add { Events.AddHandler (CellContentClickEvent, value); }
1481 remove { Events.RemoveHandler (CellContentClickEvent, value); }
1484 public event DataGridViewCellEventHandler CellContentDoubleClick {
1485 add { Events.AddHandler (CellContentDoubleClickEvent, value); }
1486 remove { Events.RemoveHandler (CellContentDoubleClickEvent, value); }
1489 [EditorBrowsable (EditorBrowsableState.Advanced)]
1490 public event DataGridViewCellEventHandler CellContextMenuStripChanged {
1491 add { Events.AddHandler (CellContextMenuStripChangedEvent, value); }
1492 remove { Events.RemoveHandler (CellContextMenuStripChangedEvent, value); }
1495 [EditorBrowsable (EditorBrowsableState.Advanced)]
1496 public event DataGridViewCellContextMenuStripNeededEventHandler CellContextMenuStripNeeded {
1497 add { Events.AddHandler (CellContextMenuStripNeededEvent, value); }
1498 remove { Events.RemoveHandler (CellContextMenuStripNeededEvent, value); }
1501 public event DataGridViewCellEventHandler CellDoubleClick {
1502 add { Events.AddHandler (CellDoubleClickEvent, value); }
1503 remove { Events.RemoveHandler (CellDoubleClickEvent, value); }
1506 public event DataGridViewCellEventHandler CellEndEdit {
1507 add { Events.AddHandler (CellEndEditEvent, value); }
1508 remove { Events.RemoveHandler (CellEndEditEvent, value); }
1511 public event DataGridViewCellEventHandler CellEnter {
1512 add { Events.AddHandler (CellEnterEvent, value); }
1513 remove { Events.RemoveHandler (CellEnterEvent, value); }
1516 public event DataGridViewCellEventHandler CellErrorTextChanged {
1517 add { Events.AddHandler (CellErrorTextChangedEvent, value); }
1518 remove { Events.RemoveHandler (CellErrorTextChangedEvent, value); }
1521 [EditorBrowsable (EditorBrowsableState.Advanced)]
1522 public event DataGridViewCellErrorTextNeededEventHandler CellErrorTextNeeded {
1523 add { Events.AddHandler (CellErrorTextNeededEvent, value); }
1524 remove { Events.RemoveHandler (CellErrorTextNeededEvent, value); }
1527 public event DataGridViewCellFormattingEventHandler CellFormatting {
1528 add { Events.AddHandler (CellFormattingEvent, value); }
1529 remove { Events.RemoveHandler (CellFormattingEvent, value); }
1532 public event DataGridViewCellEventHandler CellLeave {
1533 add { Events.AddHandler (CellLeaveEvent, value); }
1534 remove { Events.RemoveHandler (CellLeaveEvent, value); }
1537 public event DataGridViewCellMouseEventHandler CellMouseClick {
1538 add { Events.AddHandler (CellMouseClickEvent, value); }
1539 remove { Events.RemoveHandler (CellMouseClickEvent, value); }
1542 public event DataGridViewCellMouseEventHandler CellMouseDoubleClick {
1543 add { Events.AddHandler (CellMouseDoubleClickEvent, value); }
1544 remove { Events.RemoveHandler (CellMouseDoubleClickEvent, value); }
1547 public event DataGridViewCellMouseEventHandler CellMouseDown {
1548 add { Events.AddHandler (CellMouseDownEvent, value); }
1549 remove { Events.RemoveHandler (CellMouseDownEvent, value); }
1552 public event DataGridViewCellEventHandler CellMouseEnter {
1553 add { Events.AddHandler (CellMouseEnterEvent, value); }
1554 remove { Events.RemoveHandler (CellMouseEnterEvent, value); }
1557 public event DataGridViewCellEventHandler CellMouseLeave {
1558 add { Events.AddHandler (CellMouseLeaveEvent, value); }
1559 remove { Events.RemoveHandler (CellMouseLeaveEvent, value); }
1562 public event DataGridViewCellMouseEventHandler CellMouseMove {
1563 add { Events.AddHandler (CellMouseMoveEvent, value); }
1564 remove { Events.RemoveHandler (CellMouseMoveEvent, value); }
1567 public event DataGridViewCellMouseEventHandler CellMouseUp {
1568 add { Events.AddHandler (CellMouseUpEvent, value); }
1569 remove { Events.RemoveHandler (CellMouseUpEvent, value); }
1572 public event DataGridViewCellPaintingEventHandler CellPainting {
1573 add { Events.AddHandler (CellPaintingEvent, value); }
1574 remove { Events.RemoveHandler (CellPaintingEvent, value); }
1577 public event DataGridViewCellParsingEventHandler CellParsing {
1578 add { Events.AddHandler (CellParsingEvent, value); }
1579 remove { Events.RemoveHandler (CellParsingEvent, value); }
1582 public event DataGridViewCellStateChangedEventHandler CellStateChanged {
1583 add { Events.AddHandler (CellStateChangedEvent, value); }
1584 remove { Events.RemoveHandler (CellStateChangedEvent, value); }
1587 public event DataGridViewCellEventHandler CellStyleChanged {
1588 add { Events.AddHandler (CellStyleChangedEvent, value); }
1589 remove { Events.RemoveHandler (CellStyleChangedEvent, value); }
1592 public event DataGridViewCellStyleContentChangedEventHandler CellStyleContentChanged {
1593 add { Events.AddHandler (CellStyleContentChangedEvent, value); }
1594 remove { Events.RemoveHandler (CellStyleContentChangedEvent, value); }
1597 public event DataGridViewCellEventHandler CellToolTipTextChanged {
1598 add { Events.AddHandler (CellToolTipTextChangedEvent, value); }
1599 remove { Events.RemoveHandler (CellToolTipTextChangedEvent, value); }
1602 [EditorBrowsable (EditorBrowsableState.Advanced)]
1603 public event DataGridViewCellToolTipTextNeededEventHandler CellToolTipTextNeeded {
1604 add { Events.AddHandler (CellToolTipTextNeededEvent, value); }
1605 remove { Events.RemoveHandler (CellToolTipTextNeededEvent, value); }
1608 public event DataGridViewCellEventHandler CellValidated {
1609 add { Events.AddHandler (CellValidatedEvent, value); }
1610 remove { Events.RemoveHandler (CellValidatedEvent, value); }
1613 public event DataGridViewCellValidatingEventHandler CellValidating {
1614 add { Events.AddHandler (CellValidatingEvent, value); }
1615 remove { Events.RemoveHandler (CellValidatingEvent, value); }
1618 public event DataGridViewCellEventHandler CellValueChanged {
1619 add { Events.AddHandler (CellValueChangedEvent, value); }
1620 remove { Events.RemoveHandler (CellValueChangedEvent, value); }
1623 [EditorBrowsable (EditorBrowsableState.Advanced)]
1624 public event DataGridViewCellValueEventHandler CellValueNeeded {
1625 add { Events.AddHandler (CellValueNeededEvent, value); }
1626 remove { Events.RemoveHandler (CellValueNeededEvent, value); }
1629 [EditorBrowsable (EditorBrowsableState.Advanced)]
1630 public event DataGridViewCellValueEventHandler CellValuePushed {
1631 add { Events.AddHandler (CellValuePushedEvent, value); }
1632 remove { Events.RemoveHandler (CellValuePushedEvent, value); }
1635 public event DataGridViewColumnEventHandler ColumnAdded {
1636 add { Events.AddHandler (ColumnAddedEvent, value); }
1637 remove { Events.RemoveHandler (ColumnAddedEvent, value); }
1640 public event DataGridViewColumnEventHandler ColumnContextMenuStripChanged {
1641 add { Events.AddHandler (ColumnContextMenuStripChangedEvent, value); }
1642 remove { Events.RemoveHandler (ColumnContextMenuStripChangedEvent, value); }
1645 public event DataGridViewColumnEventHandler ColumnDataPropertyNameChanged {
1646 add { Events.AddHandler (ColumnDataPropertyNameChangedEvent, value); }
1647 remove { Events.RemoveHandler (ColumnDataPropertyNameChangedEvent, value); }
1650 public event DataGridViewColumnEventHandler ColumnDefaultCellStyleChanged {
1651 add { Events.AddHandler (ColumnDefaultCellStyleChangedEvent, value); }
1652 remove { Events.RemoveHandler (ColumnDefaultCellStyleChangedEvent, value); }
1655 public event DataGridViewColumnEventHandler ColumnDisplayIndexChanged {
1656 add { Events.AddHandler (ColumnDisplayIndexChangedEvent, value); }
1657 remove { Events.RemoveHandler (ColumnDisplayIndexChangedEvent, value); }
1660 public event DataGridViewColumnDividerDoubleClickEventHandler ColumnDividerDoubleClick {
1661 add { Events.AddHandler (ColumnDividerDoubleClickEvent, value); }
1662 remove { Events.RemoveHandler (ColumnDividerDoubleClickEvent, value); }
1665 public event DataGridViewColumnEventHandler ColumnDividerWidthChanged {
1666 add { Events.AddHandler (ColumnDividerWidthChangedEvent, value); }
1667 remove { Events.RemoveHandler (ColumnDividerWidthChangedEvent, value); }
1670 public event DataGridViewColumnEventHandler ColumnHeaderCellChanged {
1671 add { Events.AddHandler (ColumnHeaderCellChangedEvent, value); }
1672 remove { Events.RemoveHandler (ColumnHeaderCellChangedEvent, value); }
1675 public event DataGridViewCellMouseEventHandler ColumnHeaderMouseClick {
1676 add { Events.AddHandler (ColumnHeaderMouseClickEvent, value); }
1677 remove { Events.RemoveHandler (ColumnHeaderMouseClickEvent, value); }
1680 public event DataGridViewCellMouseEventHandler ColumnHeaderMouseDoubleClick {
1681 add { Events.AddHandler (ColumnHeaderMouseDoubleClickEvent, value); }
1682 remove { Events.RemoveHandler (ColumnHeaderMouseDoubleClickEvent, value); }
1685 public event EventHandler ColumnHeadersBorderStyleChanged {
1686 add { Events.AddHandler (ColumnHeadersBorderStyleChangedEvent, value); }
1687 remove { Events.RemoveHandler (ColumnHeadersBorderStyleChangedEvent, value); }
1690 public event EventHandler ColumnHeadersDefaultCellStyleChanged {
1691 add { Events.AddHandler (ColumnHeadersDefaultCellStyleChangedEvent, value); }
1692 remove { Events.RemoveHandler (ColumnHeadersDefaultCellStyleChangedEvent, value); }
1695 public event EventHandler ColumnHeadersHeightChanged {
1696 add { Events.AddHandler (ColumnHeadersHeightChangedEvent, value); }
1697 remove { Events.RemoveHandler (ColumnHeadersHeightChangedEvent, value); }
1700 public event DataGridViewAutoSizeModeEventHandler ColumnHeadersHeightSizeModeChanged {
1701 add { Events.AddHandler (ColumnHeadersHeightSizeModeChangedEvent, value); }
1702 remove { Events.RemoveHandler (ColumnHeadersHeightSizeModeChangedEvent, value); }
1705 public event DataGridViewColumnEventHandler ColumnMinimumWidthChanged {
1706 add { Events.AddHandler (ColumnMinimumWidthChangedEvent, value); }
1707 remove { Events.RemoveHandler (ColumnMinimumWidthChangedEvent, value); }
1710 public event DataGridViewColumnEventHandler ColumnNameChanged {
1711 add { Events.AddHandler (ColumnNameChangedEvent, value); }
1712 remove { Events.RemoveHandler (ColumnNameChangedEvent, value); }
1715 public event DataGridViewColumnEventHandler ColumnRemoved {
1716 add { Events.AddHandler (ColumnRemovedEvent, value); }
1717 remove { Events.RemoveHandler (ColumnRemovedEvent, value); }
1720 public event DataGridViewColumnEventHandler ColumnSortModeChanged {
1721 add { Events.AddHandler (ColumnSortModeChangedEvent, value); }
1722 remove { Events.RemoveHandler (ColumnSortModeChangedEvent, value); }
1725 public event DataGridViewColumnStateChangedEventHandler ColumnStateChanged {
1726 add { Events.AddHandler (ColumnStateChangedEvent, value); }
1727 remove { Events.RemoveHandler (ColumnStateChangedEvent, value); }
1730 public event DataGridViewColumnEventHandler ColumnToolTipTextChanged {
1731 add { Events.AddHandler (ColumnToolTipTextChangedEvent, value); }
1732 remove { Events.RemoveHandler (ColumnToolTipTextChangedEvent, value); }
1735 public event DataGridViewColumnEventHandler ColumnWidthChanged {
1736 add { Events.AddHandler (ColumnWidthChangedEvent, value); }
1737 remove { Events.RemoveHandler (ColumnWidthChangedEvent, value); }
1740 public event EventHandler CurrentCellChanged {
1741 add { Events.AddHandler (CurrentCellChangedEvent, value); }
1742 remove { Events.RemoveHandler (CurrentCellChangedEvent, value); }
1745 [EditorBrowsable (EditorBrowsableState.Advanced)]
1746 public event EventHandler CurrentCellDirtyStateChanged {
1747 add { Events.AddHandler (CurrentCellDirtyStateChangedEvent, value); }
1748 remove { Events.RemoveHandler (CurrentCellDirtyStateChangedEvent, value); }
1751 public event DataGridViewBindingCompleteEventHandler DataBindingComplete {
1752 add { Events.AddHandler (DataBindingCompleteEvent, value); }
1753 remove { Events.RemoveHandler (DataBindingCompleteEvent, value); }
1756 public event DataGridViewDataErrorEventHandler DataError {
1757 add { Events.AddHandler (DataErrorEvent, value); }
1758 remove { Events.RemoveHandler (DataErrorEvent, value); }
1761 public event EventHandler DataMemberChanged {
1762 add { Events.AddHandler (DataMemberChangedEvent, value); }
1763 remove { Events.RemoveHandler (DataMemberChangedEvent, value); }
1766 public event EventHandler DataSourceChanged {
1767 add { Events.AddHandler (DataSourceChangedEvent, value); }
1768 remove { Events.RemoveHandler (DataSourceChangedEvent, value); }
1771 public event EventHandler DefaultCellStyleChanged {
1772 add { Events.AddHandler (DefaultCellStyleChangedEvent, value); }
1773 remove { Events.RemoveHandler (DefaultCellStyleChangedEvent, value); }
1776 [EditorBrowsable (EditorBrowsableState.Advanced)]
1777 public event DataGridViewRowEventHandler DefaultValuesNeeded {
1778 add { Events.AddHandler (DefaultValuesNeededEvent, value); }
1779 remove { Events.RemoveHandler (DefaultValuesNeededEvent, value); }
1782 public event DataGridViewEditingControlShowingEventHandler EditingControlShowing {
1783 add { Events.AddHandler (EditingControlShowingEvent, value); }
1784 remove { Events.RemoveHandler (EditingControlShowingEvent, value); }
1787 public event EventHandler EditModeChanged {
1788 add { Events.AddHandler (EditModeChangedEvent, value); }
1789 remove { Events.RemoveHandler (EditModeChangedEvent, value); }
1793 [EditorBrowsable (EditorBrowsableState.Advanced)]
1794 public new event EventHandler FontChanged {
1795 add { base.FontChanged += value; }
1796 remove { base.FontChanged -= value; }
1800 [EditorBrowsable (EditorBrowsableState.Advanced)]
1801 public new event EventHandler ForeColorChanged {
1802 add { base.ForeColorChanged += value; }
1803 remove { base.ForeColorChanged -= value; }
1807 [EditorBrowsable (EditorBrowsableState.Never)]
1808 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1809 public new event EventHandler PaddingChanged {
1810 add { base.PaddingChanged += value; }
1811 remove { base.PaddingChanged -= value; }
1814 public event EventHandler GridColorChanged {
1815 add { Events.AddHandler (GridColorChangedEvent, value); }
1816 remove { Events.RemoveHandler (GridColorChangedEvent, value); }
1819 public event EventHandler MultiSelectChanged {
1820 add { Events.AddHandler (MultiSelectChangedEvent, value); }
1821 remove { Events.RemoveHandler (MultiSelectChangedEvent, value); }
1824 public event DataGridViewRowEventHandler NewRowNeeded {
1825 add { Events.AddHandler (NewRowNeededEvent, value); }
1826 remove { Events.RemoveHandler (NewRowNeededEvent, value); }
1829 public event EventHandler ReadOnlyChanged {
1830 add { Events.AddHandler (ReadOnlyChangedEvent, value); }
1831 remove { Events.RemoveHandler (ReadOnlyChangedEvent, value); }
1834 public event DataGridViewRowEventHandler RowContextMenuStripChanged {
1835 add { Events.AddHandler (RowContextMenuStripChangedEvent, value); }
1836 remove { Events.RemoveHandler (RowContextMenuStripChangedEvent, value); }
1839 [EditorBrowsable (EditorBrowsableState.Advanced)]
1840 public event DataGridViewRowContextMenuStripNeededEventHandler RowContextMenuStripNeeded {
1841 add { Events.AddHandler (RowContextMenuStripNeededEvent, value); }
1842 remove { Events.RemoveHandler (RowContextMenuStripNeededEvent, value); }
1845 public event DataGridViewRowEventHandler RowDefaultCellStyleChanged {
1846 add { Events.AddHandler (RowDefaultCellStyleChangedEvent, value); }
1847 remove { Events.RemoveHandler (RowDefaultCellStyleChangedEvent, value); }
1850 [EditorBrowsable (EditorBrowsableState.Advanced)]
1851 public event QuestionEventHandler RowDirtyStateNeeded {
1852 add { Events.AddHandler (RowDirtyStateNeededEvent, value); }
1853 remove { Events.RemoveHandler (RowDirtyStateNeededEvent, value); }
1856 public event DataGridViewRowDividerDoubleClickEventHandler RowDividerDoubleClick {
1857 add { Events.AddHandler (RowDividerDoubleClickEvent, value); }
1858 remove { Events.RemoveHandler (RowDividerDoubleClickEvent, value); }
1861 public event DataGridViewRowEventHandler RowDividerHeightChanged {
1862 add { Events.AddHandler (RowDividerHeightChangedEvent, value); }
1863 remove { Events.RemoveHandler (RowDividerHeightChangedEvent, value); }
1866 public event DataGridViewCellEventHandler RowEnter {
1867 add { Events.AddHandler (RowEnterEvent, value); }
1868 remove { Events.RemoveHandler (RowEnterEvent, value); }
1871 public event DataGridViewRowEventHandler RowErrorTextChanged {
1872 add { Events.AddHandler (RowErrorTextChangedEvent, value); }
1873 remove { Events.RemoveHandler (RowErrorTextChangedEvent, value); }
1876 [EditorBrowsable (EditorBrowsableState.Advanced)]
1877 public event DataGridViewRowErrorTextNeededEventHandler RowErrorTextNeeded {
1878 add { Events.AddHandler (RowErrorTextNeededEvent, value); }
1879 remove { Events.RemoveHandler (RowErrorTextNeededEvent, value); }
1882 public event DataGridViewRowEventHandler RowHeaderCellChanged {
1883 add { Events.AddHandler (RowHeaderCellChangedEvent, value); }
1884 remove { Events.RemoveHandler (RowHeaderCellChangedEvent, value); }
1887 public event DataGridViewCellMouseEventHandler RowHeaderMouseClick {
1888 add { Events.AddHandler (RowHeaderMouseClickEvent, value); }
1889 remove { Events.RemoveHandler (RowHeaderMouseClickEvent, value); }
1892 public event DataGridViewCellMouseEventHandler RowHeaderMouseDoubleClick {
1893 add { Events.AddHandler (RowHeaderMouseDoubleClickEvent, value); }
1894 remove { Events.RemoveHandler (RowHeaderMouseDoubleClickEvent, value); }
1897 public event EventHandler RowHeadersBorderStyleChanged {
1898 add { Events.AddHandler (RowHeadersBorderStyleChangedEvent, value); }
1899 remove { Events.RemoveHandler (RowHeadersBorderStyleChangedEvent, value); }
1902 public event EventHandler RowHeadersDefaultCellStyleChanged {
1903 add { Events.AddHandler (RowHeadersDefaultCellStyleChangedEvent, value); }
1904 remove { Events.RemoveHandler (RowHeadersDefaultCellStyleChangedEvent, value); }
1907 public event EventHandler RowHeadersWidthChanged {
1908 add { Events.AddHandler (RowHeadersWidthChangedEvent, value); }
1909 remove { Events.RemoveHandler (RowHeadersWidthChangedEvent, value); }
1912 public event DataGridViewAutoSizeModeEventHandler RowHeadersWidthSizeModeChanged {
1913 add { Events.AddHandler (RowHeadersWidthSizeModeChangedEvent, value); }
1914 remove { Events.RemoveHandler (RowHeadersWidthSizeModeChangedEvent, value); }
1917 public event DataGridViewRowEventHandler RowHeightChanged {
1918 add { Events.AddHandler (RowHeightChangedEvent, value); }
1919 remove { Events.RemoveHandler (RowHeightChangedEvent, value); }
1922 [EditorBrowsable (EditorBrowsableState.Advanced)]
1923 public event DataGridViewRowHeightInfoNeededEventHandler RowHeightInfoNeeded {
1924 add { Events.AddHandler (RowHeightInfoNeededEvent, value); }
1925 remove { Events.RemoveHandler (RowHeightInfoNeededEvent, value); }
1928 [EditorBrowsable (EditorBrowsableState.Advanced)]
1929 public event DataGridViewRowHeightInfoPushedEventHandler RowHeightInfoPushed {
1930 add { Events.AddHandler (RowHeightInfoPushedEvent, value); }
1931 remove { Events.RemoveHandler (RowHeightInfoPushedEvent, value); }
1934 public event DataGridViewCellEventHandler RowLeave {
1935 add { Events.AddHandler (RowLeaveEvent, value); }
1936 remove { Events.RemoveHandler (RowLeaveEvent, value); }
1939 public event DataGridViewRowEventHandler RowMinimumHeightChanged {
1940 add { Events.AddHandler (RowMinimumHeightChangedEvent, value); }
1941 remove { Events.RemoveHandler (RowMinimumHeightChangedEvent, value); }
1944 public event DataGridViewRowPostPaintEventHandler RowPostPaint {
1945 add { Events.AddHandler (RowPostPaintEvent, value); }
1946 remove { Events.RemoveHandler (RowPostPaintEvent, value); }
1949 public event DataGridViewRowPrePaintEventHandler RowPrePaint {
1950 add { Events.AddHandler (RowPrePaintEvent, value); }
1951 remove { Events.RemoveHandler (RowPrePaintEvent, value); }
1954 public event DataGridViewRowsAddedEventHandler RowsAdded {
1955 add { Events.AddHandler (RowsAddedEvent, value); }
1956 remove { Events.RemoveHandler (RowsAddedEvent, value); }
1959 public event EventHandler RowsDefaultCellStyleChanged {
1960 add { Events.AddHandler (RowsDefaultCellStyleChangedEvent, value); }
1961 remove { Events.RemoveHandler (RowsDefaultCellStyleChangedEvent, value); }
1964 public event DataGridViewRowsRemovedEventHandler RowsRemoved {
1965 add { Events.AddHandler (RowsRemovedEvent, value); }
1966 remove { Events.RemoveHandler (RowsRemovedEvent, value); }
1969 public event DataGridViewRowStateChangedEventHandler RowStateChanged {
1970 add { Events.AddHandler (RowStateChangedEvent, value); }
1971 remove { Events.RemoveHandler (RowStateChangedEvent, value); }
1974 [EditorBrowsable (EditorBrowsableState.Advanced)]
1975 public event DataGridViewRowEventHandler RowUnshared {
1976 add { Events.AddHandler (RowUnsharedEvent, value); }
1977 remove { Events.RemoveHandler (RowUnsharedEvent, value); }
1980 public event DataGridViewCellEventHandler RowValidated {
1981 add { Events.AddHandler (RowValidatedEvent, value); }
1982 remove { Events.RemoveHandler (RowValidatedEvent, value); }
1985 public event DataGridViewCellCancelEventHandler RowValidating {
1986 add { Events.AddHandler (RowValidatingEvent, value); }
1987 remove { Events.RemoveHandler (RowValidatingEvent, value); }
1990 public event ScrollEventHandler Scroll {
1991 add { Events.AddHandler (ScrollEvent, value); }
1992 remove { Events.RemoveHandler (ScrollEvent, value); }
1995 public event EventHandler SelectionChanged {
1996 add { Events.AddHandler (SelectionChangedEvent, value); }
1997 remove { Events.RemoveHandler (SelectionChangedEvent, value); }
2000 [EditorBrowsable (EditorBrowsableState.Advanced)]
2001 public event DataGridViewSortCompareEventHandler SortCompare {
2002 add { Events.AddHandler (SortCompareEvent, value); }
2003 remove { Events.RemoveHandler (SortCompareEvent, value); }
2006 public event EventHandler Sorted {
2007 add { Events.AddHandler (SortedEvent, value); }
2008 remove { Events.RemoveHandler (SortedEvent, value); }
2011 public event DataGridViewRowEventHandler UserAddedRow {
2012 add { Events.AddHandler (UserAddedRowEvent, value); }
2013 remove { Events.RemoveHandler (UserAddedRowEvent, value); }
2016 public event DataGridViewRowEventHandler UserDeletedRow {
2017 add { Events.AddHandler (UserDeletedRowEvent, value); }
2018 remove { Events.RemoveHandler (UserDeletedRowEvent, value); }
2021 public event DataGridViewRowCancelEventHandler UserDeletingRow {
2022 add { Events.AddHandler (UserDeletingRowEvent, value); }
2023 remove { Events.RemoveHandler (UserDeletingRowEvent, value); }
2027 [EditorBrowsable (EditorBrowsableState.Never)]
2028 public new event EventHandler StyleChanged {
2029 add { base.StyleChanged += value; }
2030 remove { base.StyleChanged -= value; }
2034 [EditorBrowsable (EditorBrowsableState.Never)]
2035 public new event EventHandler TextChanged {
2036 add { base.TextChanged += value; }
2037 remove { base.TextChanged -= value; }
2040 [EditorBrowsable (EditorBrowsableState.Advanced)]
2041 public virtual DataGridViewAdvancedBorderStyle AdjustColumnHeaderBorderStyle (DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStyleInput, DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStylePlaceholder, bool isFirstDisplayedColumn, bool isLastVisibleColumn) {
2042 return (DataGridViewAdvancedBorderStyle) ((ICloneable)dataGridViewAdvancedBorderStyleInput).Clone();
2045 public bool AreAllCellsSelected (bool includeInvisibleCells) {
2046 foreach (DataGridViewRow row in rows) {
2047 foreach (DataGridViewCell cell in row.Cells) {
2048 if (includeInvisibleCells == false && cell.Visible == false) {
2051 if (!cell.Selected) {
2059 public void AutoResizeColumn (int columnIndex) {
2060 AutoResizeColumn (columnIndex, DataGridViewAutoSizeColumnMode.AllCells);
2063 public void AutoResizeColumn (int columnIndex, DataGridViewAutoSizeColumnMode autoSizeColumnMode)
2065 AutoResizeColumnInternal (columnIndex, autoSizeColumnMode);
2068 public void AutoResizeColumnHeadersHeight ()
2072 foreach (DataGridViewColumn col in Columns)
2073 new_height = Math.Max (new_height, col.HeaderCell.PreferredSize.Height);
2075 if (ColumnHeadersHeight != new_height)
2076 ColumnHeadersHeight = new_height;
2079 [MonoTODO ("columnIndex parameter is not used")]
2080 public void AutoResizeColumnHeadersHeight (int columnIndex)
2082 AutoResizeColumnHeadersHeight ();
2085 public void AutoResizeColumns () {
2086 AutoResizeColumns (DataGridViewAutoSizeColumnsMode.AllCells);
2089 public void AutoResizeColumns (DataGridViewAutoSizeColumnsMode autoSizeColumnsMode) {
2090 AutoResizeColumns (autoSizeColumnsMode, true);
2093 public void AutoResizeRow (int rowIndex)
2095 AutoResizeRow (rowIndex, DataGridViewAutoSizeRowMode.AllCells);
2098 public void AutoResizeRow (int rowIndex, DataGridViewAutoSizeRowMode autoSizeRowMode)
2100 if (autoSizeRowMode == DataGridViewAutoSizeRowMode.RowHeader && !rowHeadersVisible)
2101 throw new InvalidOperationException ("row headers are not visible");
2102 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
2103 throw new ArgumentOutOfRangeException ("rowIndex");
2105 DataGridViewRow row = GetRowInternal (rowIndex);
2107 if (autoSizeRowMode == DataGridViewAutoSizeRowMode.RowHeader) {
2108 row.Height = row.HeaderCell.PreferredSize.Height;
2114 foreach (DataGridViewCell cell in row.Cells)
2115 row_height = Math.Max (row_height, cell.PreferredSize.Height);
2117 if (autoSizeRowMode == DataGridViewAutoSizeRowMode.AllCellsExceptHeader)
2118 row.Height = row_height;
2120 row.Height = Math.Max (row_height, row.HeaderCell.PreferredSize.Height);
2123 public void AutoResizeRowHeadersWidth (DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode)
2125 if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToFirstHeader) {
2126 RowHeadersWidth = GetRowInternal (0).HeaderCell.PreferredSize.Width;
2132 if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders) {
2133 foreach (DataGridViewRow row in Rows)
2135 new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
2137 if (RowHeadersWidth != new_width)
2138 RowHeadersWidth = new_width;
2143 if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders) {
2144 foreach (DataGridViewRow row in Rows)
2145 new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
2147 if (RowHeadersWidth != new_width)
2148 RowHeadersWidth = new_width;
2154 [MonoTODO ("Does not use rowIndex parameter.")]
2155 public void AutoResizeRowHeadersWidth (int rowIndex, DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode)
2157 AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
2160 public void AutoResizeRows ()
2162 AutoResizeRows (0, Rows.Count, DataGridViewAutoSizeRowMode.AllCells, false);
2165 public void AutoResizeRows (DataGridViewAutoSizeRowsMode autoSizeRowsMode)
2167 if (!Enum.IsDefined(typeof(DataGridViewAutoSizeRowsMode), autoSizeRowsMode))
2168 throw new InvalidEnumArgumentException ("Parameter AutoSizeRowsMode is not valid DataGridViewRowsMode.");
2169 if ((autoSizeRowsMode == DataGridViewAutoSizeRowsMode.AllHeaders || autoSizeRowsMode == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && rowHeadersVisible == false)
2170 throw new InvalidOperationException ("Parameter AutoSizeRowsMode cant be AllHeaders or DisplayedHeaders in this DataGridView.");
2171 if (autoSizeRowsMode == DataGridViewAutoSizeRowsMode.None)
2172 throw new ArgumentException ("Parameter AutoSieRowsMode cant be None.");
2174 AutoResizeRows (autoSizeRowsMode, false);
2177 public virtual bool BeginEdit (bool selectAll) {
2178 if (currentCell == null || currentCell.IsInEditMode)
2181 if (currentCell.RowIndex >= 0) {
2182 if ((currentCell.InheritedState & DataGridViewElementStates.ReadOnly) == DataGridViewElementStates.ReadOnly) {
2187 DataGridViewCell cell = currentCell;
2188 Type editType = cell.EditType;
2189 if (editType == null)
2192 // Give user a chance to cancel the edit
2193 DataGridViewCellCancelEventArgs e = new DataGridViewCellCancelEventArgs (cell.ColumnIndex, cell.RowIndex);
2194 OnCellBeginEdit (e);
2199 cell.SetIsInEditMode (true);
2200 Control ctrl = EditingControlInternal;
2201 bool isCorrectType = ctrl != null && ctrl.GetType () == editType;
2202 if (ctrl != null && !isCorrectType) {
2206 ctrl = (Control) Activator.CreateInstance (editType);
2207 EditingControlInternal = ctrl;
2210 IDataGridViewEditingControl edControl = ctrl as IDataGridViewEditingControl;
2211 DataGridViewCellStyle style = cell.RowIndex == -1 ? DefaultCellStyle : cell.InheritedStyle;
2212 cell.InitializeEditingControl (cell.RowIndex, cell.FormattedValue, style);
2214 cell.PositionEditingControl (true, true, this.GetCellDisplayRectangle (cell.ColumnIndex, cell.RowIndex, false), bounds, style, false, false, (columns [cell.ColumnIndex].DisplayIndex == 0), (cell.RowIndex == 0));
2215 EditingControlInternal.Visible = true;
2217 if (edControl != null)
2218 (EditingControlInternal as IDataGridViewEditingControl).PrepareEditingControlForEdit (selectAll);
2223 public bool CancelEdit ()
2225 if (currentCell != null && currentCell.IsInEditMode) {
2226 currentCell.SetIsInEditMode (false);
2227 currentCell.DetachEditingControl ();
2228 OnCellEndEdit (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
2234 public void ClearSelection ()
2236 foreach (DataGridViewColumn col in SelectedColumns)
2237 col.Selected = false;
2238 foreach (DataGridViewRow row in SelectedRows)
2239 row.Selected = false;
2240 foreach (DataGridViewCell cell in SelectedCells)
2241 cell.Selected = false;
2244 public bool CommitEdit (DataGridViewDataErrorContexts context)
2246 if (currentCell != null && currentCell.IsInEditMode) {
2247 IDataGridViewEditingControl ctrl = EditingControl as IDataGridViewEditingControl;
2248 ctrl.GetEditingControlFormattedValue (DataGridViewDataErrorContexts.Commit);
2249 currentCell.Value = ctrl.GetEditingControlFormattedValue (DataGridViewDataErrorContexts.Commit);
2256 [MonoTODO ("Always includes partial columns")]
2257 public int DisplayedColumnCount (bool includePartialColumns)
2261 for (int i = first_col_index; i < Columns.Count; i++)
2262 if (Columns.ColumnDisplayIndexSortedArrayList[i].Displayed)
2270 [MonoTODO ("Always includes partial rows")]
2271 public int DisplayedRowCount (bool includePartialRow)
2275 for (int i = first_row_index; i < Rows.Count; i++)
2276 if (Rows[i].Displayed)
2284 public bool EndEdit ()
2286 if (currentCell != null && currentCell.IsInEditMode) {
2287 IDataGridViewEditingControl ctrl = EditingControl as IDataGridViewEditingControl;
2288 ctrl.GetEditingControlFormattedValue (DataGridViewDataErrorContexts.Commit);
2289 currentCell.Value = ctrl.GetEditingControlFormattedValue (DataGridViewDataErrorContexts.Commit);
2291 currentCell.SetIsInEditMode (false);
2292 currentCell.DetachEditingControl ();
2293 OnCellEndEdit (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
2299 [MonoTODO ("Does not use context parameter")]
2300 public bool EndEdit (DataGridViewDataErrorContexts context)
2305 public int GetCellCount (DataGridViewElementStates includeFilter) {
2307 foreach (DataGridViewRow row in rows) {
2308 foreach (DataGridViewCell cell in row.Cells) {
2309 if ((cell.State & includeFilter) != 0) {
2317 internal DataGridViewRow GetRowInternal (int rowIndex)
2319 return Rows.SharedRow (rowIndex);
2322 internal DataGridViewCell GetCellInternal (int colIndex, int rowIndex)
2324 return GetRowInternal (rowIndex).Cells.GetCellInternal (colIndex);
2327 public Rectangle GetCellDisplayRectangle (int columnIndex, int rowIndex, bool cutOverflow) {
2328 if (columnIndex < 0 || columnIndex >= columns.Count) {
2329 throw new ArgumentOutOfRangeException("Column index is out of range.");
2332 int x = 0, y = 0, w = 0, h = 0;
2337 if (ColumnHeadersVisible)
2338 y += ColumnHeadersHeight;
2340 if (RowHeadersVisible)
2341 x += RowHeadersWidth;
2343 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2345 for (int i = first_col_index; i < cols.Count; i++) {
2346 if (!cols[i].Visible)
2349 if (cols[i].Index == columnIndex) {
2357 for (int i = first_row_index; i < Rows.Count; i++) {
2358 if (i == rowIndex) {
2359 h = rows [i].Height;
2363 y += rows [i].Height;
2366 return new Rectangle (x, y, w, h);
2369 public virtual DataObject GetClipboardContent () {
2371 if (clipboardCopyMode == DataGridViewClipboardCopyMode.Disable)
2372 throw new InvalidOperationException ("Generating Clipboard content is not supported when the ClipboardCopyMode property is Disable.");
2374 int start_row = int.MaxValue, end_row = int.MinValue;
2375 int start_col = int.MaxValue, end_col = int.MinValue;
2377 bool include_row_headers = false;
2378 bool include_col_headers = false;
2379 bool only_included_headers = false;
2380 bool headers_includable = false;
2382 switch (ClipboardCopyMode) {
2383 case DataGridViewClipboardCopyMode.EnableWithoutHeaderText:
2385 case DataGridViewClipboardCopyMode.EnableWithAutoHeaderText:
2386 // Headers are included if not selection mode is CellSelect, and any header is selected.
2387 headers_includable = selectionMode != DataGridViewSelectionMode.CellSelect;
2389 case DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText:
2390 include_col_headers = include_row_headers = true;
2394 BitArray included_rows = new BitArray (RowCount);
2395 BitArray included_cols = new BitArray (ColumnCount);
2397 // If there are any selected columns,
2398 // include the column headers (if headers are to be shown).
2399 if (headers_includable && !include_col_headers) {
2400 for (int c = 0; c < ColumnCount; c++) {
2401 if (Columns [c].Selected) {
2402 include_col_headers = true;
2408 // Find the smallest rectangle that encompasses all selected cells.
2409 for (int r = 0; r < RowCount; r++) {
2410 DataGridViewRow row = Rows [r];
2412 if (headers_includable && !include_row_headers && row.Selected) {
2413 include_row_headers = true;
2416 for (int c = 0; c < ColumnCount; c++) {
2417 DataGridViewCell cell = row.Cells [c];
2419 if (cell == null || !cell.Selected)
2422 included_cols [c] = true;
2423 included_rows [r] = true;
2425 start_row = Math.Min (start_row, r);
2426 start_col = Math.Min (start_col, c);
2427 end_row = Math.Max (end_row, r);
2428 end_col = Math.Max (end_col, c);
2432 // Mark rows/columns in between selected cells as included if the selection mode isn't FullHeaderSelect.
2433 switch (selectionMode){
2434 case DataGridViewSelectionMode.CellSelect:
2435 case DataGridViewSelectionMode.ColumnHeaderSelect:
2436 case DataGridViewSelectionMode.RowHeaderSelect:
2437 if (selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect) {
2438 for (int r = start_row; r <= end_row; r++) {
2439 included_rows.Set (r, true);
2441 } else if (start_row <= end_row) {
2442 included_rows.SetAll (true);
2444 if (selectionMode != DataGridViewSelectionMode.RowHeaderSelect) {
2445 for (int c = start_col; c <= end_col; c++) {
2446 included_cols.Set (c, true);
2450 case DataGridViewSelectionMode.FullColumnSelect:
2451 case DataGridViewSelectionMode.FullRowSelect:
2452 only_included_headers = true;
2456 if (start_row > end_row)
2459 if (start_col > end_col)
2462 DataObject result = new DataObject ();
2464 System.Text.StringBuilder text_builder = new System.Text.StringBuilder ();
2465 System.Text.StringBuilder utext_builder = new System.Text.StringBuilder ();
2466 System.Text.StringBuilder html_builder = new System.Text.StringBuilder ();
2467 System.Text.StringBuilder csv_builder = new System.Text.StringBuilder ();
2469 // Loop through all rows and columns to create the content.
2470 // -1 is the header row/column.
2471 int first_row = start_row;
2472 int first_col = start_col;
2473 if (include_col_headers) {
2476 for (int r = first_row; r <= end_row; r++) {
2477 DataGridViewRow row = null;
2480 if (!included_rows [r])
2486 if (include_row_headers) {
2490 for (int c = first_col; c <= end_col; c++) {
2491 DataGridViewCell cell = null;
2493 if (c >= 0 && only_included_headers && !included_cols [c])
2498 cell = TopLeftHeaderCell;
2500 cell = Columns [c].HeaderCell;
2504 cell = row.HeaderCell;
2506 cell = row.Cells [c];
2510 string text, utext, html, csv;
2511 bool is_first_cell = (c == first_col);
2512 bool is_last_cell = (c == end_col);
2513 bool is_first_row = (r == first_row);
2514 bool is_last_row = (r == end_row);
2517 text = string.Empty;
2518 utext = string.Empty;
2519 html = string.Empty;
2522 text = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.Text) as string;
2523 utext = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.UnicodeText) as string;
2524 html = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.Html) as string;
2525 csv = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.CommaSeparatedValue) as string;
2528 text_builder.Append (text);
2529 utext_builder.Append (utext);
2530 html_builder.Append (html);
2531 csv_builder.Append (csv);
2533 if (c == -1) { // If we just did the row header, jump to the first column.
2538 if (r == -1) {// If we just did the column header, jump to the first row.
2544 // Html content always get the \r\n newline
2545 // It's valid html anyway, and it eases testing quite a bit
2546 // (since otherwise we'd have to change the start indices
2547 // in the added prologue/epilogue text)
2549 int fragment_end = 135 + html_builder.Length;
2550 int html_end = fragment_end + 36;
2553 "StartHTML:00000097{0}" +
2554 "EndHTML:{1:00000000}{0}" +
2555 "StartFragment:00000133{0}" +
2556 "EndFragment:{2:00000000}{0}" +
2559 "<!--StartFragment-->";
2561 html_start = string.Format (html_start, "\r\n", html_end, fragment_end);
2562 html_builder.Insert (0, html_start);
2563 html_builder.AppendFormat ("{0}<!--EndFragment-->{0}</BODY>{0}</HTML>", "\r\n");
2565 result.SetData (DataFormats.CommaSeparatedValue, false, csv_builder.ToString ());
2566 result.SetData (DataFormats.Html, false, html_builder.ToString ());
2567 result.SetData (DataFormats.UnicodeText, false, utext_builder.ToString ());
2568 result.SetData (DataFormats.Text, false, text_builder.ToString ());
2573 [MonoTODO ("Does not use cutOverflow parameter")]
2574 public Rectangle GetColumnDisplayRectangle (int columnIndex, bool cutOverflow)
2576 if (columnIndex < 0 || columnIndex > Columns.Count - 1)
2577 throw new ArgumentOutOfRangeException ("columnIndex");
2584 if (RowHeadersVisible)
2585 x += RowHeadersWidth;
2587 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2589 for (int i = first_col_index; i < cols.Count; i++) {
2590 if (!cols[i].Visible)
2593 if (cols[i].Index == columnIndex) {
2601 return new Rectangle (x, 0, w, Height);
2604 [MonoTODO ("Does not use cutOverflow parameter")]
2605 public Rectangle GetRowDisplayRectangle (int rowIndex, bool cutOverflow)
2607 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
2608 throw new ArgumentOutOfRangeException ("rowIndex");
2615 if (ColumnHeadersVisible)
2616 y += ColumnHeadersHeight;
2618 for (int i = first_row_index; i < Rows.Count; i++) {
2619 if (i == rowIndex) {
2624 y += rows[i].Height;
2627 return new Rectangle (0, y, Width, h);
2630 public HitTestInfo HitTest (int x, int y) {
2631 ///////////////////////////////////////////////////////
2632 //Console.WriteLine ("HitTest ({0}, {1})", x, y);
2633 bool isInColHeader = columnHeadersVisible && y >= 0 && y <= ColumnHeadersHeight;
2634 bool isInRowHeader = rowHeadersVisible && x >= 0 && x <= RowHeadersWidth;
2637 if (isInColHeader && isInRowHeader)
2638 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.TopLeftHeader);
2640 // HorizontalScrollBar
2641 if (horizontalScrollBar.Visible && horizontalScrollBar.Bounds.Contains (x, y))
2642 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.HorizontalScrollBar);
2644 // VerticalScrollBar
2645 if (verticalScrollBar.Visible && verticalScrollBar.Bounds.Contains (x, y))
2646 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.VerticalScrollBar);
2648 // The little box in the bottom right if both scrollbars are shown is None
2649 if (verticalScrollBar.Visible && horizontalScrollBar.Visible)
2650 if (new Rectangle (verticalScrollBar.Left, horizontalScrollBar.Top, verticalScrollBar.Width, horizontalScrollBar.Height).Contains (x, y))
2651 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.None);
2656 int top = columnHeadersVisible ? columnHeadersHeight : 0;
2658 for (int i = first_row_index; i < Rows.Count; i++) {
2659 DataGridViewRow row = Rows[i];
2661 if (y > top && y <= (top + row.Height)) {
2669 int left = rowHeadersVisible ? RowHeadersWidth : 0;
2671 List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
2673 for (int i = first_col_index; i < cols.Count; i++) {
2674 if (!cols[i].Visible)
2677 if (x > left && x <= (left + cols[i].Width)) {
2678 colindex = cols[i].Index;
2682 left += cols[i].Width;
2685 if (colindex >= 0 && rowindex >= 0)
2686 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.Cell);
2688 if (isInColHeader && colindex > -1)
2689 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.ColumnHeader);
2691 if (isInRowHeader && rowindex > -1)
2692 return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.RowHeader);
2694 return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.None);
2697 [MonoTODO ("Invalidates whole grid")]
2698 public void InvalidateCell (DataGridViewCell dataGridViewCell)
2700 if (dataGridViewCell == null)
2701 throw new ArgumentNullException ("Cell is null");
2703 if (dataGridViewCell.DataGridView != this)
2704 throw new ArgumentException ("The specified cell does not belong to this DataGridView.");
2706 InvalidateCell (dataGridViewCell.ColumnIndex, dataGridViewCell.RowIndex);
2709 [MonoTODO ("Invalidates whole grid")]
2710 public void InvalidateCell (int columnIndex, int rowIndex)
2712 if (columnIndex < 0 || columnIndex >= columns.Count)
2713 throw new ArgumentOutOfRangeException ("Column index is out of range.");
2715 if (rowIndex < 0 || rowIndex >= rows.Count)
2716 throw new ArgumentOutOfRangeException ("Row index is out of range.");
2718 Invalidate (GetCellDisplayRectangle (columnIndex, rowIndex, true));
2721 [MonoTODO ("Invalidates whole grid")]
2722 public void InvalidateColumn (int columnIndex)
2724 if (columnIndex < 0 || columnIndex >= columns.Count)
2725 throw new ArgumentOutOfRangeException ("Column index is out of range.");
2727 Invalidate (GetColumnDisplayRectangle (columnIndex, true));
2730 [MonoTODO ("Invalidates whole grid")]
2731 public void InvalidateRow (int rowIndex)
2733 if (rowIndex < 0 || rowIndex >= rows.Count)
2734 throw new ArgumentOutOfRangeException ("Row index is out of range.");
2736 Invalidate (GetRowDisplayRectangle (rowIndex, true));
2739 public virtual void NotifyCurrentCellDirty (bool dirty) {
2740 throw new NotImplementedException();
2743 public bool RefreshEdit ()
2745 if (IsCurrentCellInEditMode) {
2746 currentCell.InitializeEditingControl (currentCell.RowIndex, currentCell.FormattedValue, currentCell.InheritedStyle);
2753 [EditorBrowsable (EditorBrowsableState.Never)]
2754 public override void ResetText ()
2756 Text = string.Empty;
2759 public void SelectAll () {
2760 switch (selectionMode) {
2761 case DataGridViewSelectionMode.FullRowSelect:
2762 foreach (DataGridViewRow row in rows) {
2763 (row as DataGridViewBand).Selected = true;
2766 case DataGridViewSelectionMode.FullColumnSelect:
2767 foreach (DataGridViewColumn col in columns) {
2768 (col as DataGridViewBand).Selected = true;
2772 foreach (DataGridViewRow row in rows) {
2773 foreach (DataGridViewCell cell in row.Cells) {
2774 cell.Selected = true;
2783 public virtual void Sort (IComparer comparer)
2785 if (comparer == null)
2786 throw new ArgumentNullException ("comparer");
2787 if (VirtualMode || DataSource != null)
2788 throw new InvalidOperationException ();
2790 if (SortedColumn != null)
2791 SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
2795 Rows.Sort (comparer);
2797 sortedColumn = null;
2798 sortOrder = SortOrder.None;
2804 OnSorted (EventArgs.Empty);
2807 public virtual void Sort (DataGridViewColumn dataGridViewColumn, ListSortDirection direction)
2809 if (dataGridViewColumn == null)
2810 throw new ArgumentNullException ("dataGridViewColumn");
2811 if (dataGridViewColumn.DataGridView != this)
2812 throw new ArgumentException ("dataGridViewColumn");
2813 if (DataSource != null && !dataGridViewColumn.IsDataBound)
2814 throw new ArgumentException ("dataGridViewColumn");
2815 if (VirtualMode && !dataGridViewColumn.IsDataBound)
2816 throw new InvalidOperationException ();
2818 if (SortedColumn != null)
2819 SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
2823 ColumnSorter sorter = new ColumnSorter (dataGridViewColumn, direction);
2826 sortedColumn = dataGridViewColumn;
2827 sortOrder = (SortOrder)direction + 1;
2829 dataGridViewColumn.HeaderCell.SortGlyphDirection = (SortOrder)direction + 1;
2833 OnSorted (EventArgs.Empty);
2836 public void UpdateCellErrorText (int columnIndex, int rowIndex)
2838 if (columnIndex < 0 || columnIndex > Columns.Count - 1)
2839 throw new ArgumentOutOfRangeException ("columnIndex");
2840 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
2841 throw new ArgumentOutOfRangeException ("rowIndex");
2843 InvalidateCell (columnIndex, rowIndex);
2846 public void UpdateCellValue (int columnIndex, int rowIndex)
2848 if (columnIndex < 0 || columnIndex > Columns.Count - 1)
2849 throw new ArgumentOutOfRangeException ("columnIndex");
2850 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
2851 throw new ArgumentOutOfRangeException ("rowIndex");
2853 InvalidateCell (columnIndex, rowIndex);
2856 public void UpdateRowErrorText (int rowIndex)
2858 if (rowIndex < 0 || rowIndex > Rows.Count - 1)
2859 throw new ArgumentOutOfRangeException ("rowIndex");
2861 InvalidateRow (rowIndex);
2864 public void UpdateRowErrorText (int rowIndexStart, int rowIndexEnd)
2866 if (rowIndexStart < 0 || rowIndexStart > Rows.Count - 1)
2867 throw new ArgumentOutOfRangeException ("rowIndexStart");
2868 if (rowIndexEnd < 0 || rowIndexEnd > Rows.Count - 1)
2869 throw new ArgumentOutOfRangeException ("rowIndexEnd");
2870 if (rowIndexEnd < rowIndexStart)
2871 throw new ArgumentOutOfRangeException ("rowIndexEnd", "rowIndexEnd must be greater than rowIndexStart");
2873 for (int i = rowIndexStart; i <= rowIndexEnd; i++)
2877 public void UpdateRowHeightInfo (int rowIndex, bool updateToEnd) {
2878 throw new NotImplementedException();
2881 protected override bool CanEnableIme {
2883 if (CurrentCell != null && CurrentCell.EditType != null)
2890 protected override Size DefaultSize {
2891 get { return new Size (240, 150); }
2894 protected ScrollBar HorizontalScrollBar {
2895 get { return horizontalScrollBar; }
2898 protected ScrollBar VerticalScrollBar {
2899 get { return verticalScrollBar; }
2902 protected virtual void AccessibilityNotifyCurrentCellChanged (Point cellAddress)
2904 throw new NotImplementedException ();
2907 [MonoTODO ("Does not use fixedHeight parameter")]
2908 protected void AutoResizeColumn (int columnIndex, DataGridViewAutoSizeColumnMode autoSizeColumnMode, bool fixedHeight)
2910 AutoResizeColumn (columnIndex, autoSizeColumnMode);
2913 [MonoTODO ("Does not use fixedRowHeadersWidth or fixedColumnsWidth parameters")]
2914 protected void AutoResizeColumnHeadersHeight (bool fixedRowHeadersWidth, bool fixedColumnsWidth)
2916 AutoResizeColumnHeadersHeight ();
2919 [MonoTODO ("Does not use columnIndex or fixedRowHeadersWidth or fixedColumnsWidth parameters")]
2920 protected void AutoResizeColumnHeadersHeight (int columnIndex, bool fixedRowHeadersWidth, bool fixedColumnWidth)
2922 AutoResizeColumnHeadersHeight (columnIndex);
2925 protected void AutoResizeColumns (DataGridViewAutoSizeColumnsMode autoSizeColumnsMode, bool fixedHeight) {
2926 for (int i = 0; i < Columns.Count; i++) {
2927 AutoResizeColumn (i, (DataGridViewAutoSizeColumnMode) autoSizeColumnsMode, fixedHeight);
2931 [MonoTODO ("Does not use fixedWidth parameter")]
2932 protected void AutoResizeRow (int rowIndex, DataGridViewAutoSizeRowMode autoSizeRowMode, bool fixedWidth)
2934 AutoResizeRow (rowIndex, autoSizeRowMode);
2937 [MonoTODO ("Does not use fixedColumnHeadersHeight or fixedRowsHeight parameter")]
2938 protected void AutoResizeRowHeadersWidth (DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode, bool fixedColumnHeadersHeight, bool fixedRowsHeight)
2940 AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
2943 [MonoTODO ("Does not use rowIndex or fixedColumnHeadersHeight or fixedRowsHeight parameter")]
2944 protected void AutoResizeRowHeadersWidth (int rowIndex, DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode, bool fixedColumnHeadersHeight, bool fixedRowHeight)
2946 AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
2949 [MonoTODO ("Does not use fixedMode parameter")]
2950 protected void AutoResizeRows (DataGridViewAutoSizeRowsMode autoSizeRowsMode, bool fixedWidth)
2952 if (autoSizeRowsMode == DataGridViewAutoSizeRowsMode.None)
2955 bool include_headers = false;
2956 bool include_cells = false;
2957 bool displayed_only = false;
2959 switch (autoSizeRowsMode) {
2960 case DataGridViewAutoSizeRowsMode.AllHeaders:
2961 include_headers = true;
2963 case DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders:
2964 include_cells = true;
2966 case DataGridViewAutoSizeRowsMode.AllCells:
2967 include_cells = true;
2968 include_headers = true;
2970 case DataGridViewAutoSizeRowsMode.DisplayedHeaders:
2971 include_headers = true;
2972 displayed_only = true;
2974 case DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders:
2975 include_cells = true;
2976 displayed_only = true;
2978 case DataGridViewAutoSizeRowsMode.DisplayedCells:
2979 include_cells = true;
2980 include_headers = true;
2981 displayed_only = true;
2985 foreach (DataGridViewRow row in Rows) {
2988 if (include_headers)
2989 if (!displayed_only || row.HeaderCell.Displayed)
2990 new_height = Math.Max (new_height, row.HeaderCell.PreferredSize.Height);
2993 foreach (DataGridViewCell cell in row.Cells)
2994 if (!displayed_only || cell.Displayed)
2995 new_height = Math.Max (new_height, cell.PreferredSize.Height);
2997 new_height = Math.Max (new_height, row.MinimumHeight);
2999 if (row.Height != new_height)
3000 row.Height = new_height;
3004 [MonoTODO ("Does not use fixedMode parameter")]
3005 protected void AutoResizeRows (int rowIndexStart, int rowsCount, DataGridViewAutoSizeRowMode autoSizeRowMode, bool fixedWidth)
3007 for (int i = rowIndexStart; i < rowIndexStart + rowsCount; i++)
3008 AutoResizeRow (i, autoSizeRowMode, fixedWidth);
3011 protected void ClearSelection (int columnIndexException, int rowIndexException, bool selectExceptionElement) {
3012 if (columnIndexException >= columns.Count) {
3013 throw new ArgumentOutOfRangeException("ColumnIndexException is greater than the highest column index.");
3015 if (selectionMode == DataGridViewSelectionMode.FullRowSelect) {
3016 if (columnIndexException < -1) {
3017 throw new ArgumentOutOfRangeException("ColumnIndexException is less than -1.");
3021 if (columnIndexException < 0) {
3022 throw new ArgumentOutOfRangeException("ColumnIndexException is less than 0.");
3025 if (rowIndexException >= rows.Count) {
3026 throw new ArgumentOutOfRangeException("RowIndexException is greater than the highest row index.");
3028 if (selectionMode == DataGridViewSelectionMode.FullColumnSelect) {
3029 if (rowIndexException < -1) {
3030 throw new ArgumentOutOfRangeException("RowIndexException is less than -1.");
3034 if (rowIndexException < 0) {
3035 throw new ArgumentOutOfRangeException("RowIndexException is less than 0.");
3038 switch (selectionMode) {
3039 case DataGridViewSelectionMode.FullRowSelect:
3040 foreach (DataGridViewRow row in rows) {
3041 if (selectExceptionElement && row.Index == rowIndexException) {
3044 SetSelectedRowCore (row.Index, false);
3047 case DataGridViewSelectionMode.FullColumnSelect:
3048 foreach (DataGridViewColumn col in columns) {
3049 if (selectExceptionElement && col.Index == columnIndexException) {
3052 SetSelectedColumnCore (col.Index, false);
3056 foreach (DataGridViewCell cell in SelectedCells) {
3057 if (selectExceptionElement && cell.RowIndex == rowIndexException && cell.ColumnIndex == columnIndexException) {
3060 SetSelectedCellCore (cell.ColumnIndex, cell.RowIndex, false);
3066 protected override AccessibleObject CreateAccessibilityInstance ()
3068 return new DataGridViewAccessibleObject(this);
3071 [EditorBrowsable (EditorBrowsableState.Advanced)]
3072 protected virtual DataGridViewColumnCollection CreateColumnsInstance ()
3074 return new DataGridViewColumnCollection(this);
3077 protected override Control.ControlCollection CreateControlsInstance ()
3079 return new DataGridViewControlCollection (this);
3082 [EditorBrowsable (EditorBrowsableState.Advanced)]
3083 protected virtual DataGridViewRowCollection CreateRowsInstance ()
3085 return new DataGridViewRowCollection(this);
3088 protected override void Dispose (bool disposing) {
3091 protected override AccessibleObject GetAccessibilityObjectById (int objectId)
3093 throw new NotImplementedException();
3096 protected override bool IsInputChar (char charCode)
3101 protected override bool IsInputKey (Keys keyData)
3103 // Don't look at the modifiers
3104 keyData = keyData & ~Keys.Modifiers;
3126 protected virtual void OnAllowUserToAddRowsChanged (EventArgs e)
3128 EventHandler eh = (EventHandler)(Events [AllowUserToAddRowsChangedEvent]);
3133 protected virtual void OnAllowUserToDeleteRowsChanged (EventArgs e)
3135 EventHandler eh = (EventHandler)(Events [AllowUserToDeleteRowsChangedEvent]);
3140 protected virtual void OnAllowUserToOrderColumnsChanged (EventArgs e)
3142 EventHandler eh = (EventHandler)(Events [AllowUserToOrderColumnsChangedEvent]);
3147 protected virtual void OnAllowUserToResizeColumnsChanged (EventArgs e)
3149 EventHandler eh = (EventHandler)(Events [AllowUserToResizeColumnsChangedEvent]);
3154 protected virtual void OnAllowUserToResizeRowsChanged (EventArgs e)
3156 EventHandler eh = (EventHandler)(Events [AllowUserToResizeRowsChangedEvent]);
3161 protected virtual void OnAlternatingRowsDefaultCellStyleChanged (EventArgs e)
3163 EventHandler eh = (EventHandler)(Events [AlternatingRowsDefaultCellStyleChangedEvent]);
3168 protected virtual void OnAutoGenerateColumnsChanged (EventArgs e)
3170 EventHandler eh = (EventHandler)(Events [AutoGenerateColumnsChangedEvent]);
3175 protected virtual void OnAutoSizeColumnModeChanged (DataGridViewAutoSizeColumnModeEventArgs e)
3177 DataGridViewAutoSizeColumnModeEventHandler eh = (DataGridViewAutoSizeColumnModeEventHandler)(Events [AutoSizeColumnModeChangedEvent]);
3182 protected virtual void OnAutoSizeColumnsModeChanged (DataGridViewAutoSizeColumnsModeEventArgs e)
3184 DataGridViewAutoSizeColumnsModeEventHandler eh = (DataGridViewAutoSizeColumnsModeEventHandler)(Events [AutoSizeColumnsModeChangedEvent]);
3189 protected virtual void OnAutoSizeRowsModeChanged (DataGridViewAutoSizeModeEventArgs e)
3191 DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [AutoSizeRowsModeChangedEvent]);
3196 protected virtual void OnBackgroundColorChanged (EventArgs e)
3198 EventHandler eh = (EventHandler)(Events [BackgroundColorChangedEvent]);
3203 protected override void OnBindingContextChanged (EventArgs e)
3205 base.OnBindingContextChanged(e);
3208 protected virtual void OnBorderStyleChanged (EventArgs e)
3210 EventHandler eh = (EventHandler)(Events [BorderStyleChangedEvent]);
3215 protected virtual void OnCancelRowEdit (QuestionEventArgs e) {
3216 QuestionEventHandler eh = (QuestionEventHandler)(Events [CancelRowEditEvent]);
3221 protected virtual void OnCellBeginEdit (DataGridViewCellCancelEventArgs e)
3223 DataGridViewCellCancelEventHandler eh = (DataGridViewCellCancelEventHandler)(Events [CellBeginEditEvent]);
3228 protected virtual void OnCellBorderStyleChanged (EventArgs e)
3230 EventHandler eh = (EventHandler)(Events [CellBorderStyleChangedEvent]);
3235 protected virtual void OnCellClick (DataGridViewCellEventArgs e)
3237 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3239 cell.OnClickInternal (e);
3241 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellClickEvent]);
3246 protected virtual void OnCellContentClick (DataGridViewCellEventArgs e)
3248 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3250 cell.OnContentClickInternal (e);
3252 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContentClickEvent]);
3257 protected virtual void OnCellContentDoubleClick (DataGridViewCellEventArgs e)
3259 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3261 cell.OnContentDoubleClickInternal (e);
3263 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContentDoubleClickEvent]);
3268 protected virtual void OnCellContextMenuStripChanged (DataGridViewCellEventArgs e)
3270 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContextMenuStripChangedEvent]);
3275 protected virtual void OnCellContextMenuStripNeeded (DataGridViewCellContextMenuStripNeededEventArgs e)
3277 DataGridViewCellContextMenuStripNeededEventHandler eh = (DataGridViewCellContextMenuStripNeededEventHandler)(Events [CellContextMenuStripNeededEvent]);
3282 protected virtual void OnCellDoubleClick (DataGridViewCellEventArgs e)
3284 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3286 cell.OnDoubleClickInternal (e);
3287 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellDoubleClickEvent]);
3292 protected virtual void OnCellEndEdit (DataGridViewCellEventArgs e)
3294 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellEndEditEvent]);
3299 protected virtual void OnCellEnter (DataGridViewCellEventArgs e)
3301 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellEnterEvent]);
3306 protected internal virtual void OnCellErrorTextChanged (DataGridViewCellEventArgs e)
3308 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellErrorTextChangedEvent]);
3313 protected virtual void OnCellErrorTextNeeded (DataGridViewCellErrorTextNeededEventArgs e)
3315 DataGridViewCellErrorTextNeededEventHandler eh = (DataGridViewCellErrorTextNeededEventHandler)(Events [CellErrorTextNeededEvent]);
3320 internal void OnCellFormattingInternal (DataGridViewCellFormattingEventArgs e)
3322 OnCellFormatting (e);
3325 protected virtual void OnCellFormatting (DataGridViewCellFormattingEventArgs e)
3327 DataGridViewCellFormattingEventHandler eh = (DataGridViewCellFormattingEventHandler)(Events [CellFormattingEvent]);
3332 protected virtual void OnCellLeave (DataGridViewCellEventArgs e)
3334 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellLeaveEvent]);
3339 protected virtual void OnCellMouseClick (DataGridViewCellMouseEventArgs e)
3341 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3343 cell.OnMouseClickInternal (e);
3345 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseClickEvent]);
3350 protected virtual void OnCellMouseDoubleClick (DataGridViewCellMouseEventArgs e)
3352 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3354 cell.OnMouseDoubleClickInternal (e);
3356 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseDoubleClickEvent]);
3361 protected virtual void OnCellMouseDown (DataGridViewCellMouseEventArgs e)
3364 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3366 cell.OnMouseDownInternal (e);
3368 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseDownEvent]);
3373 protected virtual void OnCellMouseEnter (DataGridViewCellEventArgs e)
3375 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3377 cell.OnMouseEnterInternal (e.RowIndex);
3379 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellMouseEnterEvent]);
3384 protected virtual void OnCellMouseLeave (DataGridViewCellEventArgs e)
3386 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3388 cell.OnMouseLeaveInternal (e.RowIndex);
3390 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellMouseLeaveEvent]);
3395 protected virtual void OnCellMouseMove (DataGridViewCellMouseEventArgs e)
3397 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3399 cell.OnMouseMoveInternal (e);
3401 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseMoveEvent]);
3406 protected virtual void OnCellMouseUp (DataGridViewCellMouseEventArgs e)
3408 DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
3410 cell.OnMouseUpInternal (e);
3412 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseUpEvent]);
3417 internal void OnCellPaintingInternal (DataGridViewCellPaintingEventArgs e)
3422 protected virtual void OnCellPainting (DataGridViewCellPaintingEventArgs e)
3424 DataGridViewCellPaintingEventHandler eh = (DataGridViewCellPaintingEventHandler)(Events [CellPaintingEvent]);
3429 protected internal virtual void OnCellParsing (DataGridViewCellParsingEventArgs e)
3431 DataGridViewCellParsingEventHandler eh = (DataGridViewCellParsingEventHandler)(Events [CellParsingEvent]);
3436 protected virtual void OnCellStateChanged (DataGridViewCellStateChangedEventArgs e)
3438 DataGridViewCellStateChangedEventHandler eh = (DataGridViewCellStateChangedEventHandler)(Events [CellStateChangedEvent]);
3443 protected virtual void OnCellStyleChanged (DataGridViewCellEventArgs e)
3445 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellStyleChangedEvent]);
3450 protected virtual void OnCellStyleContentChanged (DataGridViewCellStyleContentChangedEventArgs e) {
3451 DataGridViewCellStyleContentChangedEventHandler eh = (DataGridViewCellStyleContentChangedEventHandler)(Events [CellStyleContentChangedEvent]);
3456 protected virtual void OnCellToolTipTextChanged (DataGridViewCellEventArgs e) {
3457 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellToolTipTextChangedEvent]);
3462 protected virtual void OnCellToolTipTextNeeded (DataGridViewCellToolTipTextNeededEventArgs e)
3464 DataGridViewCellToolTipTextNeededEventHandler eh = (DataGridViewCellToolTipTextNeededEventHandler)(Events [CellToolTipTextNeededEvent]);
3469 protected virtual void OnCellValidated (DataGridViewCellEventArgs e)
3471 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellValidatedEvent]);
3476 protected virtual void OnCellValidating (DataGridViewCellValidatingEventArgs e)
3478 DataGridViewCellValidatingEventHandler eh = (DataGridViewCellValidatingEventHandler)(Events [CellValidatingEvent]);
3483 protected virtual void OnCellValueChanged (DataGridViewCellEventArgs e)
3485 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellValueChangedEvent]);
3490 protected virtual void OnCellValueNeeded (DataGridViewCellValueEventArgs e)
3492 DataGridViewCellValueEventHandler eh = (DataGridViewCellValueEventHandler)(Events [CellValueNeededEvent]);
3497 protected virtual void OnCellValuePushed (DataGridViewCellValueEventArgs e)
3499 DataGridViewCellValueEventHandler eh = (DataGridViewCellValueEventHandler)(Events [CellValuePushedEvent]);
3504 internal void OnColumnAddedInternal (DataGridViewColumnEventArgs e)
3506 if (e.Column.CellTemplate != null) {
3507 RowTemplate.Cells.Add ((DataGridViewCell)e.Column.CellTemplate.Clone ());
3509 foreach (DataGridViewRow row in Rows)
3510 row.Cells.Add ((DataGridViewCell)RowTemplate.Cells[RowTemplate.Cells.Count - 1].Clone ());
3513 AutoResizeColumnsInternal ();
3515 PrepareEditingRow (false, true);
3518 protected virtual void OnColumnAdded (DataGridViewColumnEventArgs e)
3520 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnAddedEvent]);
3525 protected internal virtual void OnColumnContextMenuStripChanged (DataGridViewColumnEventArgs e)
3527 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnContextMenuStripChangedEvent]);
3532 protected internal virtual void OnColumnDataPropertyNameChanged (DataGridViewColumnEventArgs e)
3534 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDataPropertyNameChangedEvent]);
3539 protected internal virtual void OnColumnDefaultCellStyleChanged (DataGridViewColumnEventArgs e)
3541 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDefaultCellStyleChangedEvent]);
3546 protected internal virtual void OnColumnDisplayIndexChanged (DataGridViewColumnEventArgs e)
3548 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDisplayIndexChangedEvent]);
3553 protected virtual void OnColumnDividerDoubleClick (DataGridViewColumnDividerDoubleClickEventArgs e)
3555 DataGridViewColumnDividerDoubleClickEventHandler eh = (DataGridViewColumnDividerDoubleClickEventHandler)(Events [ColumnDividerDoubleClickEvent]);
3560 protected internal virtual void OnColumnDividerWidthChanged (DataGridViewColumnEventArgs e)
3562 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDividerWidthChangedEvent]);
3567 protected internal virtual void OnColumnHeaderCellChanged (DataGridViewColumnEventArgs e)
3569 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnHeaderCellChangedEvent]);
3574 protected virtual void OnColumnHeaderMouseClick (DataGridViewCellMouseEventArgs e)
3576 DataGridViewColumn col = Columns[e.ColumnIndex];
3578 if (col.SortMode == DataGridViewColumnSortMode.Automatic) {
3579 ListSortDirection new_order;
3581 // Always use ascending unless we are clicking on a
3582 // column that is already sorted ascending.
3583 if (SortedColumn != col || sortOrder != SortOrder.Ascending)
3584 new_order = ListSortDirection.Ascending;
3586 new_order = ListSortDirection.Descending;
3588 Sort (col, new_order);
3591 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [ColumnHeaderMouseClickEvent]);
3596 protected virtual void OnColumnHeaderMouseDoubleClick (DataGridViewCellMouseEventArgs e)
3598 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [ColumnHeaderMouseDoubleClickEvent]);
3603 protected virtual void OnColumnHeadersBorderStyleChanged (EventArgs e)
3605 EventHandler eh = (EventHandler)(Events [ColumnHeadersBorderStyleChangedEvent]);
3610 protected virtual void OnColumnHeadersDefaultCellStyleChanged (EventArgs e)
3612 EventHandler eh = (EventHandler)(Events [ColumnHeadersDefaultCellStyleChangedEvent]);
3617 protected virtual void OnColumnHeadersHeightChanged (EventArgs e)
3619 EventHandler eh = (EventHandler)(Events [ColumnHeadersHeightChangedEvent]);
3624 protected virtual void OnColumnHeadersHeightSizeModeChanged (DataGridViewAutoSizeModeEventArgs e)
3626 DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [ColumnHeadersHeightSizeModeChangedEvent]);
3631 protected internal virtual void OnColumnMinimumWidthChanged (DataGridViewColumnEventArgs e)
3633 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnMinimumWidthChangedEvent]);
3638 protected internal virtual void OnColumnNameChanged (DataGridViewColumnEventArgs e)
3640 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnNameChangedEvent]);
3645 protected virtual void OnColumnRemoved (DataGridViewColumnEventArgs e)
3647 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnRemovedEvent]);
3652 protected internal virtual void OnColumnSortModeChanged (DataGridViewColumnEventArgs e)
3654 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnSortModeChangedEvent]);
3659 protected internal virtual void OnColumnStateChanged (DataGridViewColumnStateChangedEventArgs e)
3661 DataGridViewColumnStateChangedEventHandler eh = (DataGridViewColumnStateChangedEventHandler)(Events [ColumnStateChangedEvent]);
3666 protected internal virtual void OnColumnToolTipTextChanged (DataGridViewColumnEventArgs e)
3668 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnToolTipTextChangedEvent]);
3673 protected internal virtual void OnColumnWidthChanged (DataGridViewColumnEventArgs e)
3675 DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnWidthChangedEvent]);
3680 protected virtual void OnCurrentCellChanged (EventArgs e)
3682 EventHandler eh = (EventHandler)(Events [CurrentCellChangedEvent]);
3687 protected virtual void OnCurrentCellDirtyStateChanged (EventArgs e)
3689 EventHandler eh = (EventHandler)(Events [CurrentCellDirtyStateChangedEvent]);
3694 protected override void OnCursorChanged (EventArgs e)
3696 base.OnCursorChanged (e);
3699 protected virtual void OnDataBindingComplete (DataGridViewBindingCompleteEventArgs e)
3701 DataGridViewBindingCompleteEventHandler eh = (DataGridViewBindingCompleteEventHandler)(Events [DataBindingCompleteEvent]);
3706 protected virtual void OnDataError (bool displayErrorDialogIfNoHandler, DataGridViewDataErrorEventArgs e)
3708 DataGridViewDataErrorEventHandler eh = (DataGridViewDataErrorEventHandler)(Events [DataErrorEvent]);
3712 else if (displayErrorDialogIfNoHandler)
3713 MessageBox.Show (e.ToString ());
3715 protected virtual void OnDataMemberChanged (EventArgs e) {
3716 EventHandler eh = (EventHandler)(Events [DataMemberChangedEvent]);
3721 protected virtual void OnDataSourceChanged (EventArgs e) {
3722 EventHandler eh = (EventHandler)(Events [DataSourceChangedEvent]);
3727 protected virtual void OnDefaultCellStyleChanged (EventArgs e) {
3728 EventHandler eh = (EventHandler)(Events [DefaultCellStyleChangedEvent]);
3733 protected virtual void OnDefaultValuesNeeded (DataGridViewRowEventArgs e) {
3734 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [DefaultValuesNeededEvent]);
3739 protected override void OnDoubleClick (EventArgs e) {
3740 base.OnDoubleClick(e);
3743 protected virtual void OnEditingControlShowing (DataGridViewEditingControlShowingEventArgs e) {
3744 DataGridViewEditingControlShowingEventHandler eh = (DataGridViewEditingControlShowingEventHandler)(Events [EditingControlShowingEvent]);
3749 protected virtual void OnEditModeChanged (EventArgs e)
3751 EventHandler eh = (EventHandler)(Events [EditModeChangedEvent]);
3756 protected override void OnEnabledChanged (EventArgs e)
3758 base.OnEnabledChanged(e);
3761 protected override void OnEnter (EventArgs e )
3766 protected override void OnGotFocus(EventArgs e)
3768 base.OnGotFocus (e);
3770 // To add focus rectangle if needed
3771 if (currentCell != null && ShowFocusCues)
3772 InvalidateCell (currentCell);
3775 protected override void OnFontChanged (EventArgs e)
3777 base.OnFontChanged(e);
3780 protected override void OnForeColorChanged (EventArgs e)
3782 base.OnForeColorChanged(e);
3785 protected virtual void OnGridColorChanged (EventArgs e)
3787 EventHandler eh = (EventHandler)(Events [GridColorChangedEvent]);
3792 protected override void OnHandleCreated (EventArgs e)
3794 base.OnHandleCreated(e);
3796 if (Rows.Count > 0 && Columns.Count > 0)
3797 MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, false, false, false);
3800 protected override void OnHandleDestroyed(EventArgs e)
3802 base.OnHandleDestroyed (e);
3805 [EditorBrowsable (EditorBrowsableState.Advanced)]
3806 protected override void OnKeyDown (KeyEventArgs e)
3810 e.Handled = ProcessDataGridViewKey (e);
3813 [EditorBrowsable (EditorBrowsableState.Advanced)]
3814 protected override void OnKeyPress (KeyPressEventArgs e)
3819 [EditorBrowsable (EditorBrowsableState.Advanced)]
3820 protected override void OnKeyUp (KeyEventArgs e)
3825 protected override void OnLayout (LayoutEventArgs e)
3827 if (horizontalScrollBar.Visible && verticalScrollBar.Visible) {
3828 horizontalScrollBar.Bounds = new Rectangle (BorderWidth, Height - BorderWidth - horizontalScrollBar.Height, Width - (2 * BorderWidth) - verticalScrollBar.Width, horizontalScrollBar.Height);
3829 verticalScrollBar.Bounds = new Rectangle (Width - BorderWidth - verticalScrollBar.Width, BorderWidth, verticalScrollBar.Width, Height - (2 * BorderWidth) - horizontalScrollBar.Height);
3830 } else if (horizontalScrollBar.Visible)
3831 horizontalScrollBar.Bounds = new Rectangle (BorderWidth, Height - BorderWidth - horizontalScrollBar.Height, Width - (2 * BorderWidth), horizontalScrollBar.Height);
3832 else if (verticalScrollBar.Visible)
3833 verticalScrollBar.Bounds = new Rectangle (Width - BorderWidth - verticalScrollBar.Width, BorderWidth, verticalScrollBar.Width, Height - (2 * BorderWidth));
3838 protected override void OnLeave (EventArgs e)
3843 protected override void OnLostFocus(EventArgs e)
3845 base.OnLostFocus (e);
3847 // To remove focus rectangle if needed
3848 if (currentCell != null && ShowFocusCues)
3849 InvalidateCell (currentCell);
3852 protected override void OnMouseClick (MouseEventArgs e)
3854 base.OnMouseClick(e);
3855 //Console.WriteLine("Mouse: Clicks: {0}; Delta: {1}; X: {2}; Y: {3};", e.Clicks, e.Delta, e.X, e.Y);
3856 HitTestInfo hit = HitTest (e.X, e.Y);
3859 case DataGridViewHitTestType.Cell:
3860 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
3861 Point cellpoint = new Point (e.X - display.X, e.Y - display.Y);
3863 OnCellMouseClick (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, cellpoint.X, cellpoint.Y, e));
3865 DataGridViewCell cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex);
3867 if (cell.GetContentBounds (hit.RowIndex).Contains (cellpoint))
3868 cell.OnContentClickInternal (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex));
3871 case DataGridViewHitTestType.ColumnHeader:
3872 Rectangle display2 = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
3873 Point cellpoint2 = new Point (e.X - display2.X, e.Y - display2.Y);
3875 OnColumnHeaderMouseClick (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, cellpoint2.X, cellpoint2.Y, e));
3880 protected override void OnMouseDoubleClick (MouseEventArgs e)
3882 base.OnMouseDoubleClick(e);
3885 private void DoSelectionOnMouseDown (HitTestInfo hitTest)
3887 Keys modifiers = Control.ModifierKeys;
3888 bool isControl = (modifiers & Keys.Control) != 0;
3889 bool isShift = (modifiers & Keys.Shift) != 0;
3890 //bool isRowHeader = hitTest.Type == DataGridViewHitTestType.RowHeader;
3891 //bool isColHeader = hitTest.Type == DataGridViewHitTestType.ColumnHeader;
3892 DataGridViewSelectionMode mode;
3894 switch (hitTest.Type) {
3895 case DataGridViewHitTestType.Cell:
3896 mode = selectionMode;
3898 case DataGridViewHitTestType.ColumnHeader:
3899 mode = selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect ? DataGridViewSelectionMode.FullColumnSelect : selectionMode;
3901 if (mode != DataGridViewSelectionMode.FullColumnSelect)
3904 case DataGridViewHitTestType.RowHeader:
3905 mode = selectionMode == DataGridViewSelectionMode.RowHeaderSelect ? DataGridViewSelectionMode.FullRowSelect : selectionMode;
3907 if (mode != DataGridViewSelectionMode.FullRowSelect)
3909 break; // Handled below
3915 // If SHIFT is pressed:
3916 // Select all from selected_row/column/cell to current row/column/cell, unselect everything else
3918 // Unselect all rows/columns/cells, select the clicked one
3919 int min_row, max_row;
3920 int min_col, max_col;
3922 selected_row = hitTest.RowIndex;
3923 selected_column = hitTest.ColumnIndex;
3926 if (selected_row != -1)
3927 selected_row = hitTest.RowIndex;
3928 if (selected_column != -1)
3929 selected_column = hitTest.ColumnIndex;
3931 if (selected_row >= hitTest.RowIndex) {
3932 min_row = hitTest.RowIndex;
3933 max_row = isShift ? selected_row : min_row;
3935 max_row = hitTest.RowIndex;
3936 min_row = isShift ? selected_row : max_row;
3938 if (selected_column >= hitTest.ColumnIndex) {
3939 min_col = hitTest.ColumnIndex;
3940 max_col = isShift ? selected_column : min_col;
3942 max_col = hitTest.ColumnIndex;
3943 min_col = isShift ? selected_column : max_col;
3947 case DataGridViewSelectionMode.FullRowSelect:
3948 for (int i = 0; i < RowCount; i++) {
3949 bool select = i >= min_row && i <= max_row;
3951 for (int c = 0; c < ColumnCount; c++) {
3952 if (Rows [i].Cells [c].Selected) {
3953 SetSelectedCellCore (c, i, false);
3957 if (select != Rows [i].Selected) {
3958 SetSelectedRowCore (i, select);
3962 case DataGridViewSelectionMode.FullColumnSelect:
3963 for (int i = 0; i < ColumnCount; i++) {
3964 bool select = i >= min_col && i <= max_col;
3966 for (int r = 0; r < RowCount; r++) {
3967 if (Rows [r].Cells [i].Selected) {
3968 SetSelectedCellCore (i, r, false);
3972 if (select != Columns [i].Selected) {
3973 SetSelectedColumnCore (i, select);
3977 case DataGridViewSelectionMode.ColumnHeaderSelect:
3978 case DataGridViewSelectionMode.RowHeaderSelect:
3980 case DataGridViewSelectionMode.CellSelect:
3982 for (int c = 0; c < ColumnCount; c++) {
3983 if (columns [c].Selected)
3984 SetSelectedColumnCore (c, false);
3987 for (int r = 0; r < RowCount; r++) {
3988 if (rows [r].Selected)
3989 SetSelectedRowCore (r, false);
3992 for (int r = 0; r < RowCount; r++) {
3993 for (int c = 0; c < ColumnCount; c++) {
3994 bool select = (r >= min_row && r <= max_row) && (c >= min_col && c <= max_col);
3995 if (select != Rows [r].Cells [c].Selected)
3996 SetSelectedCellCore (c, r, select);
4002 } else if (isControl) {
4003 // Switch the selected state of the row.
4005 case DataGridViewSelectionMode.FullRowSelect:
4006 SetSelectedRowCore (hitTest.RowIndex, !rows [hitTest.RowIndex].Selected);
4008 case DataGridViewSelectionMode.FullColumnSelect:
4009 SetSelectedColumnCore (hitTest.ColumnIndex, !columns [hitTest.ColumnIndex].Selected);
4011 case DataGridViewSelectionMode.ColumnHeaderSelect:
4012 case DataGridViewSelectionMode.RowHeaderSelect:
4014 case DataGridViewSelectionMode.CellSelect:
4015 if (hitTest.ColumnIndex >= 0 && hitTest.RowIndex >= 0) {
4016 SetSelectedCellCore (hitTest.ColumnIndex, hitTest.RowIndex, !Rows [hitTest.RowIndex].Cells [hitTest.ColumnIndex].Selected);
4024 protected override void OnMouseDown (MouseEventArgs e)
4026 base.OnMouseDown(e);
4028 HitTestInfo hitTest = HitTest(e.X, e.Y);
4030 DataGridViewCell cell = null;
4031 DataGridViewRow row = null;
4032 Rectangle cellBounds;
4034 if (hitTest.Type == DataGridViewHitTestType.Cell) {
4035 cellBounds = GetCellDisplayRectangle (hitTest.ColumnIndex, hitTest.RowIndex, false);
4036 OnCellMouseDown (new DataGridViewCellMouseEventArgs (hitTest.ColumnIndex, hitTest.RowIndex, e.X - cellBounds.X, e.Y - cellBounds.Y, e));
4037 OnCellClick (new DataGridViewCellEventArgs (hitTest.ColumnIndex, hitTest.RowIndex));
4038 row = rows [hitTest.RowIndex];
4039 cell = row.Cells [hitTest.ColumnIndex];
4042 DoSelectionOnMouseDown (hitTest);
4044 if (hitTest.Type != DataGridViewHitTestType.Cell) {
4045 if (hitTest.Type == DataGridViewHitTestType.ColumnHeader)
4046 pressed_header_cell = columns [hitTest.ColumnIndex].HeaderCell;
4047 else if (hitTest.Type == DataGridViewHitTestType.RowHeader)
4048 pressed_header_cell = rows [hitTest.RowIndex].HeaderCell;
4053 if (cell == currentCell) {
4055 } else if (currentCell != null) {
4057 OnCellLeave(new DataGridViewCellEventArgs(currentCell.ColumnIndex, currentCell.RowIndex));
4060 currentCellAddress = new Point (currentCell.ColumnIndex, currentCell.RowIndex);
4061 currentRow = cell.OwningRow;
4062 OnCurrentCellChanged(EventArgs.Empty);
4063 OnCellEnter(new DataGridViewCellEventArgs(cell.ColumnIndex, cell.RowIndex));
4064 if (editMode == DataGridViewEditMode.EditOnEnter) {
4071 protected override void OnMouseEnter (EventArgs e)
4073 base.OnMouseEnter(e);
4076 protected override void OnMouseLeave (EventArgs e)
4078 base.OnMouseLeave (e);
4080 if (hover_cell != null) {
4081 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4085 EnteredHeaderCell = null;
4088 protected override void OnMouseMove (MouseEventArgs e)
4090 base.OnMouseMove (e);
4092 HitTestInfo hit = this.HitTest (e.X, e.Y);
4094 if (hit.Type == DataGridViewHitTestType.Cell) {
4095 EnteredHeaderCell = null;
4097 DataGridViewCell new_cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex);
4099 // Check if we have moved into an error icon area
4100 Rectangle icon = new_cell.ErrorIconBounds;
4102 if (!icon.IsEmpty) {
4103 Point loc = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false).Location;
4108 if (icon.Contains (e.X, e.Y)) {
4109 if (tooltip_currently_showing != new_cell)
4110 MouseEnteredErrorIcon (new_cell);
4112 MouseLeftErrorIcon (new_cell);
4115 // We have never been in a cell before
4116 if (hover_cell == null) {
4117 hover_cell = new_cell;
4118 OnCellMouseEnter (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex));
4120 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4121 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4126 // Were we already in this cell?
4127 if (hover_cell.RowIndex == hit.RowIndex && hover_cell.ColumnIndex == hit.ColumnIndex) {
4128 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4129 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4134 // We are changing cells
4135 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4137 hover_cell = new_cell;
4139 OnCellMouseEnter (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex));
4141 Rectangle display2 = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4142 OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display2.X, e.Y - display2.Y, e));
4145 } else if (hit.Type == DataGridViewHitTestType.RowHeader) {
4146 DataGridViewRowHeaderCell new_cell = Rows[hit.RowIndex].HeaderCell;
4148 EnteredHeaderCell = new_cell;
4150 // Check if we have moved into an error icon area
4151 Rectangle icon = new_cell.InternalErrorIconsBounds;
4153 if (!icon.IsEmpty) {
4154 Point loc = GetCellDisplayRectangle (0, hit.RowIndex, false).Location;
4156 icon.X += BorderWidth;
4159 if (icon.Contains (e.X, e.Y)) {
4160 if (tooltip_currently_showing != new_cell)
4161 MouseEnteredErrorIcon (new_cell);
4163 MouseLeftErrorIcon (new_cell);
4165 } else if (hit.Type == DataGridViewHitTestType.TopLeftHeader) {
4166 EnteredHeaderCell = null;
4168 DataGridViewTopLeftHeaderCell new_cell = (DataGridViewTopLeftHeaderCell)TopLeftHeaderCell;
4170 // Check if we have moved into an error icon area
4171 Rectangle icon = new_cell.InternalErrorIconsBounds;
4173 if (!icon.IsEmpty) {
4174 Point loc = Point.Empty;
4176 icon.X += BorderWidth;
4179 if (icon.Contains (e.X, e.Y)) {
4180 if (tooltip_currently_showing != new_cell)
4181 MouseEnteredErrorIcon (new_cell);
4183 MouseLeftErrorIcon (new_cell);
4187 if (hit.Type == DataGridViewHitTestType.ColumnHeader)
4188 EnteredHeaderCell = Columns [hit.ColumnIndex].HeaderCell;
4190 EnteredHeaderCell = null;
4192 // We have left the cell area
4193 if (hover_cell != null) {
4194 OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
4200 protected override void OnMouseUp (MouseEventArgs e)
4204 HitTestInfo hit = this.HitTest (e.X, e.Y);
4206 if (hit.Type == DataGridViewHitTestType.Cell) {
4207 Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
4208 OnCellMouseUp (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
4211 if (pressed_header_cell != null) {
4212 DataGridViewHeaderCell cell = pressed_header_cell;
4213 pressed_header_cell = null;
4214 if (ThemeEngine.Current.DataGridViewHeaderCellHasPressedStyle (this))
4215 Invalidate (GetHeaderCellBounds (cell));
4219 protected override void OnMouseWheel (MouseEventArgs e)
4221 base.OnMouseWheel(e);
4224 protected virtual void OnMultiSelectChanged (EventArgs e)
4226 EventHandler eh = (EventHandler)(Events [MultiSelectChangedEvent]);
4227 if (eh != null) eh (this, e);
4230 protected virtual void OnNewRowNeeded (DataGridViewRowEventArgs e) {
4231 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [NewRowNeededEvent]);
4232 if (eh != null) eh (this, e);
4235 int first_row_index = 0;
4236 internal int first_col_index = 0;
4238 protected override void OnPaint (PaintEventArgs e)
4242 Graphics g = e.Graphics;
4243 Rectangle bounds = ClientRectangle;
4245 // Paint the background
4246 PaintBackground (g, e.ClipRectangle, bounds);
4248 List<DataGridViewColumn> sortedColumns = columns.ColumnDisplayIndexSortedArrayList;
4250 // Take borders into account
4251 bounds.Inflate (-BorderWidth, -BorderWidth);
4253 // Paint the top left cell
4254 if (rowHeadersVisible && columnHeadersVisible && ColumnCount > 0) {
4255 Rectangle topleftbounds = new Rectangle (bounds.X, bounds.Y, rowHeadersWidth, columnHeadersHeight);
4257 TopLeftHeaderCell.PaintWork (g, e.ClipRectangle, topleftbounds, -1, TopLeftHeaderCell.State, ColumnHeadersDefaultCellStyle, AdvancedColumnHeadersBorderStyle, DataGridViewPaintParts.All);
4260 // Paint the column headers
4261 if (columnHeadersVisible) {
4262 Rectangle headerBounds = bounds;
4263 headerBounds.Height = columnHeadersHeight;
4265 if (rowHeadersVisible)
4266 headerBounds.X += rowHeadersWidth;
4268 for (int index = first_col_index; index < sortedColumns.Count; index++) {
4269 DataGridViewColumn col = sortedColumns[index];
4274 headerBounds.Width = col.Width;
4275 DataGridViewCell cell = col.HeaderCell;
4277 DataGridViewAdvancedBorderStyle intermediateBorderStyle = (DataGridViewAdvancedBorderStyle)((ICloneable)this.AdvancedColumnHeadersBorderStyle).Clone ();
4278 DataGridViewAdvancedBorderStyle borderStyle = AdjustColumnHeaderBorderStyle (this.AdvancedColumnHeadersBorderStyle, intermediateBorderStyle, cell.ColumnIndex == 0, cell.ColumnIndex == columns.Count - 1);
4280 cell.PaintWork (g, e.ClipRectangle, headerBounds, -1, cell.State, columnHeadersDefaultCellStyle, borderStyle, DataGridViewPaintParts.All);
4282 headerBounds.X += col.Width;
4285 bounds.Y += columnHeadersHeight;
4288 gridWidth = rowHeadersVisible ? rowHeadersWidth : 0;
4291 int rows_displayed = 0;
4292 int first_row_height = Rows.Count > 0 ? Rows[Math.Min (Rows.Count - 1, first_row_index)].Height : 0;
4293 int room_left = this.Height;
4295 // Reset all columns to !Displayed
4296 for (int i = 0; i < Columns.Count; i++)
4297 Columns[i].DisplayedInternal = false;
4299 // Set Displayed columns
4300 for (int i = first_col_index; i < Columns.Count; i++) {
4301 DataGridViewColumn col = Columns.ColumnDisplayIndexSortedArrayList[i];
4306 col.DisplayedInternal = true;
4307 gridWidth += col.Width;
4309 if (gridWidth >= Width)
4313 // Reset all rows to !Displayed
4314 for (int i = 0; i < Rows.Count; i++)
4315 GetRowInternal (i).DisplayedInternal = false;
4318 for (int index = first_row_index; index < Rows.Count; index++) {
4319 DataGridViewRow row = Rows[index];
4320 GetRowInternal (index).DisplayedInternal = true;
4322 bounds.Height = row.Height;
4323 bool is_first = row.Index == 0;
4324 bool is_last = row.Index == rows.Count - 1;
4326 row.Paint (g, e.ClipRectangle, bounds, row.Index, row.GetState (row.Index), is_first, is_last);
4328 bounds.Y += bounds.Height;
4329 bounds.X = BorderWidth;
4331 if (bounds.Y < ClientSize.Height - (horizontalScrollBar.Visible ? horizontalScrollBar.Height : 0))
4336 gridHeight += row.Height;
4341 foreach (DataGridViewColumn col in sortedColumns)
4343 gridWidth += col.Width;
4347 foreach (DataGridViewRow row in Rows)
4348 gridHeight += row.Height;
4350 if (rowHeadersVisible)
4351 gridWidth += rowHeadersWidth;
4353 if (columnHeadersVisible)
4354 gridHeight += columnHeadersHeight;
4356 bool horizontalVisible = false;
4357 bool verticalVisible = false;
4360 if (gridWidth > Size.Width || gridHeight > Size.Height) {
4361 Size = new Size(gridWidth, gridHeight);
4365 if (gridWidth > Size.Width) {
4366 horizontalVisible = true;
4368 if (gridHeight > Size.Height) {
4369 verticalVisible = true;
4371 if (horizontalScrollBar.Visible && (gridHeight + horizontalScrollBar.Height) > Size.Height) {
4372 verticalVisible = true;
4374 if (verticalScrollBar.Visible && (gridWidth + verticalScrollBar.Width) > Size.Width) {
4375 horizontalVisible = true;
4377 if (horizontalVisible) {
4378 horizontalScrollBar.Minimum = 0;
4379 horizontalScrollBar.Maximum = gridWidth;
4380 horizontalScrollBar.SmallChange = Columns[first_col_index].Width;
4381 horizontalScrollBar.LargeChange = ClientSize.Width - rowHeadersWidth;
4383 if (verticalVisible) {
4384 verticalScrollBar.Minimum = 0;
4385 verticalScrollBar.Maximum = gridHeight;
4386 verticalScrollBar.SmallChange = first_row_height + 1;
4387 verticalScrollBar.LargeChange = ClientSize.Height - columnHeadersHeight;
4391 horizontalScrollBar.Visible = horizontalVisible;
4392 verticalScrollBar.Visible = verticalVisible;
4394 // Paint the bottom right square if both scrollbars are displayed
4395 if (horizontalScrollBar.Visible && verticalScrollBar.Visible)
4396 g.FillRectangle (SystemBrushes.Control, new Rectangle (horizontalScrollBar.Right, verticalScrollBar.Bottom, verticalScrollBar.Width, horizontalScrollBar.Height));
4399 bounds = ClientRectangle;
4401 switch (BorderStyle) {
4402 case BorderStyle.FixedSingle:
4403 g.DrawRectangle (Pens.Black, new Rectangle (bounds.Left, bounds.Top, bounds.Width - 1, bounds.Height - 1));
4405 case BorderStyle.Fixed3D:
4406 ControlPaint.DrawBorder3D (g, bounds, Border3DStyle.Sunken);
4411 protected virtual void OnReadOnlyChanged (EventArgs e) {
4412 EventHandler eh = (EventHandler)(Events [ReadOnlyChangedEvent]);
4417 protected override void OnResize (EventArgs e) {
4419 AutoResizeColumnsInternal ();
4421 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
4422 OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
4425 protected override void OnRightToLeftChanged (EventArgs e) {
4426 base.OnRightToLeftChanged(e);
4429 // In MSDN2 documentation there's no internal here
4430 protected internal virtual void OnRowContextMenuStripChanged (DataGridViewRowEventArgs e)
4432 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowContextMenuStripChangedEvent]);
4433 if (eh != null) eh (this, e);
4436 protected virtual void OnRowContextMenuStripNeeded (DataGridViewRowContextMenuStripNeededEventArgs e)
4438 DataGridViewRowContextMenuStripNeededEventHandler eh = (DataGridViewRowContextMenuStripNeededEventHandler)(Events [RowContextMenuStripNeededEvent]);
4439 if (eh != null) eh (this, e);
4442 protected internal virtual void OnRowDefaultCellStyleChanged (DataGridViewRowEventArgs e)
4444 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowDefaultCellStyleChangedEvent]);
4445 if (eh != null) eh (this, e);
4448 protected virtual void OnRowDirtyStateNeeded (QuestionEventArgs e)
4450 QuestionEventHandler eh = (QuestionEventHandler)(Events [RowDirtyStateNeededEvent]);
4451 if (eh != null) eh (this, e);
4454 protected virtual void OnRowDividerDoubleClick (DataGridViewRowDividerDoubleClickEventArgs e)
4456 DataGridViewRowDividerDoubleClickEventHandler eh = (DataGridViewRowDividerDoubleClickEventHandler)(Events [RowDividerDoubleClickEvent]);
4457 if (eh != null) eh (this, e);
4460 protected virtual void OnRowDividerHeightChanged (DataGridViewRowEventArgs e)
4462 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowDividerHeightChangedEvent]);
4463 if (eh != null) eh (this, e);
4466 protected virtual void OnRowEnter (DataGridViewCellEventArgs e)
4468 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowEnterEvent]);
4469 if (eh != null) eh (this, e);
4472 protected internal virtual void OnRowErrorTextChanged (DataGridViewRowEventArgs e)
4474 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowErrorTextChangedEvent]);
4475 if (eh != null) eh (this, e);
4478 protected virtual void OnRowErrorTextNeeded (DataGridViewRowErrorTextNeededEventArgs e)
4480 DataGridViewRowErrorTextNeededEventHandler eh = (DataGridViewRowErrorTextNeededEventHandler)(Events [RowErrorTextNeededEvent]);
4481 if (eh != null) eh (this, e);
4484 protected internal virtual void OnRowHeaderCellChanged (DataGridViewRowEventArgs e)
4486 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowHeaderCellChangedEvent]);
4487 if (eh != null) eh (this, e);
4490 protected virtual void OnRowHeaderMouseClick (DataGridViewCellMouseEventArgs e)
4492 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [RowHeaderMouseClickEvent]);
4493 if (eh != null) eh (this, e);
4496 protected virtual void OnRowHeaderMouseDoubleClick (DataGridViewCellMouseEventArgs e)
4498 DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [RowHeaderMouseDoubleClickEvent]);
4499 if (eh != null) eh (this, e);
4502 protected virtual void OnRowHeadersBorderStyleChanged (EventArgs e)
4504 EventHandler eh = (EventHandler)(Events [RowHeadersBorderStyleChangedEvent]);
4505 if (eh != null) eh (this, e);
4508 protected virtual void OnRowHeadersDefaultCellStyleChanged (EventArgs e)
4510 EventHandler eh = (EventHandler)(Events [RowHeadersDefaultCellStyleChangedEvent]);
4511 if (eh != null) eh (this, e);
4514 protected virtual void OnRowHeadersWidthChanged (EventArgs e)
4516 EventHandler eh = (EventHandler)(Events [RowHeadersWidthChangedEvent]);
4517 if (eh != null) eh (this, e);
4520 protected virtual void OnRowHeadersWidthSizeModeChanged (DataGridViewAutoSizeModeEventArgs e)
4522 DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [RowHeadersWidthSizeModeChangedEvent]);
4523 if (eh != null) eh (this, e);
4526 protected internal virtual void OnRowHeightChanged (DataGridViewRowEventArgs e)
4528 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowHeightChangedEvent]);
4529 if (eh != null) eh (this, e);
4532 protected virtual void OnRowHeightInfoNeeded (DataGridViewRowHeightInfoNeededEventArgs e)
4534 DataGridViewRowHeightInfoNeededEventHandler eh = (DataGridViewRowHeightInfoNeededEventHandler)(Events [RowHeightInfoNeededEvent]);
4535 if (eh != null) eh (this, e);
4538 protected virtual void OnRowHeightInfoPushed (DataGridViewRowHeightInfoPushedEventArgs e)
4540 DataGridViewRowHeightInfoPushedEventHandler eh = (DataGridViewRowHeightInfoPushedEventHandler)(Events [RowHeightInfoPushedEvent]);
4541 if (eh != null) eh (this, e);
4544 protected virtual void OnRowLeave (DataGridViewCellEventArgs e)
4546 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowLeaveEvent]);
4547 if (eh != null) eh (this, e);
4550 protected internal virtual void OnRowMinimumHeightChanged (DataGridViewRowEventArgs e)
4552 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowMinimumHeightChangedEvent]);
4553 if (eh != null) eh (this, e);
4556 protected internal virtual void OnRowPostPaint (DataGridViewRowPostPaintEventArgs e)
4558 DataGridViewRowPostPaintEventHandler eh = (DataGridViewRowPostPaintEventHandler)(Events [RowPostPaintEvent]);
4559 if (eh != null) eh (this, e);
4562 protected internal virtual void OnRowPrePaint (DataGridViewRowPrePaintEventArgs e)
4564 DataGridViewRowPrePaintEventHandler eh = (DataGridViewRowPrePaintEventHandler)(Events [RowPrePaintEvent]);
4565 if (eh != null) eh (this, e);
4568 internal void OnRowsAddedInternal (DataGridViewRowsAddedEventArgs e)
4574 protected internal virtual void OnRowsAdded (DataGridViewRowsAddedEventArgs e)
4576 DataGridViewRowsAddedEventHandler eh = (DataGridViewRowsAddedEventHandler)(Events [RowsAddedEvent]);
4577 if (eh != null) eh (this, e);
4580 protected virtual void OnRowsDefaultCellStyleChanged (EventArgs e)
4582 EventHandler eh = (EventHandler)(Events [RowsDefaultCellStyleChangedEvent]);
4583 if (eh != null) eh (this, e);
4586 protected internal virtual void OnRowsRemoved (DataGridViewRowsRemovedEventArgs e)
4588 DataGridViewRowsRemovedEventHandler eh = (DataGridViewRowsRemovedEventHandler)(Events [RowsRemovedEvent]);
4589 if (eh != null) eh (this, e);
4592 protected internal virtual void OnRowStateChanged (int rowIndex, DataGridViewRowStateChangedEventArgs e)
4594 DataGridViewRowStateChangedEventHandler eh = (DataGridViewRowStateChangedEventHandler)(Events [RowStateChangedEvent]);
4595 if (eh != null) eh (this, e);
4598 protected virtual void OnRowUnshared (DataGridViewRowEventArgs e)
4600 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowUnsharedEvent]);
4601 if (eh != null) eh (this, e);
4604 protected virtual void OnRowValidated (DataGridViewCellEventArgs e)
4606 DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowValidatedEvent]);
4607 if (eh != null) eh (this, e);
4610 protected virtual void OnRowValidating (DataGridViewCellCancelEventArgs e)
4612 DataGridViewCellCancelEventHandler eh = (DataGridViewCellCancelEventHandler)(Events [RowValidatingEvent]);
4613 if (eh != null) eh (this, e);
4616 protected virtual void OnScroll (ScrollEventArgs e)
4618 ScrollEventHandler eh = (ScrollEventHandler)(Events [ScrollEvent]);
4619 if (eh != null) eh (this, e);
4622 protected virtual void OnSelectionChanged (EventArgs e)
4624 EventHandler eh = (EventHandler)(Events [SelectionChangedEvent]);
4625 if (eh != null) eh (this, e);
4628 protected virtual void OnSortCompare (DataGridViewSortCompareEventArgs e) {
4629 DataGridViewSortCompareEventHandler eh = (DataGridViewSortCompareEventHandler)(Events [SortCompareEvent]);
4630 if (eh != null) eh (this, e);
4633 protected virtual void OnSorted (EventArgs e)
4635 EventHandler eh = (EventHandler)(Events [SortedEvent]);
4636 if (eh != null) eh (this, e);
4639 protected virtual void OnUserAddedRow (DataGridViewRowEventArgs e)
4641 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [UserAddedRowEvent]);
4642 if (eh != null) eh (this, e);
4645 protected virtual void OnUserDeletedRow (DataGridViewRowEventArgs e)
4647 DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [UserDeletedRowEvent]);
4648 if (eh != null) eh (this, e);
4652 protected virtual void OnUserDeletingRow (DataGridViewRowCancelEventArgs e)
4654 DataGridViewRowCancelEventHandler eh = (DataGridViewRowCancelEventHandler)(Events [UserDeletingRowEvent]);
4655 if (eh != null) eh (this, e);
4658 protected override void OnValidating (CancelEventArgs e)
4660 base.OnValidating(e);
4663 protected override void OnVisibleChanged (EventArgs e)
4665 base.OnVisibleChanged(e);
4668 protected virtual void PaintBackground (Graphics graphics, Rectangle clipBounds, Rectangle gridBounds)
4670 graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (backgroundColor), gridBounds);
4673 protected bool ProcessAKey (Keys keyData)
4678 if ((keyData & Keys.Control) == Keys.Control) {
4686 protected virtual bool ProcessDataGridViewKey (KeyEventArgs e)
4688 switch (e.KeyData & ~Keys.Modifiers) {
4690 return ProcessAKey (e.KeyData);
4692 return ProcessDeleteKey (e.KeyData);
4694 return ProcessDownKey (e.KeyData);
4696 return ProcessEscapeKey (e.KeyData);
4698 return ProcessEndKey (e.KeyData);
4700 return ProcessEnterKey (e.KeyData);
4702 return ProcessF2Key (e.KeyData);
4704 return ProcessHomeKey (e.KeyData);
4706 return ProcessLeftKey (e.KeyData);
4708 return ProcessNextKey (e.KeyData);
4710 return ProcessPriorKey (e.KeyData);
4712 return ProcessRightKey (e.KeyData);
4714 return ProcessSpaceKey (e.KeyData);
4716 case Keys.Shift | Keys.Tab:
4717 case Keys.Control | Keys.Tab:
4718 case Keys.Control | Keys.Shift | Keys.Tab:
4719 return ProcessTabKey (e.KeyData);
4721 return ProcessUpKey (e.KeyData);
4724 return ProcessZeroKey (e.KeyData);
4730 protected bool ProcessDeleteKey (Keys keyData)
4732 if (!allowUserToDeleteRows || SelectedRows.Count == 0)
4735 int index = Math.Max (selected_row - SelectedRows.Count + 1, 0);
4737 for (int i = SelectedRows.Count - 1; i >= 0; i--) {
4738 DataGridViewRow row = SelectedRows[i];
4743 if (hover_cell != null && hover_cell.OwningRow == row)
4746 if (DataSource != null && DataSource is DataSet)
4747 (DataSource as DataSet).Tables[dataMember].Rows.RemoveAt (row.Index);
4749 Rows.RemoveAt (row.Index);
4752 if (selected_rows != null)
4753 selected_rows.InternalClear ();
4754 if (selected_columns != null)
4755 selected_columns.InternalClear ();
4757 SetSelectedCellCore (0, Math.Min (index, Rows.Count - 1), true);
4762 protected override bool ProcessDialogKey (Keys keyData)
4766 case Keys.Shift | Keys.Tab:
4768 return base.ProcessDialogKey (keyData & ~Keys.Control);
4770 if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
4774 case Keys.Control | Keys.Tab:
4775 case Keys.Control | Keys.Shift | Keys.Tab:
4777 return base.ProcessDialogKey (keyData & ~Keys.Control);
4779 if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
4785 return base.ProcessDialogKey(keyData);
4788 protected bool ProcessDownKey (Keys keyData)
4790 int current_row = CurrentCellAddress.Y;
4792 if (current_row < Rows.Count - 1) {
4795 // Move to the last cell in the column
4796 if ((keyData & Keys.Control) == Keys.Control)
4797 MoveCurrentCell (CurrentCellAddress.X, Rows.Count - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
4798 // Move one cell down
4800 MoveCurrentCell (CurrentCellAddress.X, current_row + 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
4808 protected bool ProcessEndKey (Keys keyData)
4810 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
4812 // Move to the last cell in the control
4813 if ((keyData & Keys.Control) == Keys.Control) {
4814 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), Rows.Count - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
4818 // Move to the last cell in the row
4819 if (disp_index < Columns.Count - 1) {
4820 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
4827 protected bool ProcessEnterKey (Keys keyData)
4829 if (!IsCurrentCellInEditMode)
4832 CommitEdit (DataGridViewDataErrorContexts.Commit);
4834 // Move one cell down
4835 if ((keyData & Keys.Control) == 0) {
4836 int current_row = CurrentCellAddress.Y;
4838 if (current_row < Rows.Count - 1)
4839 MoveCurrentCell (CurrentCellAddress.X, current_row + 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
4845 protected bool ProcessEscapeKey (Keys keyData)
4847 if (!IsCurrentCellInEditMode)
4854 protected bool ProcessF2Key (Keys keyData)
4856 if (editMode == DataGridViewEditMode.EditOnF2 || editMode == DataGridViewEditMode.EditOnKeystrokeOrF2) {
4864 protected bool ProcessHomeKey (Keys keyData)
4866 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
4868 // Move to the first cell in the control
4869 if ((keyData & Keys.Control) == Keys.Control) {
4870 MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
4874 // Move to the first cell in the row
4875 if (disp_index > 0) {
4876 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
4883 [MonoTODO ("What does insert do?")]
4884 protected bool ProcessInsertKey (Keys keyData)
4889 protected override bool ProcessKeyEventArgs (ref Message m)
4891 DataGridViewCell cell = CurrentCell;
4894 if (cell.KeyEntersEditMode (new KeyEventArgs ((Keys)m.WParam.ToInt32 ())))
4897 return base.ProcessKeyEventArgs (ref m);
4900 protected override bool ProcessKeyPreview (ref Message m)
4902 if ((Msg)m.Msg == Msg.WM_KEYDOWN && (IsCurrentCellInEditMode || m.HWnd == horizontalScrollBar.Handle || m.HWnd == verticalScrollBar.Handle)) {
4903 KeyEventArgs e = new KeyEventArgs ((Keys)m.WParam.ToInt32 ());
4905 IDataGridViewEditingControl ctrl = (IDataGridViewEditingControl)EditingControlInternal;
4908 if (ctrl.EditingControlWantsInputKey (e.KeyData, false))
4911 switch (e.KeyData) {
4920 return ProcessDataGridViewKey (e);
4924 return base.ProcessKeyPreview (ref m);
4927 protected bool ProcessLeftKey (Keys keyData)
4929 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
4931 if (disp_index > 0) {
4934 // Move to the first cell in the row
4935 if ((keyData & Keys.Control) == Keys.Control)
4936 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
4937 // Move one cell to the left
4939 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
4948 protected bool ProcessNextKey (Keys keyData)
4950 int current_row = CurrentCellAddress.Y;
4952 if (current_row < Rows.Count - 1) {
4955 // Move one "page" of cells down
4956 int new_row = Math.Min (Rows.Count - 1, current_row + DisplayedRowCount (false));
4958 MoveCurrentCell (CurrentCellAddress.X, new_row, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
4967 protected bool ProcessPriorKey (Keys keyData)
4969 int current_row = CurrentCellAddress.Y;
4971 if (current_row > 0) {
4974 // Move one "page" of cells up
4975 int new_row = Math.Max (0, current_row - DisplayedRowCount (false));
4977 MoveCurrentCell (CurrentCellAddress.X, new_row, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
4985 protected bool ProcessRightKey (Keys keyData)
4987 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
4989 if (disp_index < Columns.Count - 1) {
4992 // Move to the last cell in the row
4993 if ((keyData & Keys.Control) == Keys.Control)
4994 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
4995 // Move one cell to the right
4997 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index + 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5005 protected bool ProcessSpaceKey (Keys keyData)
5007 if ((keyData & Keys.Shift) == Keys.Shift) {
5008 if (selectionMode == DataGridViewSelectionMode.RowHeaderSelect) {
5009 SetSelectedRowCore (CurrentCellAddress.Y, true);
5010 InvalidateRow (CurrentCellAddress.Y);
5013 if (selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect) {
5014 SetSelectedColumnCore (CurrentCellAddress.X, true);
5015 InvalidateColumn (CurrentCellAddress.X);
5020 if (CurrentCell is DataGridViewButtonCell || CurrentCell is DataGridViewLinkCell || CurrentCell is DataGridViewCheckBoxCell) {
5021 DataGridViewCellEventArgs e = new DataGridViewCellEventArgs (CurrentCell.ColumnIndex, CurrentCell.RowIndex);
5024 OnCellContentClick (e);
5026 if (CurrentCell is DataGridViewButtonCell)
5027 (CurrentCell as DataGridViewButtonCell).OnClickInternal (e);
5028 if (CurrentCell is DataGridViewCheckBoxCell)
5029 (CurrentCell as DataGridViewCheckBoxCell).OnClickInternal (e);
5037 protected bool ProcessTabKey (Keys keyData)
5041 Form f = FindForm ();
5044 f.ActivateFocusCues ();
5046 int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
5049 // Shift-tab goes backwards
5050 if ((keyData & Keys.Shift) == Keys.Shift) {
5051 if (disp_index > 0) {
5052 // Move one cell to the left
5053 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, false, true);
5055 } else if (currentCellAddress.Y > 0) {
5056 // Move to the last cell in the previous row
5057 MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y - 1, true, false, false, true);
5062 if (disp_index < Columns.Count - 1) {
5063 // Move one cell to the right
5064 MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index + 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, false, true);
5067 } else if (currentCellAddress.Y < Rows.Count - 1) {
5068 // Move to the first cell in the next row
5069 MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y + 1, true, false, false, true);
5079 protected bool ProcessUpKey (Keys keyData)
5081 int current_row = CurrentCellAddress.Y;
5083 if (current_row > 0) {
5086 // Move to the first cell in the column
5087 if ((keyData & Keys.Control) == Keys.Control)
5088 MoveCurrentCell (CurrentCellAddress.X, 0, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5091 MoveCurrentCell (CurrentCellAddress.X, current_row - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
5099 protected bool ProcessZeroKey (Keys keyData)
5101 if ((keyData & Keys.Control) == Keys.Control && CurrentCell.EditType != null) {
5102 CurrentCell.Value = DBNull.Value;
5103 InvalidateCell (CurrentCell);
5110 protected override void SetBoundsCore (int x, int y, int width, int height, BoundsSpecified specified) {
5111 base.SetBoundsCore(x, y, width, height, specified);
5114 [MonoTODO ("Does not use validateCurrentCell or throughMouseClick")]
5115 protected virtual bool SetCurrentCellAddressCore (int columnIndex, int rowIndex, bool setAnchorCellAddress, bool validateCurrentCell, bool throughMouseClick)
5117 if ((columnIndex < 0 || columnIndex > Columns.Count - 1) && rowIndex != -1)
5118 throw new ArgumentOutOfRangeException ("columnIndex");
5119 if ((rowIndex < 0 || rowIndex > Rows.Count - 1) && columnIndex != -1)
5120 throw new ArgumentOutOfRangeException ("rowIndex");
5122 DataGridViewCell cell;
5124 if (columnIndex == -1 && rowIndex == -1)
5127 cell = Rows.SharedRow (rowIndex).Cells[columnIndex];
5129 if (cell != null && !cell.Visible)
5130 throw new InvalidOperationException ("cell is not visible");
5132 if (setAnchorCellAddress)
5133 anchor_cell = new Point (columnIndex, rowIndex);
5135 currentCellAddress = new Point (columnIndex, rowIndex);
5138 OnCurrentCellChanged (EventArgs.Empty);
5143 protected virtual void SetSelectedCellCore (int columnIndex, int rowIndex, bool selected) {
5144 rows [rowIndex].Cells [columnIndex].Selected = selected;
5146 OnSelectionChanged (EventArgs.Empty);
5149 internal void SetSelectedColumnCoreInternal (int columnIndex, bool selected) {
5150 SetSelectedColumnCore (columnIndex, selected);
5153 protected virtual void SetSelectedColumnCore (int columnIndex, bool selected) {
5154 if (selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect && selectionMode != DataGridViewSelectionMode.FullColumnSelect)
5157 DataGridViewColumn col = columns [columnIndex];
5159 col.SelectedInternal = selected;
5161 if (selected_columns == null)
5162 selected_columns = new DataGridViewSelectedColumnCollection ();
5164 if (!selected && selected_columns.Contains (col)) {
5165 selected_columns.InternalRemove (col);
5166 } else if (selected && !selected_columns.Contains (col)) {
5167 selected_columns.InternalAdd (col);
5171 internal void SetSelectedRowCoreInternal (int rowIndex, bool selected) {
5172 SetSelectedRowCore (rowIndex, selected);
5175 protected virtual void SetSelectedRowCore (int rowIndex, bool selected) {
5176 DataGridViewRow row = rows [rowIndex];
5178 row.SelectedInternal = selected;
5180 if (selected_rows == null)
5181 selected_rows = new DataGridViewSelectedRowCollection (this);
5183 if (!selected && selected_rows.Contains (row)) {
5184 selected_rows.InternalRemove (row);
5185 } else if (selected && !selected_rows.Contains (row)) {
5186 selected_rows.InternalAdd (row);
5190 protected override void WndProc (ref Message m)
5192 base.WndProc (ref m);
5195 internal void InternalOnCellClick (DataGridViewCellEventArgs e)
5200 internal void InternalOnCellContentClick (DataGridViewCellEventArgs e)
5202 OnCellContentClick (e);
5205 internal void InternalOnCellContentDoubleClick (DataGridViewCellEventArgs e)
5207 OnCellContentDoubleClick (e);
5210 internal void InternalOnCellValueChanged (DataGridViewCellEventArgs e)
5212 OnCellValueChanged (e);
5214 if (editing_row != null && e.RowIndex == editing_row.Index)
5215 PrepareEditingRow (true, false);
5218 internal void InternalOnDataError (DataGridViewDataErrorEventArgs e)
5220 /////////////// false? ////////////
5221 OnDataError (false, e);
5224 internal void InternalOnMouseWheel (MouseEventArgs e)
5229 internal void OnHScrollBarScroll (object sender, ScrollEventArgs e)
5231 horizontalScrollingOffset = e.NewValue;
5234 for (int index = 0; index < Columns.Count; index++) {
5235 DataGridViewColumn col = Columns[index];
5237 if (e.NewValue < left + col.Width) {
5238 if (first_col_index != index) {
5239 first_col_index = index;
5251 internal void OnVScrollBarScroll (object sender, ScrollEventArgs e)
5253 verticalScrollingOffset = e.NewValue;
5256 for (int index = 0; index < Rows.Count; index++) {
5257 DataGridViewRow row = Rows[index];
5259 if (e.NewValue <= top + row.Height) {
5260 if (first_row_index != index) {
5261 first_row_index = index;
5272 if (Rows.Count == 0)
5275 first_row_index = Rows.Count - DisplayedRowCount (false) + 1;
5280 internal void RaiseCellStyleChanged (DataGridViewCellEventArgs e) {
5281 OnCellStyleChanged(e);
5284 internal void OnColumnCollectionChanged (object sender, CollectionChangeEventArgs e) {
5286 case CollectionChangeAction.Add:
5287 OnColumnAdded(new DataGridViewColumnEventArgs(e.Element as DataGridViewColumn));
5289 case CollectionChangeAction.Remove:
5290 OnColumnRemoved(new DataGridViewColumnEventArgs(e.Element as DataGridViewColumn));
5292 case CollectionChangeAction.Refresh:
5297 // Resizes all columns according to their AutoResizeMode property.
5298 // First all the columns that aren't Filled are resized, then we resize all the Filled columns.
5299 internal void AutoResizeColumnsInternal ()
5301 for (int i = 0; i < Columns.Count; i++)
5302 AutoResizeColumnInternal (i, Columns [i].InheritedAutoSizeMode);
5304 AutoFillColumnsInternal ();
5307 internal void AutoFillColumnsInternal ()
5309 float totalFillWeight = 0;
5310 int FillCount = 0; // The number of columns that has AutoSizeMode.Fill set
5311 int spaceLeft = ClientSize.Width;
5313 if (RowHeadersVisible) {
5314 spaceLeft -= RowHeadersWidth;
5316 spaceLeft -= BorderWidth * 2;
5318 int [] fixed_widths = new int [Columns.Count];
5319 int [] new_widths = new int [Columns.Count];
5320 bool fixed_any = false;
5322 for (int i = 0; i < Columns.Count; i++) {
5323 DataGridViewColumn col = Columns [i];
5325 switch (col.InheritedAutoSizeMode) {
5326 case DataGridViewAutoSizeColumnMode.Fill:
5328 totalFillWeight += col.FillWeight;
5330 case DataGridViewAutoSizeColumnMode.AllCellsExceptHeader:
5331 case DataGridViewAutoSizeColumnMode.AllCells:
5332 case DataGridViewAutoSizeColumnMode.DisplayedCells:
5333 case DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader:
5334 case DataGridViewAutoSizeColumnMode.None:
5335 case DataGridViewAutoSizeColumnMode.NotSet:
5336 spaceLeft -= Columns [i].Width;
5341 spaceLeft = Math.Max (0, spaceLeft);
5345 for (int i = 0; i < columns.Count; i++) {
5346 DataGridViewColumn col = Columns [i];
5349 if (col.InheritedAutoSizeMode != DataGridViewAutoSizeColumnMode.Fill)
5352 if (fixed_widths [i] != 0)
5355 width = (totalFillWeight == 0) ? 0 : (int) Math.Round (spaceLeft * (col.FillWeight / totalFillWeight), 0);
5360 if (width < col.MinimumWidth) {
5361 width = col.MinimumWidth;
5362 fixed_widths [i] = width;
5365 totalFillWeight -= col.FillWeight;
5368 new_widths [i] = width;
5370 } while (fixed_any);
5372 for (int i = 0; i < columns.Count; i++) {
5373 if (Columns [i].InheritedAutoSizeMode != DataGridViewAutoSizeColumnMode.Fill)
5376 Columns [i].Width = new_widths [i];
5380 internal void AutoResizeColumnInternal (int columnIndex, DataGridViewAutoSizeColumnMode mode)
5382 // http://msdn2.microsoft.com/en-us/library/ms171605.aspx
5385 DataGridViewColumn col = Columns [columnIndex];
5388 case DataGridViewAutoSizeColumnMode.Fill:
5390 case DataGridViewAutoSizeColumnMode.AllCellsExceptHeader:
5391 case DataGridViewAutoSizeColumnMode.AllCells:
5392 case DataGridViewAutoSizeColumnMode.DisplayedCells:
5393 case DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader:
5394 size = CalculateColumnCellWidth (columnIndex, col.InheritedAutoSizeMode);
5396 case DataGridViewAutoSizeColumnMode.ColumnHeader:
5397 size = col.HeaderCell.ContentBounds.Width;
5406 if (size < col.MinimumWidth)
5407 size = col.MinimumWidth;
5412 internal int CalculateColumnCellWidth (int index, DataGridViewAutoSizeColumnMode mode)
5416 bool only_visible = false;
5418 if (mode == DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader ||
5419 mode == DataGridViewAutoSizeColumnMode.AllCellsExceptHeader)
5422 only_visible = (mode == DataGridViewAutoSizeColumnMode.DisplayedCells || mode == DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader);
5424 for (int i = first_row; i < Rows.Count; i++) {
5426 Rectangle row_rect = this.GetRowDisplayRectangle (i, false);
5427 if (!ClientRectangle.IntersectsWith (row_rect))
5431 Rectangle cell_rect = GetCellDisplayRectangle (index, i, false);
5433 result = Math.Max (result, cell_rect.Width);
5439 Rectangle GetHeaderCellBounds (DataGridViewHeaderCell cell)
5441 Rectangle bounds = new Rectangle (ClientRectangle.Location, cell.Size);
5442 if (cell is DataGridViewColumnHeaderCell) {
5443 if (RowHeadersVisible)
5444 bounds.X += RowHeadersWidth;
5445 List<DataGridViewColumn> sortedColumns = columns.ColumnDisplayIndexSortedArrayList;
5446 for (int index = first_col_index; index < sortedColumns.Count; index++) {
5447 DataGridViewColumn column = sortedColumns [index];
5448 if (column.Index == cell.ColumnIndex)
5450 bounds.X += column.Width;
5453 if (ColumnHeadersVisible)
5454 bounds.Y += ColumnHeadersHeight;
5455 for (int index = first_row_index; index < Rows.Count; index++) {
5456 DataGridViewRow row = GetRowInternal (index);
5457 if (row.HeaderCell == cell)
5459 bounds.Y += row.Height;
5465 private void PrepareEditingRow (bool cell_changed, bool column_changed)
5469 show = ColumnCount > 0 && AllowUserToAddRows;
5471 if (!show && editing_row != null) {
5472 Rows.Remove (editing_row);
5475 if (editing_row != null) {
5477 // The row changed, it's no longer an editing row.
5479 } else if (column_changed) {
5480 // The number of columns has changed, we need a new editing row.
5481 Rows.Remove (editing_row);
5485 if (editing_row == null) {
5486 editing_row = RowTemplateFull;
5487 Rows.AddInternal (editing_row, false);
5494 internal DataGridViewRow EditingRow {
5495 get { return editing_row; }
5498 private void BindIList (IList list) {
5499 if (autoGenerateColumns) {
5500 // Stuff from a DataSet
5501 if (list is DataView) {
5502 DataView dataView = (DataView) list;
5503 DataTable table = dataView.Table;
5505 foreach (DataColumn dataColumn in table.Columns) {
5506 DataGridViewColumn col = CreateColumnByType (dataColumn.DataType);
5508 col.Name = dataColumn.ColumnName;
5509 col.DataPropertyName = dataColumn.ColumnName;
5510 col.SetIsDataBound (true);
5511 col.ValueType = dataColumn.DataType;
5512 col.AutoGenerated = true;
5517 // Its a generic something or other, like a BindingList<T>, so
5518 // we can figure out the type from the generic type
5519 else if (list.GetType ().GetGenericArguments ().Length > 0) {
5520 GenerateColumnsFromType (list.GetType ().GetGenericArguments ()[0]);
5522 // Its a normal array/collection type thing
5523 else if (list.GetType ().IsArray) {
5524 GenerateColumnsFromType (list.GetType ().GetElementType ());
5528 // Subscribe to the dataset's change notification
5529 if (list is DataView) {
5530 (list as DataView).ListChanged += OnListChanged;
5531 (list as DataView).Table.ColumnChanged += OnTableColumnChanged;
5535 foreach (object element in list)
5536 AddBoundRow (element);
5539 private void AddBoundRow (object element)
5541 // Don't add rows if there are no columns
5542 if (ColumnCount == 0)
5545 DataGridViewRow row = (DataGridViewRow)RowTemplate.Clone ();
5546 rows.InternalAdd (row);
5548 PropertyDescriptorCollection properties = TypeDescriptor.GetProperties (element);
5550 foreach (PropertyDescriptor property in properties) {
5551 if (property.PropertyType == typeof (IBindingList))
5554 // We do it this way because there may not be a column
5555 // for every cell, ignore cells with no column
5556 DataGridViewCell cell = row.Cells.GetBoundCell (property.Name);
5561 cell.valuex = property.GetValue (element);
5562 cell.valueType = property.PropertyType;
5566 private void GenerateColumnsFromType (Type type)
5568 foreach (PropertyDescriptor property in TypeDescriptor.GetProperties (type)) {
5569 // This keeps out things like arrays
5570 if ((typeof(ICollection).IsAssignableFrom (property.PropertyType)))
5573 DataGridViewColumn col = CreateColumnByType (property.PropertyType);
5574 col.Name = property.DisplayName;
5575 col.DataPropertyName = property.DisplayName;
5576 col.ReadOnly = property.IsReadOnly;
5577 col.SetIsDataBound (true);
5578 col.ValueType = property.PropertyType;
5579 col.AutoGenerated = true;
5584 private DataGridViewColumn CreateColumnByType (Type type)
5586 if (type == typeof (bool))
5587 return new DataGridViewCheckBoxColumn ();
5589 return new DataGridViewTextBoxColumn ();
5592 private void ClearBinding ()
5594 columns.ClearAutoGeneratedColumns ();
5596 PrepareEditingRow (false, true);
5598 if (dataSource != null) {
5599 if (dataSource is DataSet) {
5600 (dataSource as DataSet).Tables.CollectionChanged -= OnDataSetTableChanged;
5602 DataTable dt = (dataSource as DataSet).Tables[dataMember];
5605 DataView dv = dt.DefaultView;
5608 (dv as DataView).Table.ColumnChanged -= OnTableColumnChanged;
5609 (dv as DataView).ListChanged -= OnListChanged;
5612 } else if (dataSource is DataView) {
5613 (dataSource as DataView).ListChanged -= OnListChanged;
5614 (dataSource as DataView).Table.ColumnChanged -= OnTableColumnChanged;
5615 } else if (dataSource is DataTable)
5616 ((dataSource as IListSource).GetList () as DataView).ListChanged -= OnListChanged;
5620 private void DoBinding ()
5622 /* 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:
5623 - the System.Collections.IList interface, including one-dimensional arrays.
5624 - the System.ComponentModel.IListSource interface, such as the System.Data.DataTable and System.Data.DataSet classes.
5625 - the System.ComponentModel.IBindingList interface, such as the System.ComponentModel.Collections.BindingList<> class.
5626 - the System.ComponentModel.IBindingListView interface, such as the System.Windows.Forms.BindingSource class.
5629 if (dataSource != null) {
5630 object value = dataSource;
5633 if (value is DataSet && string.IsNullOrEmpty (dataMember)) {
5637 if (value is DataSet) {
5638 (value as DataSet).Tables.CollectionChanged += OnDataSetTableChanged;
5639 value = (value as DataSet).Tables[dataMember];
5641 if (value is BindingSource)
5642 value = (value as BindingSource).List;
5645 BindIList (value as IList);
5646 else if (value is IListSource)
5647 BindIListSource (value as IListSource);
5648 else if (value is IBindingList)
5649 BindIBindingList (value as IBindingList);
5650 else if (value is IBindingListView)
5651 BindIBindingListView (value as IBindingListView);
5653 OnDataBindingComplete (new DataGridViewBindingCompleteEventArgs (ListChangedType.Reset));
5659 private void BindIListSource (IListSource list) {
5660 BindIList(list.GetList());
5663 private void BindIBindingList (IBindingList list) {
5667 private void BindIBindingListView (IBindingListView list) {
5671 private void MoveCurrentCell (int x, int y, bool select, bool isControl, bool isShift, bool scroll)
5673 bool full_row_selected = Rows.SharedRow(CurrentCellAddress.Y).Selected;
5674 bool full_col_selected = Columns[CurrentCellAddress.X].Selected;
5677 DataGridViewSelectionMode mode = selectionMode;
5679 // If we are row header select and we clicked a row header, use full row
5680 if (mode == DataGridViewSelectionMode.RowHeaderSelect && (x == -1 || (full_row_selected && CurrentCellAddress.X == x)))
5681 mode = DataGridViewSelectionMode.FullRowSelect;
5682 else if (mode == DataGridViewSelectionMode.RowHeaderSelect)
5683 mode = DataGridViewSelectionMode.CellSelect;
5685 // If we are col header select and we clicked a col header, use full col
5686 if (mode == DataGridViewSelectionMode.ColumnHeaderSelect && (y == -1 || (full_col_selected && CurrentCellAddress.Y == y)))
5687 mode = DataGridViewSelectionMode.FullColumnSelect;
5688 else if (mode == DataGridViewSelectionMode.ColumnHeaderSelect)
5689 mode = DataGridViewSelectionMode.CellSelect;
5692 SetCurrentCellAddressCore (x, y, true, false, false);
5694 // If the current cell isn't visible, scroll to it
5696 int disp_x = ColumnIndexToDisplayIndex (x);
5698 if (disp_x < first_col_index) {
5702 delta_x = horizontalScrollBar.Value;
5704 for (int i = disp_x; i < first_col_index; i++)
5705 delta_x += Columns[ColumnDisplayIndexToIndex (i)].Width;
5707 horizontalScrollBar.SafeValueSet (horizontalScrollBar.Value - delta_x);
5708 OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
5713 if (disp_y < first_row_index) {
5717 delta_y = verticalScrollBar.Value;
5719 for (int i = disp_y; i < first_row_index; i++)
5720 delta_y += GetRowInternal (i).Height;
5722 verticalScrollBar.SafeValueSet (verticalScrollBar.Value - delta_y);
5723 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
5724 } else if (disp_y > first_row_index + DisplayedRowCount (false) - 2) {
5727 if (disp_y == Rows.Count - 1)
5728 delta_y = verticalScrollBar.Maximum - verticalScrollBar.Value;
5730 for (int i = first_row_index + DisplayedRowCount (false) - 2; i < disp_y; i++)
5731 delta_y += GetRowInternal (i).Height;
5733 verticalScrollBar.SafeValueSet (verticalScrollBar.Value + delta_y);
5734 OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
5741 // Clear old selection unless multi-selecting
5746 case DataGridViewSelectionMode.CellSelect:
5747 SetSelectedCellCore (x, y, true);
5749 case DataGridViewSelectionMode.FullRowSelect:
5750 SetSelectedRowCore (y, true);
5752 case DataGridViewSelectionMode.FullColumnSelect:
5753 SetSelectedColumnCore (x, true);
5760 private int ColumnIndexToDisplayIndex (int index)
5762 return Columns[index].DisplayIndex;
5765 private int ColumnDisplayIndexToIndex (int index)
5767 return Columns.ColumnDisplayIndexSortedArrayList[index].Index;
5770 private void OnListChanged (object sender, ListChangedEventArgs args)
5772 switch (args.ListChangedType) {
5773 case ListChangedType.ItemAdded:
5774 AddBoundRow ((sender as DataView)[args.NewIndex]);
5776 case ListChangedType.ItemDeleted:
5777 Rows.RemoveAt (args.NewIndex);
5784 private void OnTableColumnChanged (object sender, DataColumnChangeEventArgs e)
5790 private void OnDataSetTableChanged (object sender, CollectionChangeEventArgs e)
5796 #region Stuff for ToolTips
5797 private void MouseEnteredErrorIcon (DataGridViewCell item)
5799 tooltip_currently_showing = item;
5800 ToolTipTimer.Start ();
5803 private void MouseLeftErrorIcon (DataGridViewCell item)
5805 ToolTipTimer.Stop ();
5806 ToolTipWindow.Hide (this);
5807 tooltip_currently_showing = null;
5810 private Timer ToolTipTimer {
5812 if (tooltip_timer == null) {
5813 tooltip_timer = new Timer ();
5814 tooltip_timer.Enabled = false;
5815 tooltip_timer.Interval = 500;
5816 tooltip_timer.Tick += new EventHandler (ToolTipTimer_Tick);
5819 return tooltip_timer;
5823 private ToolTip ToolTipWindow {
5825 if (tooltip_window == null)
5826 tooltip_window = new ToolTip ();
5828 return tooltip_window;
5832 private void ToolTipTimer_Tick (object o, EventArgs args)
5834 string tooltip = tooltip_currently_showing.ErrorText;
5836 if (!string.IsNullOrEmpty (tooltip))
5837 ToolTipWindow.Present (this, tooltip);
5839 ToolTipTimer.Stop ();
5843 private class ColumnSorter : IComparer
5848 public ColumnSorter (DataGridViewColumn column, ListSortDirection direction)
5850 this.column = column.Index;
5852 if (direction == ListSortDirection.Descending)
5853 this.direction = -1;
5856 #region IComparer Members
5857 public int Compare (object x, object y)
5859 DataGridViewRow row1 = (DataGridViewRow)x;
5860 DataGridViewRow row2 = (DataGridViewRow)y;
5862 object val1 = row1.Cells[column].FormattedValue;
5863 object val2 = row2.Cells[column].FormattedValue;
5865 if (val1 == null && val2 == null)
5870 return -1 * direction;
5872 return string.Compare (val1.ToString (), val2.ToString ()) * direction;
5877 public sealed class HitTestInfo {
5879 public static readonly HitTestInfo Nowhere = new HitTestInfo(-1, -1, -1, -1, DataGridViewHitTestType.None);
5881 private int columnIndex;
5882 private int columnX;
5883 private int rowIndex;
5885 private DataGridViewHitTestType type;
5887 internal HitTestInfo (int columnIndex, int columnX, int rowIndex, int rowY, DataGridViewHitTestType type) {
5888 this.columnIndex = columnIndex;
5889 this.columnX = columnX;
5890 this.rowIndex = rowIndex;
5895 public int ColumnIndex {
5896 get { return columnIndex; }
5899 public int ColumnX {
5900 get { return columnX; }
5903 public int RowIndex {
5904 get { return rowIndex; }
5908 get { return rowY; }
5911 public DataGridViewHitTestType Type {
5912 get { return type; }
5915 public override bool Equals (object value) {
5916 if (value is HitTestInfo) {
5917 HitTestInfo aux = (HitTestInfo) value;
5918 if (aux.columnIndex == columnIndex && aux.columnX == columnX && aux.rowIndex == rowIndex && aux.rowY == rowY && aux.type == type) {
5925 public override int GetHashCode () {
5926 return base.GetHashCode();
5929 public override string ToString () {
5930 return string.Format ("Type:{0}, Column:{1}, Row:{2}", type, columnIndex, rowIndex);
5935 [ComVisible (false)]
5936 public class DataGridViewControlCollection : Control.ControlCollection
5938 private new DataGridView owner;
5940 public DataGridViewControlCollection (DataGridView owner) : base (owner)
5945 public override void Clear ()
5948 // This is severely buggy, just as MS' implementation is.
5950 for (int i = 0; i < Count; i++) {
5955 public void CopyTo (Control [] array, int index)
5957 base.CopyTo (array, index);
5960 public void Insert (int index, Control value)
5962 throw new NotSupportedException ();
5965 public override void Remove (Control value)
5967 if (value == owner.horizontalScrollBar)
5970 if (value == owner.verticalScrollBar)
5973 if (value == owner.editingControl)
5976 base.Remove (value);
5979 internal void RemoveInternal (Control value)
5981 base.Remove (value);
5987 [ComVisibleAttribute(true)]
5988 protected class DataGridViewAccessibleObject : ControlAccessibleObject {
5990 public DataGridViewAccessibleObject (DataGridView owner) : base (owner){
5993 public override AccessibleRole Role {
5994 get { return base.Role; }
5997 public override string Name {
5998 get { return base.Name; }
6001 public override AccessibleObject GetChild (int index) {
6002 return base.GetChild(index);
6005 public override int GetChildCount () {
6006 return base.GetChildCount();
6009 public override AccessibleObject GetFocused () {
6010 return base.GetFocused();
6013 public override AccessibleObject GetSelected () {
6014 return base.GetSelected();
6017 public override AccessibleObject HitTest (int x, int y) {
6018 return base.HitTest(x, y);
6021 public override AccessibleObject Navigate( AccessibleNavigation navigationDirection) {
6022 return base.Navigate(navigationDirection);
6028 protected class DataGridViewTopRowAccessibleObject : AccessibleObject
6030 #region Constructors
6031 public DataGridViewTopRowAccessibleObject ()
6035 public DataGridViewTopRowAccessibleObject (DataGridView owner)
6041 #region Public Methods
6042 public override AccessibleObject GetChild (int index)
6044 return base.GetChild (index);
6047 public override int GetChildCount ()
6049 return base.GetChildCount ();
6052 public override AccessibleObject Navigate (AccessibleNavigation navigationDirection)
6054 return base.Navigate (navigationDirection);
6058 #region Public Properties
6059 public override Rectangle Bounds {
6060 get { return base.Bounds; }
6063 public override string Name {
6064 get { return base.Name; }
6067 public DataGridView Owner {
6068 get { return (DataGridView)owner; }
6071 throw new InvalidOperationException ("owner has already been set");
6077 public override AccessibleObject Parent {
6078 get { return base.Parent; }
6081 public override AccessibleRole Role {
6082 get { return base.Role; }
6085 public override string Value {
6086 get { return base.Value; }