// Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // // Copyright (c) 2005 Novell, Inc. (http://www.novell.com) // // Author: // Pedro Martínez Juliá // Ivan N. Zlatev // #if NET_2_0 using System; using System.ComponentModel; using System.Runtime.InteropServices; using System.Drawing; using System.Reflection; using System.Collections; using System.Data; using System.Collections.Generic; namespace System.Windows.Forms { [ComVisibleAttribute(true)] [ClassInterfaceAttribute(ClassInterfaceType.AutoDispatch)] [Designer("System.Windows.Forms.Design.DataGridViewDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")] [Editor("System.Windows.Forms.Design.DataGridViewComponentEditor, " + Consts.AssemblySystem_Design, typeof (System.ComponentModel.ComponentEditor))] [ComplexBindingProperties ("DataSource", "DataMember")] [DefaultEvent ("CellContentClick")] [Docking (DockingBehavior.Ask)] public class DataGridView : Control, ISupportInitialize, IBindableComponent, IDropTarget { private DataGridViewAdvancedBorderStyle adjustedTopLeftHeaderBorderStyle; private DataGridViewAdvancedBorderStyle advancedCellBorderStyle; private DataGridViewAdvancedBorderStyle advancedColumnHeadersBorderStyle; private DataGridViewAdvancedBorderStyle advancedRowHeadersBorderStyle; private bool allowUserToAddRows; private bool allowUserToDeleteRows; private bool allowUserToOrderColumns; private bool allowUserToResizeColumns; private bool allowUserToResizeRows; private DataGridViewCellStyle alternatingRowsDefaultCellStyle; private Point anchor_cell; private bool autoGenerateColumns; private bool autoSize; private DataGridViewAutoSizeColumnsMode autoSizeColumnsMode; private DataGridViewAutoSizeRowsMode autoSizeRowsMode; private Color backColor; private Color backgroundColor; private Image backgroundImage; private BorderStyle borderStyle; private DataGridViewCellBorderStyle cellBorderStyle; private DataGridViewClipboardCopyMode clipboardCopyMode; private DataGridViewHeaderBorderStyle columnHeadersBorderStyle; private DataGridViewCellStyle columnHeadersDefaultCellStyle; private int columnHeadersHeight; private DataGridViewColumnHeadersHeightSizeMode columnHeadersHeightSizeMode; private bool columnHeadersVisible; private DataGridViewColumnCollection columns; private DataGridViewCell currentCell; private Point currentCellAddress; //private DataGridViewRow currentRow; private string dataMember; private object dataSource; private DataGridViewCellStyle defaultCellStyle; //private Control editingControl; private DataGridViewEditMode editMode; private bool enableHeadersVisualStyles = true; private DataGridViewCell firstDisplayedCell; private int firstDisplayedScrollingColumnHiddenWidth; private int firstDisplayedScrollingColumnIndex; private int firstDisplayedScrollingRowIndex; private Color gridColor = Color.FromKnownColor(KnownColor.ControlDark); private int horizontalScrollingOffset; private DataGridViewCell hover_cell = null; private bool isCurrentCellDirty; //private bool isCurrentRowDirty; private bool multiSelect; private bool readOnly; private DataGridViewHeaderBorderStyle rowHeadersBorderStyle; private DataGridViewCellStyle rowHeadersDefaultCellStyle; private bool rowHeadersVisible; private int rowHeadersWidth; private DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode; private DataGridViewRowCollection rows; private DataGridViewCellStyle rowsDefaultCellStyle; private DataGridViewRow rowTemplate; private ScrollBars scrollBars; private DataGridViewSelectionMode selectionMode; private bool showCellErrors; private bool showCellToolTips; private bool showEditingIcon; private bool showRowErrors; private DataGridViewColumn sortedColumn = null; private SortOrder sortOrder; private bool standardTab; private DataGridViewHeaderCell topLeftHeaderCell; private Cursor userSetCursor; private int verticalScrollingOffset; private bool virtualMode; private HScrollBar horizontalScrollBar; private VScrollBar verticalScrollBar; private Control editingControl; private bool is_autogenerating_columns = false; private bool is_binding = false; private bool new_row_editing = false; // These are used to implement selection behaviour with SHIFT pressed. private int selected_row = -1; private int selected_column = -1; // Stuff for error Tooltips private Timer tooltip_timer; private ToolTip tooltip_window; private DataGridViewCell tooltip_currently_showing; private DataGridViewSelectedRowCollection selected_rows; private DataGridViewSelectedColumnCollection selected_columns; private DataGridViewRow editing_row; DataGridViewHeaderCell pressed_header_cell; DataGridViewHeaderCell entered_header_cell; // For column/row resizing via mouse private bool column_resize_active = false; private bool row_resize_active = false; private int resize_band = -1; private int resize_band_start = 0; private int resize_band_delta = 0; public DataGridView () { SetStyle (ControlStyles.Opaque, true); //SetStyle (ControlStyles.UserMouse, true); SetStyle (ControlStyles.OptimizedDoubleBuffer, true); adjustedTopLeftHeaderBorderStyle = new DataGridViewAdvancedBorderStyle(); adjustedTopLeftHeaderBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single; advancedCellBorderStyle = new DataGridViewAdvancedBorderStyle(); advancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single; advancedColumnHeadersBorderStyle = new DataGridViewAdvancedBorderStyle(); advancedColumnHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single; advancedRowHeadersBorderStyle = new DataGridViewAdvancedBorderStyle(); advancedRowHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single; alternatingRowsDefaultCellStyle = new DataGridViewCellStyle(); allowUserToAddRows = true; allowUserToDeleteRows = true; allowUserToOrderColumns = false; allowUserToResizeColumns = true; allowUserToResizeRows = true; autoGenerateColumns = true; autoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; autoSizeRowsMode = DataGridViewAutoSizeRowsMode.None; backColor = Control.DefaultBackColor; backgroundColor = SystemColors.AppWorkspace; borderStyle = BorderStyle.FixedSingle; cellBorderStyle = DataGridViewCellBorderStyle.Single; clipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithAutoHeaderText; columnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single; columnHeadersDefaultCellStyle = new DataGridViewCellStyle(); columnHeadersDefaultCellStyle.BackColor = SystemColors.Control; columnHeadersDefaultCellStyle.ForeColor = SystemColors.WindowText; columnHeadersDefaultCellStyle.SelectionBackColor = SystemColors.Highlight; columnHeadersDefaultCellStyle.SelectionForeColor = SystemColors.HighlightText; columnHeadersDefaultCellStyle.Font = this.Font; columnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft; columnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.True; columnHeadersHeight = 23; columnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing; columnHeadersVisible = true; columns = CreateColumnsInstance(); columns.CollectionChanged += OnColumnCollectionChanged; currentCellAddress = new Point (-1, -1); dataMember = String.Empty; defaultCellStyle = new DataGridViewCellStyle(); defaultCellStyle.BackColor = SystemColors.Window; defaultCellStyle.ForeColor = SystemColors.ControlText; defaultCellStyle.SelectionBackColor = SystemColors.Highlight; defaultCellStyle.SelectionForeColor = SystemColors.HighlightText; defaultCellStyle.Font = this.Font; defaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft; defaultCellStyle.WrapMode = DataGridViewTriState.False; editMode = DataGridViewEditMode.EditOnKeystrokeOrF2; firstDisplayedScrollingColumnHiddenWidth = 0; isCurrentCellDirty = false; multiSelect = true; readOnly = false; rowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single; rowHeadersDefaultCellStyle = (DataGridViewCellStyle) columnHeadersDefaultCellStyle.Clone (); rowHeadersVisible = true; rowHeadersWidth = 41; rowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing; rows = CreateRowsInstance(); rowsDefaultCellStyle = new DataGridViewCellStyle(); selectionMode = DataGridViewSelectionMode.RowHeaderSelect; showCellErrors = true; showEditingIcon = true; scrollBars = ScrollBars.Both; userSetCursor = Cursor.Current; virtualMode = false; horizontalScrollBar = new HScrollBar(); horizontalScrollBar.Scroll += OnHScrollBarScroll; horizontalScrollBar.Visible = false; verticalScrollBar = new VScrollBar(); verticalScrollBar.Scroll += OnVScrollBarScroll; verticalScrollBar.Visible = false; Controls.AddRange (new Control[] {horizontalScrollBar, verticalScrollBar}); } void ISupportInitialize.BeginInit () { } void ISupportInitialize.EndInit () { } // Propiedades [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Advanced)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public virtual DataGridViewAdvancedBorderStyle AdjustedTopLeftHeaderBorderStyle { get { return adjustedTopLeftHeaderBorderStyle; } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Advanced)] public DataGridViewAdvancedBorderStyle AdvancedCellBorderStyle { get { return advancedCellBorderStyle; } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Advanced)] public DataGridViewAdvancedBorderStyle AdvancedColumnHeadersBorderStyle { get { return advancedColumnHeadersBorderStyle; } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Advanced)] public DataGridViewAdvancedBorderStyle AdvancedRowHeadersBorderStyle { get { return advancedRowHeadersBorderStyle; } } [DefaultValue (true)] public bool AllowUserToAddRows { get { if (allowUserToAddRows && DataManager != null) return DataManager.AllowNew; return allowUserToAddRows; } set { if (allowUserToAddRows != value) { allowUserToAddRows = value; if (!value) { if (new_row_editing) CancelEdit (); RemoveEditingRow (); } else { PrepareEditingRow (false, false); } OnAllowUserToAddRowsChanged(EventArgs.Empty); Invalidate (); } } } [DefaultValue (true)] public bool AllowUserToDeleteRows { get { if (allowUserToDeleteRows && DataManager != null) return DataManager.AllowRemove; return allowUserToDeleteRows; } set { if (allowUserToDeleteRows != value) { allowUserToDeleteRows = value; OnAllowUserToDeleteRowsChanged(EventArgs.Empty); } } } [DefaultValue (false)] public bool AllowUserToOrderColumns { get { return allowUserToOrderColumns; } set { if (allowUserToOrderColumns != value) { allowUserToOrderColumns = value; OnAllowUserToOrderColumnsChanged(EventArgs.Empty); } } } [DefaultValue (true)] public bool AllowUserToResizeColumns { get { return allowUserToResizeColumns; } set { if (allowUserToResizeColumns != value) { allowUserToResizeColumns = value; OnAllowUserToResizeColumnsChanged(EventArgs.Empty); } } } [DefaultValue (true)] public bool AllowUserToResizeRows { get { return allowUserToResizeRows; } set { if (allowUserToResizeRows != value) { allowUserToResizeRows = value; OnAllowUserToResizeRowsChanged(EventArgs.Empty); } } } public DataGridViewCellStyle AlternatingRowsDefaultCellStyle { get { return alternatingRowsDefaultCellStyle; } set { if (alternatingRowsDefaultCellStyle != value) { alternatingRowsDefaultCellStyle = value; OnAlternatingRowsDefaultCellStyleChanged(EventArgs.Empty); Invalidate(); } } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Advanced)] [DefaultValue (true)] public bool AutoGenerateColumns { get { return autoGenerateColumns; } set { if (autoGenerateColumns != value) { autoGenerateColumns = value; OnAutoGenerateColumnsChanged(EventArgs.Empty); } } } public override bool AutoSize { get { return autoSize; } set { if (autoSize != value) { autoSize = value; //OnAutoSizeChanged(EventArgs.Empty); } } } [DefaultValue (DataGridViewAutoSizeColumnsMode.None)] public DataGridViewAutoSizeColumnsMode AutoSizeColumnsMode { get { return autoSizeColumnsMode; } set { if (!Enum.IsDefined(typeof(DataGridViewAutoSizeColumnsMode), value)) { throw new InvalidEnumArgumentException("Value is not valid DataGridViewAutoSizeColumnsMode."); } if (value == DataGridViewAutoSizeColumnsMode.ColumnHeader && columnHeadersVisible == false) { foreach (DataGridViewColumn col in columns) { if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet) { throw new InvalidOperationException("Cant set this property to ColumnHeader in this DataGridView."); } } } if (value == DataGridViewAutoSizeColumnsMode.Fill) { foreach (DataGridViewColumn col in columns) { if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet) { if (col.Frozen) { throw new InvalidOperationException("Cant set this property to Fill in this DataGridView."); } } } } autoSizeColumnsMode = value; AutoResizeColumns (value); Invalidate (); } } [DefaultValue (DataGridViewAutoSizeRowsMode.None)] public DataGridViewAutoSizeRowsMode AutoSizeRowsMode { get { return autoSizeRowsMode; } set { if (autoSizeRowsMode != value) { if (!Enum.IsDefined(typeof(DataGridViewAutoSizeRowsMode), value)) { throw new InvalidEnumArgumentException("Value is not valid DataGridViewRowsMode."); } if ((value == DataGridViewAutoSizeRowsMode.AllHeaders || value == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && rowHeadersVisible == false) { throw new InvalidOperationException("Cant set this property to AllHeaders or DisplayedHeaders in this DataGridView."); } autoSizeRowsMode = value; if (value == DataGridViewAutoSizeRowsMode.None) foreach (DataGridViewRow row in Rows) row.ResetToExplicitHeight (); else AutoResizeRows (value); OnAutoSizeRowsModeChanged(new DataGridViewAutoSizeModeEventArgs(false)); Invalidate (); //////////////////////////////////////////////////////////////// } } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Never)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public override Color BackColor { get { return backColor; } set { if (backColor != value) { backColor = value; OnBackColorChanged(EventArgs.Empty); } } } public Color BackgroundColor { get { return backgroundColor; } set { if (backgroundColor != value) { if (value == Color.Empty) { throw new ArgumentException("Cant set an Empty color."); } backgroundColor = value; OnBackgroundColorChanged(EventArgs.Empty); } } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Never)] public override Image BackgroundImage { get { return backgroundImage; } set { if (backgroundImage != value) { backgroundImage = value; OnBackgroundImageChanged(EventArgs.Empty); } } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Never)] public override ImageLayout BackgroundImageLayout { get { return base.BackgroundImageLayout; } set { base.BackgroundImageLayout = value; } } [DefaultValue (BorderStyle.FixedSingle)] public BorderStyle BorderStyle { get { return borderStyle; } set { if (borderStyle != value) { if (!Enum.IsDefined(typeof(BorderStyle), value)) { throw new InvalidEnumArgumentException("Invalid border style."); } borderStyle = value; OnBorderStyleChanged(EventArgs.Empty); } } } internal int BorderWidth { get { switch (BorderStyle) { case BorderStyle.Fixed3D: return 2; case BorderStyle.FixedSingle: return 1; case BorderStyle.None: default: return 0; } } } [Browsable (true)] [DefaultValue (DataGridViewCellBorderStyle.Single)] public DataGridViewCellBorderStyle CellBorderStyle { get { return cellBorderStyle; } set { if (cellBorderStyle != value) { if (value == DataGridViewCellBorderStyle.Custom) throw new ArgumentException ("CellBorderStyle cannot be set to Custom."); cellBorderStyle = value; DataGridViewAdvancedBorderStyle border = new DataGridViewAdvancedBorderStyle (); switch (cellBorderStyle) { case DataGridViewCellBorderStyle.Single: border.All = DataGridViewAdvancedCellBorderStyle.Single; break; case DataGridViewCellBorderStyle.Raised: case DataGridViewCellBorderStyle.RaisedVertical: border.Bottom = DataGridViewAdvancedCellBorderStyle.None; border.Top = DataGridViewAdvancedCellBorderStyle.None; border.Left = DataGridViewAdvancedCellBorderStyle.Outset; border.Right = DataGridViewAdvancedCellBorderStyle.Outset; break; case DataGridViewCellBorderStyle.Sunken: border.All = DataGridViewAdvancedCellBorderStyle.Inset; break; case DataGridViewCellBorderStyle.None: border.All = DataGridViewAdvancedCellBorderStyle.None; break; case DataGridViewCellBorderStyle.SingleVertical: border.Bottom = DataGridViewAdvancedCellBorderStyle.None; border.Top = DataGridViewAdvancedCellBorderStyle.None; border.Left = DataGridViewAdvancedCellBorderStyle.None; border.Right = DataGridViewAdvancedCellBorderStyle.Single; break; case DataGridViewCellBorderStyle.SunkenVertical: border.Bottom = DataGridViewAdvancedCellBorderStyle.None; border.Top = DataGridViewAdvancedCellBorderStyle.None; border.Left = DataGridViewAdvancedCellBorderStyle.Inset; border.Right = DataGridViewAdvancedCellBorderStyle.Inset; break; case DataGridViewCellBorderStyle.SingleHorizontal: case DataGridViewCellBorderStyle.SunkenHorizontal: border.Bottom = DataGridViewAdvancedCellBorderStyle.Inset; border.Top = DataGridViewAdvancedCellBorderStyle.Inset; border.Left = DataGridViewAdvancedCellBorderStyle.None; border.Right = DataGridViewAdvancedCellBorderStyle.None; break; case DataGridViewCellBorderStyle.RaisedHorizontal: border.Bottom = DataGridViewAdvancedCellBorderStyle.Outset; border.Top = DataGridViewAdvancedCellBorderStyle.Outset; border.Left = DataGridViewAdvancedCellBorderStyle.None; border.Right = DataGridViewAdvancedCellBorderStyle.None; break; } advancedCellBorderStyle = border; OnCellBorderStyleChanged (EventArgs.Empty); } } } [Browsable (true)] [DefaultValue (DataGridViewClipboardCopyMode.EnableWithAutoHeaderText)] public DataGridViewClipboardCopyMode ClipboardCopyMode { get { return clipboardCopyMode; } set { clipboardCopyMode = value; } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Advanced)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [DefaultValue (0)] public int ColumnCount { get { return columns.Count; } set { if (value < 0) { throw new ArgumentOutOfRangeException("ColumnCount", "ColumnCount must be >= 0."); } if (dataSource != null) { throw new InvalidOperationException("Cant change column count if DataSource is set."); } if (value < columns.Count) { for (int i = columns.Count -1; i >= value; i--) { columns.RemoveAt(i); } } else if (value > columns.Count) { for (int i = columns.Count; i < value; i++) { DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn (); columns.Add(col); } } } } [Browsable (true)] [DefaultValue (DataGridViewHeaderBorderStyle.Raised)] public DataGridViewHeaderBorderStyle ColumnHeadersBorderStyle { get { return columnHeadersBorderStyle; } set { if (columnHeadersBorderStyle != value) { columnHeadersBorderStyle = value; OnColumnHeadersBorderStyleChanged(EventArgs.Empty); } } } [AmbientValue (null)] public DataGridViewCellStyle ColumnHeadersDefaultCellStyle { get { return columnHeadersDefaultCellStyle; } set { if (columnHeadersDefaultCellStyle != value) { columnHeadersDefaultCellStyle = value; OnColumnHeadersDefaultCellStyleChanged(EventArgs.Empty); } } } [Localizable (true)] public int ColumnHeadersHeight { get { return columnHeadersHeight; } set { if (columnHeadersHeight != value) { if (value < 4) { throw new ArgumentOutOfRangeException("ColumnHeadersHeight", "Column headers height cant be less than 4."); } if (value > 32768 ) { throw new ArgumentOutOfRangeException("ColumnHeadersHeight", "Column headers height cannot be more than 32768."); } columnHeadersHeight = value; OnColumnHeadersHeightChanged(EventArgs.Empty); if (columnHeadersVisible) Invalidate (); } } } [RefreshProperties (RefreshProperties.All)] [DefaultValue (DataGridViewColumnHeadersHeightSizeMode.EnableResizing)] public DataGridViewColumnHeadersHeightSizeMode ColumnHeadersHeightSizeMode { get { return columnHeadersHeightSizeMode; } set { if (columnHeadersHeightSizeMode != value) { if (!Enum.IsDefined(typeof(DataGridViewColumnHeadersHeightSizeMode), value)) { throw new InvalidEnumArgumentException("Value is not a valid DataGridViewColumnHeadersHeightSizeMode."); } columnHeadersHeightSizeMode = value; OnColumnHeadersHeightSizeModeChanged(new DataGridViewAutoSizeModeEventArgs(false)); } } } [DefaultValue (true)] public bool ColumnHeadersVisible { get { return columnHeadersVisible; } set { if (columnHeadersVisible != value) { columnHeadersVisible = value; Invalidate (); } } } [MergableProperty (false)] [Editor ("System.Windows.Forms.Design.DataGridViewColumnCollectionEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))] [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)] public DataGridViewColumnCollection Columns { get { return columns; } } [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public DataGridViewCell CurrentCell { get { return currentCell; } set { ///////////////////////////////////////////////////// /// *** InvalidOperationException *** /// Changes to the specified cell cannot be committed /// to the data cache, or the new cell is in a hidden /// row. ///////////////////////////////////////////////////// if (value == null) MoveCurrentCell (-1, -1, true, false, false, true); else if (value.DataGridView != this) throw new ArgumentException("The cell is not in this DataGridView."); else MoveCurrentCell (value.OwningColumn.Index, value.OwningRow.Index, true, false, false, true); } } [Browsable (false)] public Point CurrentCellAddress { get { return currentCellAddress; } } [Browsable (false)] public DataGridViewRow CurrentRow { get { if (currentCell != null) return currentCell.OwningRow; return null; } } [DefaultValue ("")] [Editor ("System.Windows.Forms.Design.DataMemberListEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))] public string DataMember { get { return dataMember; } set { if (dataMember != value) { dataMember = value; if (BindingContext != null) ReBind (); OnDataMemberChanged(EventArgs.Empty); } } } [RefreshProperties (RefreshProperties.Repaint)] [DefaultValue (null)] [AttributeProvider (typeof (IListSource))] public object DataSource { get { return dataSource; } set { /* 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: - the System.Collections.IList interface, including one-dimensional arrays. - the System.ComponentModel.IListSource interface, such as the System.Data.DataTable and System.Data.DataSet classes. - the System.ComponentModel.IBindingList interface, such as the System.ComponentModel.Collections.BindingList<> class. - the System.ComponentModel.IBindingListView interface, such as the System.Windows.Forms.BindingSource class. */ if (!(value == null || value is IList || value is IListSource || value is IBindingList || value is IBindingListView)) throw new NotSupportedException ("Type cannot be bound."); if (value != DataSource) { if (IsHandleCreated && value != null && BindingContext != null && BindingContext[value] != null) DataMember = String.Empty; ClearBinding (); // Do not set dataSource prior to te BindingContext check because there is some lazy initialization // code which might result in double call to ReBind here and in OnBindingContextChanged if (BindingContext != null) { dataSource = value; ReBind (); } else { dataSource = value; } OnDataSourceChanged (EventArgs.Empty); } } } internal CurrencyManager DataManager { get { if (DataSource != null && BindingContext != null) { string dataMember = DataMember; if (dataMember == null) dataMember = String.Empty; return (CurrencyManager) this.BindingContext[DataSource, dataMember]; } return null; } } [AmbientValue (null)] public DataGridViewCellStyle DefaultCellStyle { get { return defaultCellStyle; } set { if (defaultCellStyle != value) { defaultCellStyle = value; OnDefaultCellStyleChanged(EventArgs.Empty); } } } public override Rectangle DisplayRectangle { get { return base.DisplayRectangle; } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Advanced)] public Control EditingControl { get { return editingControl; } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Advanced)] public Panel EditingPanel { get { throw new NotImplementedException(); } } [DefaultValue (DataGridViewEditMode.EditOnKeystrokeOrF2)] public DataGridViewEditMode EditMode { get { return editMode; } set { if (editMode != value) { editMode = value; OnEditModeChanged(EventArgs.Empty); } } } [DefaultValue (true)] public bool EnableHeadersVisualStyles { get { return enableHeadersVisualStyles; } set { enableHeadersVisualStyles = value; } } internal DataGridViewHeaderCell EnteredHeaderCell { get { return entered_header_cell; } set { if (entered_header_cell == value) return; if (ThemeEngine.Current.DataGridViewHeaderCellHasHotStyle (this)) { Region area_to_invalidate = new Region (); area_to_invalidate.MakeEmpty (); if (entered_header_cell != null) area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell)); entered_header_cell = value; if (entered_header_cell != null) area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell)); Invalidate (area_to_invalidate); area_to_invalidate.Dispose (); } else entered_header_cell = value; } } [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public DataGridViewCell FirstDisplayedCell { get { return firstDisplayedCell; } set { if (value.DataGridView != this) { throw new ArgumentException("The cell is not in this DataGridView."); } firstDisplayedCell = value; } } [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [EditorBrowsable (EditorBrowsableState.Advanced)] public int FirstDisplayedScrollingColumnHiddenWidth { get { return firstDisplayedScrollingColumnHiddenWidth; } } [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public int FirstDisplayedScrollingColumnIndex { get { return firstDisplayedScrollingColumnIndex; } set { firstDisplayedScrollingColumnIndex = value; } } [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public int FirstDisplayedScrollingRowIndex { get { return firstDisplayedScrollingRowIndex; } set { firstDisplayedScrollingRowIndex = value; } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Advanced)] public override Font Font { get { return base.Font; } set { base.Font = value; } } [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [EditorBrowsable (EditorBrowsableState.Advanced)] public override Color ForeColor { get { return base.ForeColor; } set { base.ForeColor = value; } } public Color GridColor { get { return gridColor; } set { if (gridColor != value) { if (value == Color.Empty) { throw new ArgumentException("Cant set an Empty color."); } gridColor = value; OnGridColorChanged(EventArgs.Empty); } } } [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public int HorizontalScrollingOffset { get { return horizontalScrollingOffset; } set { horizontalScrollingOffset = value; } } [Browsable (false)] public bool IsCurrentCellDirty { get { return isCurrentCellDirty; } } [Browsable (false)] public bool IsCurrentCellInEditMode { get { if (currentCell == null) { return false; } return currentCell.IsInEditMode; } } [Browsable (false)] public bool IsCurrentRowDirty { get { if (!virtualMode) return IsCurrentCellDirty; QuestionEventArgs args = new QuestionEventArgs (); OnRowDirtyStateNeeded (args); return args.Response; } } [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public DataGridViewCell this [int columnIndex, int rowIndex] { get { return rows[rowIndex].Cells[columnIndex]; } set { rows[rowIndex].Cells[columnIndex] = value; } } [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public DataGridViewCell this [string columnName, int rowIndex] { get { int columnIndex = -1; foreach (DataGridViewColumn col in columns) { if (col.Name == columnName) { columnIndex = col.Index; break; } } return this[columnIndex, rowIndex]; } set { int columnIndex = -1; foreach (DataGridViewColumn col in columns) { if (col.Name == columnName) { columnIndex = col.Index; break; } } this[columnIndex, rowIndex] = value; } } [DefaultValue (true)] public bool MultiSelect { get { return multiSelect; } set { if (multiSelect != value) { multiSelect = value; OnMultiSelectChanged(EventArgs.Empty); } } } [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public int NewRowIndex { get { if (!AllowUserToAddRows || ColumnCount == 0) { return -1; } return rows.Count - 1; } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Never)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public new Padding Padding { get { return Padding.Empty; } set { } } internal DataGridViewHeaderCell PressedHeaderCell { get { return pressed_header_cell; } } [Browsable (true)] [DefaultValue (false)] public bool ReadOnly { get { return readOnly; } set { if (readOnly != value) { readOnly = value; OnReadOnlyChanged(EventArgs.Empty); } } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Advanced)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [DefaultValue (0)] public int RowCount { get { return rows.Count; } set { if (value < 0) { throw new ArgumentException("RowCount must be >= 0."); } if (value < 1 && AllowUserToAddRows) { throw new ArgumentException("RowCount must be >= 1 if AllowUserToAddRows is true."); } if (dataSource != null) { throw new InvalidOperationException("Cant change row count if DataSource is set."); } if (value < rows.Count) { int removeRangeEndIndex = rows.Count - 1; if (AllowUserToAddRows) removeRangeEndIndex--; // do not remove editing row int removeRangeStartIndex = value - 1; if (AllowUserToAddRows) removeRangeStartIndex--; // remove an extra row before/instead of the editing row for (int i = removeRangeEndIndex; i > removeRangeStartIndex; i--) rows.RemoveAt(i); } else if (value > rows.Count) { // If we need to add rows and don't have any columns, // we create one column if (ColumnCount == 0) ColumnCount = 1; List newRows = new List (value - rows.Count); for (int i = rows.Count; i < value; i++) newRows.Add ((DataGridViewRow) RowTemplateFull); rows.AddRange (newRows.ToArray()); } } } [Browsable (true)] [DefaultValue (DataGridViewHeaderBorderStyle.Raised)] public DataGridViewHeaderBorderStyle RowHeadersBorderStyle { get { return rowHeadersBorderStyle; } set { if (rowHeadersBorderStyle != value) { rowHeadersBorderStyle = value; OnRowHeadersBorderStyleChanged(EventArgs.Empty); } } } [AmbientValue (null)] public DataGridViewCellStyle RowHeadersDefaultCellStyle { get { return rowHeadersDefaultCellStyle; } set { if (rowHeadersDefaultCellStyle != value) { rowHeadersDefaultCellStyle = value; OnRowHeadersDefaultCellStyleChanged(EventArgs.Empty); } } } [DefaultValue (true)] public bool RowHeadersVisible { get { return rowHeadersVisible; } set { if (rowHeadersVisible != value) { rowHeadersVisible = value; Invalidate (); } } } [Localizable (true)] public int RowHeadersWidth { get { return rowHeadersWidth; } set { if (rowHeadersWidth != value) { if (value < 4) { throw new ArgumentOutOfRangeException("RowHeadersWidth", "Row headers width cant be less than 4."); } if (value > 32768 ) { throw new ArgumentOutOfRangeException("RowHeadersWidth", "Row headers width cannot be more than 32768."); } rowHeadersWidth = value; OnRowHeadersWidthChanged(EventArgs.Empty); if (rowHeadersVisible) Invalidate (); } } } [RefreshProperties (RefreshProperties.All)] [DefaultValue (DataGridViewRowHeadersWidthSizeMode.EnableResizing)] public DataGridViewRowHeadersWidthSizeMode RowHeadersWidthSizeMode { get { return rowHeadersWidthSizeMode; } set { if (rowHeadersWidthSizeMode != value) { if (!Enum.IsDefined(typeof(DataGridViewRowHeadersWidthSizeMode), value)) { throw new InvalidEnumArgumentException("Value is not valid DataGridViewRowHeadersWidthSizeMode."); } rowHeadersWidthSizeMode = value; OnRowHeadersWidthSizeModeChanged(new DataGridViewAutoSizeModeEventArgs(false)); } } } [Browsable (false)] public DataGridViewRowCollection Rows { get { return rows; } } public DataGridViewCellStyle RowsDefaultCellStyle { get { return rowsDefaultCellStyle; } set { if (rowsDefaultCellStyle != value) { rowsDefaultCellStyle = value; OnRowsDefaultCellStyleChanged(EventArgs.Empty); } } } // RowTemplate is just the row, it does not contain Cells [Browsable (true)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)] public DataGridViewRow RowTemplate { get { if (rowTemplate == null) rowTemplate = new DataGridViewRow (); return rowTemplate; } set { rowTemplate = value; } } // Take the RowTemplate, clone it, and add Cells // Note this is not stored, so you don't need to Clone it internal DataGridViewRow RowTemplateFull { get { DataGridViewRow row = (DataGridViewRow) RowTemplate.Clone (); for (int i = row.Cells.Count; i < Columns.Count; i++) { DataGridViewCell template = columns [i].CellTemplate; if (template == null) throw new InvalidOperationException ("At least one of the DataGridView control's columns has no cell template."); row.Cells.Add ((DataGridViewCell) template.Clone ()); } return row; } } internal override bool ScaleChildrenInternal { get { return false; } } [DefaultValue (ScrollBars.Both)] [Localizable (true)] public ScrollBars ScrollBars { get { return scrollBars; } set { if (!Enum.IsDefined(typeof(ScrollBars), value)) { throw new InvalidEnumArgumentException("Invalid ScrollBars value."); } //////////////////////////////////////////////////////////// /// *** InvalidOperationException *** /// The System.Windows.Forms.DataGridView is unable to /// scroll due to a cell change that cannot be committed /// or canceled. /////////////////////////////////////////////////////////// scrollBars = value; PerformLayout (); Invalidate (); } } [Browsable (false)] public DataGridViewSelectedCellCollection SelectedCells { get { DataGridViewSelectedCellCollection selectedCells = new DataGridViewSelectedCellCollection(); foreach (DataGridViewRow row in rows) { foreach (DataGridViewCell cell in row.Cells) { if (cell.Selected) { selectedCells.InternalAdd(cell); } } } return selectedCells; } } [Browsable (false)] public DataGridViewSelectedColumnCollection SelectedColumns { get { DataGridViewSelectedColumnCollection result = new DataGridViewSelectedColumnCollection (); if (selectionMode != DataGridViewSelectionMode.FullColumnSelect && selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect) return result; result.InternalAddRange (selected_columns); return result; } } [Browsable (false)] public DataGridViewSelectedRowCollection SelectedRows { get { DataGridViewSelectedRowCollection result = new DataGridViewSelectedRowCollection (this); if (selectionMode != DataGridViewSelectionMode.FullRowSelect && selectionMode != DataGridViewSelectionMode.RowHeaderSelect) return result; result.InternalAddRange (selected_rows); return result; } } [Browsable (true)] [DefaultValue (DataGridViewSelectionMode.RowHeaderSelect)] public DataGridViewSelectionMode SelectionMode { get { return selectionMode; } set { if (!Enum.IsDefined (typeof(DataGridViewSelectionMode), value)) throw new InvalidEnumArgumentException ("Value is not valid DataGridViewSelectionMode."); if (value == DataGridViewSelectionMode.ColumnHeaderSelect || value == DataGridViewSelectionMode.FullColumnSelect) foreach (DataGridViewColumn col in Columns) if (col.SortMode == DataGridViewColumnSortMode.Automatic) throw new InvalidOperationException (string.Format ("Cannot set SelectionMode to {0} because there are Automatic sort columns.", value)); selectionMode = value; } } [DefaultValue (true)] public bool ShowCellErrors { get { return showCellErrors; } set { showCellErrors = value; } } [DefaultValue (true)] public bool ShowCellToolTips { get { return showCellToolTips; } set { showCellToolTips = value; } } [DefaultValue (true)] public bool ShowEditingIcon { get { return showEditingIcon; } set { showEditingIcon = value; } } [DefaultValue (true)] public bool ShowRowErrors { get { return showRowErrors; } set { showRowErrors = value; } } [Browsable (false)] public DataGridViewColumn SortedColumn { get { return sortedColumn; } } [Browsable (false)] public SortOrder SortOrder { get { return sortOrder; } } [DefaultValue (false)] [EditorBrowsable (EditorBrowsableState.Advanced)] public bool StandardTab { get { return standardTab; } set { standardTab = value; } } [Bindable (false)] [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Never)] public override string Text { get { return base.Text; } set { base.Text = value; } } [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public DataGridViewHeaderCell TopLeftHeaderCell { get { if (topLeftHeaderCell == null) { topLeftHeaderCell = new DataGridViewTopLeftHeaderCell (); topLeftHeaderCell.SetDataGridView (this); } return topLeftHeaderCell; } set { if (topLeftHeaderCell == value) return; if (topLeftHeaderCell != null) topLeftHeaderCell.SetDataGridView (null); topLeftHeaderCell = value; if (topLeftHeaderCell != null) topLeftHeaderCell.SetDataGridView (this); } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Advanced)] public Cursor UserSetCursor { get { return userSetCursor; } } [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public int VerticalScrollingOffset { get { return verticalScrollingOffset; } } [MonoTODO ("VirtualMode is not supported.")] [EditorBrowsable (EditorBrowsableState.Advanced)] [DefaultValue (false)] public bool VirtualMode { get { return virtualMode; } set { virtualMode = value; } } internal Control EditingControlInternal { get { return editingControl; } set { if (value == editingControl) return; if (editingControl != null) { // Can't use Controls.Remove (editingControls), because that method // is overriden to not remove the editing control. DataGridView.DataGridViewControlCollection ctrls = Controls as DataGridView.DataGridViewControlCollection; if (ctrls != null) { ctrls.RemoveInternal (editingControl); } else { Controls.Remove (editingControl); } } if (value != null) { value.Visible = false; Controls.Add (value); } editingControl = value; } } static object AllowUserToAddRowsChangedEvent = new object (); static object AllowUserToDeleteRowsChangedEvent = new object (); static object AllowUserToOrderColumnsChangedEvent = new object (); static object AllowUserToResizeColumnsChangedEvent = new object (); static object AllowUserToResizeRowsChangedEvent = new object (); static object AlternatingRowsDefaultCellStyleChangedEvent = new object (); static object AutoGenerateColumnsChangedEvent = new object (); static object AutoSizeColumnModeChangedEvent = new object (); static object AutoSizeColumnsModeChangedEvent = new object (); static object AutoSizeRowsModeChangedEvent = new object (); static object BackgroundColorChangedEvent = new object (); static object BorderStyleChangedEvent = new object (); static object CancelRowEditEvent = new object (); static object CellBeginEditEvent = new object (); static object CellBorderStyleChangedEvent = new object (); static object CellClickEvent = new object (); static object CellContentClickEvent = new object (); static object CellContentDoubleClickEvent = new object (); static object CellContextMenuStripChangedEvent = new object (); static object CellContextMenuStripNeededEvent = new object (); static object CellDoubleClickEvent = new object (); static object CellEndEditEvent = new object (); static object CellEnterEvent = new object (); static object CellErrorTextChangedEvent = new object (); static object CellErrorTextNeededEvent = new object (); static object CellFormattingEvent = new object (); static object CellLeaveEvent = new object (); static object CellMouseClickEvent = new object (); static object CellMouseDoubleClickEvent = new object (); static object CellMouseDownEvent = new object (); static object CellMouseEnterEvent = new object (); static object CellMouseLeaveEvent = new object (); static object CellMouseMoveEvent = new object (); static object CellMouseUpEvent = new object (); static object CellPaintingEvent = new object (); static object CellParsingEvent = new object (); static object CellStateChangedEvent = new object (); static object CellStyleChangedEvent = new object (); static object CellStyleContentChangedEvent = new object (); static object CellToolTipTextChangedEvent = new object (); static object CellToolTipTextNeededEvent = new object (); static object CellValidatedEvent = new object (); static object CellValidatingEvent = new object (); static object CellValueChangedEvent = new object (); static object CellValueNeededEvent = new object (); static object CellValuePushedEvent = new object (); static object ColumnAddedEvent = new object (); static object ColumnContextMenuStripChangedEvent = new object (); static object ColumnDataPropertyNameChangedEvent = new object (); static object ColumnDefaultCellStyleChangedEvent = new object (); static object ColumnDisplayIndexChangedEvent = new object (); static object ColumnDividerDoubleClickEvent = new object (); static object ColumnDividerWidthChangedEvent = new object (); static object ColumnHeaderCellChangedEvent = new object (); static object ColumnHeaderMouseClickEvent = new object (); static object ColumnHeaderMouseDoubleClickEvent = new object (); static object ColumnHeadersBorderStyleChangedEvent = new object (); static object ColumnHeadersDefaultCellStyleChangedEvent = new object (); static object ColumnHeadersHeightChangedEvent = new object (); static object ColumnHeadersHeightSizeModeChangedEvent = new object (); static object ColumnMinimumWidthChangedEvent = new object (); static object ColumnNameChangedEvent = new object (); static object ColumnRemovedEvent = new object (); static object ColumnSortModeChangedEvent = new object (); static object ColumnStateChangedEvent = new object (); static object ColumnToolTipTextChangedEvent = new object (); static object ColumnWidthChangedEvent = new object (); static object CurrentCellChangedEvent = new object (); static object CurrentCellDirtyStateChangedEvent = new object (); static object DataBindingCompleteEvent = new object (); static object DataErrorEvent = new object (); static object DataMemberChangedEvent = new object (); static object DataSourceChangedEvent = new object (); static object DefaultCellStyleChangedEvent = new object (); static object DefaultValuesNeededEvent = new object (); static object EditingControlShowingEvent = new object (); static object EditModeChangedEvent = new object (); static object GridColorChangedEvent = new object (); static object MultiSelectChangedEvent = new object (); static object NewRowNeededEvent = new object (); static object ReadOnlyChangedEvent = new object (); static object RowContextMenuStripChangedEvent = new object (); static object RowContextMenuStripNeededEvent = new object (); static object RowDefaultCellStyleChangedEvent = new object (); static object RowDirtyStateNeededEvent = new object (); static object RowDividerDoubleClickEvent = new object (); static object RowDividerHeightChangedEvent = new object (); static object RowEnterEvent = new object (); static object RowErrorTextChangedEvent = new object (); static object RowErrorTextNeededEvent = new object (); static object RowHeaderCellChangedEvent = new object (); static object RowHeaderMouseClickEvent = new object (); static object RowHeaderMouseDoubleClickEvent = new object (); static object RowHeadersBorderStyleChangedEvent = new object (); static object RowHeadersDefaultCellStyleChangedEvent = new object (); static object RowHeadersWidthChangedEvent = new object (); static object RowHeadersWidthSizeModeChangedEvent = new object (); static object RowHeightChangedEvent = new object (); static object RowHeightInfoNeededEvent = new object (); static object RowHeightInfoPushedEvent = new object (); static object RowLeaveEvent = new object (); static object RowMinimumHeightChangedEvent = new object (); static object RowPostPaintEvent = new object (); static object RowPrePaintEvent = new object (); static object RowsAddedEvent = new object (); static object RowsDefaultCellStyleChangedEvent = new object (); static object RowsRemovedEvent = new object (); static object RowStateChangedEvent = new object (); static object RowUnsharedEvent = new object (); static object RowValidatedEvent = new object (); static object RowValidatingEvent = new object (); static object ScrollEvent = new object (); static object SelectionChangedEvent = new object (); static object SortCompareEvent = new object (); static object SortedEvent = new object (); static object UserAddedRowEvent = new object (); static object UserDeletedRowEvent = new object (); static object UserDeletingRowEvent = new object (); // public event EventHandler AllowUserToAddRowsChanged { add { Events.AddHandler (AllowUserToAddRowsChangedEvent, value); } remove { Events.RemoveHandler (AllowUserToAddRowsChangedEvent, value); } } public event EventHandler AllowUserToDeleteRowsChanged { add { Events.AddHandler (AllowUserToDeleteRowsChangedEvent, value); } remove { Events.RemoveHandler (AllowUserToDeleteRowsChangedEvent, value); } } public event EventHandler AllowUserToOrderColumnsChanged { add { Events.AddHandler (AllowUserToOrderColumnsChangedEvent, value); } remove { Events.RemoveHandler (AllowUserToOrderColumnsChangedEvent, value); } } public event EventHandler AllowUserToResizeColumnsChanged { add { Events.AddHandler (AllowUserToResizeColumnsChangedEvent, value); } remove { Events.RemoveHandler (AllowUserToResizeColumnsChangedEvent, value); } } public event EventHandler AllowUserToResizeRowsChanged { add { Events.AddHandler (AllowUserToResizeRowsChangedEvent, value); } remove { Events.RemoveHandler (AllowUserToResizeRowsChangedEvent, value); } } public event EventHandler AlternatingRowsDefaultCellStyleChanged { add { Events.AddHandler (AlternatingRowsDefaultCellStyleChangedEvent, value); } remove { Events.RemoveHandler (AlternatingRowsDefaultCellStyleChangedEvent, value); } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Advanced)] public event EventHandler AutoGenerateColumnsChanged { add { Events.AddHandler (AutoGenerateColumnsChangedEvent, value); } remove { Events.RemoveHandler (AutoGenerateColumnsChangedEvent, value); } } public event DataGridViewAutoSizeColumnModeEventHandler AutoSizeColumnModeChanged { add { Events.AddHandler (AutoSizeColumnModeChangedEvent, value); } remove { Events.RemoveHandler (AutoSizeColumnModeChangedEvent, value); } } public event DataGridViewAutoSizeColumnsModeEventHandler AutoSizeColumnsModeChanged { add { Events.AddHandler (AutoSizeColumnsModeChangedEvent, value); } remove { Events.RemoveHandler (AutoSizeColumnsModeChangedEvent, value); } } public event DataGridViewAutoSizeModeEventHandler AutoSizeRowsModeChanged { add { Events.AddHandler (AutoSizeRowsModeChangedEvent, value); } remove { Events.RemoveHandler (AutoSizeRowsModeChangedEvent, value); } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Never)] public new event EventHandler BackColorChanged { add { base.BackColorChanged += value; } remove { base.BackColorChanged -= value; } } public event EventHandler BackgroundColorChanged { add { Events.AddHandler (BackgroundColorChangedEvent, value); } remove { Events.RemoveHandler (BackgroundColorChangedEvent, value); } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Never)] public new event EventHandler BackgroundImageChanged { add { base.BackgroundImageChanged += value; } remove { base.BackgroundImageChanged -= value; } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Never)] public new event EventHandler BackgroundImageLayoutChanged { add { base.BackgroundImageLayoutChanged += value; } remove { base.BackgroundImageLayoutChanged -= value; } } public event EventHandler BorderStyleChanged { add { Events.AddHandler (BorderStyleChangedEvent, value); } remove { Events.RemoveHandler (BorderStyleChangedEvent, value); } } public event QuestionEventHandler CancelRowEdit { add { Events.AddHandler (CancelRowEditEvent, value); } remove { Events.RemoveHandler (CancelRowEditEvent, value); } } public event DataGridViewCellCancelEventHandler CellBeginEdit { add { Events.AddHandler (CellBeginEditEvent, value); } remove { Events.RemoveHandler (CellBeginEditEvent, value); } } public event EventHandler CellBorderStyleChanged { add { Events.AddHandler (CellBorderStyleChangedEvent, value); } remove { Events.RemoveHandler (CellBorderStyleChangedEvent, value); } } public event DataGridViewCellEventHandler CellClick { add { Events.AddHandler (CellClickEvent, value); } remove { Events.RemoveHandler (CellClickEvent, value); } } public event DataGridViewCellEventHandler CellContentClick { add { Events.AddHandler (CellContentClickEvent, value); } remove { Events.RemoveHandler (CellContentClickEvent, value); } } public event DataGridViewCellEventHandler CellContentDoubleClick { add { Events.AddHandler (CellContentDoubleClickEvent, value); } remove { Events.RemoveHandler (CellContentDoubleClickEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event DataGridViewCellEventHandler CellContextMenuStripChanged { add { Events.AddHandler (CellContextMenuStripChangedEvent, value); } remove { Events.RemoveHandler (CellContextMenuStripChangedEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event DataGridViewCellContextMenuStripNeededEventHandler CellContextMenuStripNeeded { add { Events.AddHandler (CellContextMenuStripNeededEvent, value); } remove { Events.RemoveHandler (CellContextMenuStripNeededEvent, value); } } public event DataGridViewCellEventHandler CellDoubleClick { add { Events.AddHandler (CellDoubleClickEvent, value); } remove { Events.RemoveHandler (CellDoubleClickEvent, value); } } public event DataGridViewCellEventHandler CellEndEdit { add { Events.AddHandler (CellEndEditEvent, value); } remove { Events.RemoveHandler (CellEndEditEvent, value); } } public event DataGridViewCellEventHandler CellEnter { add { Events.AddHandler (CellEnterEvent, value); } remove { Events.RemoveHandler (CellEnterEvent, value); } } public event DataGridViewCellEventHandler CellErrorTextChanged { add { Events.AddHandler (CellErrorTextChangedEvent, value); } remove { Events.RemoveHandler (CellErrorTextChangedEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event DataGridViewCellErrorTextNeededEventHandler CellErrorTextNeeded { add { Events.AddHandler (CellErrorTextNeededEvent, value); } remove { Events.RemoveHandler (CellErrorTextNeededEvent, value); } } public event DataGridViewCellFormattingEventHandler CellFormatting { add { Events.AddHandler (CellFormattingEvent, value); } remove { Events.RemoveHandler (CellFormattingEvent, value); } } public event DataGridViewCellEventHandler CellLeave { add { Events.AddHandler (CellLeaveEvent, value); } remove { Events.RemoveHandler (CellLeaveEvent, value); } } public event DataGridViewCellMouseEventHandler CellMouseClick { add { Events.AddHandler (CellMouseClickEvent, value); } remove { Events.RemoveHandler (CellMouseClickEvent, value); } } public event DataGridViewCellMouseEventHandler CellMouseDoubleClick { add { Events.AddHandler (CellMouseDoubleClickEvent, value); } remove { Events.RemoveHandler (CellMouseDoubleClickEvent, value); } } public event DataGridViewCellMouseEventHandler CellMouseDown { add { Events.AddHandler (CellMouseDownEvent, value); } remove { Events.RemoveHandler (CellMouseDownEvent, value); } } public event DataGridViewCellEventHandler CellMouseEnter { add { Events.AddHandler (CellMouseEnterEvent, value); } remove { Events.RemoveHandler (CellMouseEnterEvent, value); } } public event DataGridViewCellEventHandler CellMouseLeave { add { Events.AddHandler (CellMouseLeaveEvent, value); } remove { Events.RemoveHandler (CellMouseLeaveEvent, value); } } public event DataGridViewCellMouseEventHandler CellMouseMove { add { Events.AddHandler (CellMouseMoveEvent, value); } remove { Events.RemoveHandler (CellMouseMoveEvent, value); } } public event DataGridViewCellMouseEventHandler CellMouseUp { add { Events.AddHandler (CellMouseUpEvent, value); } remove { Events.RemoveHandler (CellMouseUpEvent, value); } } public event DataGridViewCellPaintingEventHandler CellPainting { add { Events.AddHandler (CellPaintingEvent, value); } remove { Events.RemoveHandler (CellPaintingEvent, value); } } public event DataGridViewCellParsingEventHandler CellParsing { add { Events.AddHandler (CellParsingEvent, value); } remove { Events.RemoveHandler (CellParsingEvent, value); } } public event DataGridViewCellStateChangedEventHandler CellStateChanged { add { Events.AddHandler (CellStateChangedEvent, value); } remove { Events.RemoveHandler (CellStateChangedEvent, value); } } public event DataGridViewCellEventHandler CellStyleChanged { add { Events.AddHandler (CellStyleChangedEvent, value); } remove { Events.RemoveHandler (CellStyleChangedEvent, value); } } public event DataGridViewCellStyleContentChangedEventHandler CellStyleContentChanged { add { Events.AddHandler (CellStyleContentChangedEvent, value); } remove { Events.RemoveHandler (CellStyleContentChangedEvent, value); } } public event DataGridViewCellEventHandler CellToolTipTextChanged { add { Events.AddHandler (CellToolTipTextChangedEvent, value); } remove { Events.RemoveHandler (CellToolTipTextChangedEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event DataGridViewCellToolTipTextNeededEventHandler CellToolTipTextNeeded { add { Events.AddHandler (CellToolTipTextNeededEvent, value); } remove { Events.RemoveHandler (CellToolTipTextNeededEvent, value); } } public event DataGridViewCellEventHandler CellValidated { add { Events.AddHandler (CellValidatedEvent, value); } remove { Events.RemoveHandler (CellValidatedEvent, value); } } public event DataGridViewCellValidatingEventHandler CellValidating { add { Events.AddHandler (CellValidatingEvent, value); } remove { Events.RemoveHandler (CellValidatingEvent, value); } } public event DataGridViewCellEventHandler CellValueChanged { add { Events.AddHandler (CellValueChangedEvent, value); } remove { Events.RemoveHandler (CellValueChangedEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event DataGridViewCellValueEventHandler CellValueNeeded { add { Events.AddHandler (CellValueNeededEvent, value); } remove { Events.RemoveHandler (CellValueNeededEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event DataGridViewCellValueEventHandler CellValuePushed { add { Events.AddHandler (CellValuePushedEvent, value); } remove { Events.RemoveHandler (CellValuePushedEvent, value); } } public event DataGridViewColumnEventHandler ColumnAdded { add { Events.AddHandler (ColumnAddedEvent, value); } remove { Events.RemoveHandler (ColumnAddedEvent, value); } } public event DataGridViewColumnEventHandler ColumnContextMenuStripChanged { add { Events.AddHandler (ColumnContextMenuStripChangedEvent, value); } remove { Events.RemoveHandler (ColumnContextMenuStripChangedEvent, value); } } public event DataGridViewColumnEventHandler ColumnDataPropertyNameChanged { add { Events.AddHandler (ColumnDataPropertyNameChangedEvent, value); } remove { Events.RemoveHandler (ColumnDataPropertyNameChangedEvent, value); } } public event DataGridViewColumnEventHandler ColumnDefaultCellStyleChanged { add { Events.AddHandler (ColumnDefaultCellStyleChangedEvent, value); } remove { Events.RemoveHandler (ColumnDefaultCellStyleChangedEvent, value); } } public event DataGridViewColumnEventHandler ColumnDisplayIndexChanged { add { Events.AddHandler (ColumnDisplayIndexChangedEvent, value); } remove { Events.RemoveHandler (ColumnDisplayIndexChangedEvent, value); } } public event DataGridViewColumnDividerDoubleClickEventHandler ColumnDividerDoubleClick { add { Events.AddHandler (ColumnDividerDoubleClickEvent, value); } remove { Events.RemoveHandler (ColumnDividerDoubleClickEvent, value); } } public event DataGridViewColumnEventHandler ColumnDividerWidthChanged { add { Events.AddHandler (ColumnDividerWidthChangedEvent, value); } remove { Events.RemoveHandler (ColumnDividerWidthChangedEvent, value); } } public event DataGridViewColumnEventHandler ColumnHeaderCellChanged { add { Events.AddHandler (ColumnHeaderCellChangedEvent, value); } remove { Events.RemoveHandler (ColumnHeaderCellChangedEvent, value); } } public event DataGridViewCellMouseEventHandler ColumnHeaderMouseClick { add { Events.AddHandler (ColumnHeaderMouseClickEvent, value); } remove { Events.RemoveHandler (ColumnHeaderMouseClickEvent, value); } } public event DataGridViewCellMouseEventHandler ColumnHeaderMouseDoubleClick { add { Events.AddHandler (ColumnHeaderMouseDoubleClickEvent, value); } remove { Events.RemoveHandler (ColumnHeaderMouseDoubleClickEvent, value); } } public event EventHandler ColumnHeadersBorderStyleChanged { add { Events.AddHandler (ColumnHeadersBorderStyleChangedEvent, value); } remove { Events.RemoveHandler (ColumnHeadersBorderStyleChangedEvent, value); } } public event EventHandler ColumnHeadersDefaultCellStyleChanged { add { Events.AddHandler (ColumnHeadersDefaultCellStyleChangedEvent, value); } remove { Events.RemoveHandler (ColumnHeadersDefaultCellStyleChangedEvent, value); } } public event EventHandler ColumnHeadersHeightChanged { add { Events.AddHandler (ColumnHeadersHeightChangedEvent, value); } remove { Events.RemoveHandler (ColumnHeadersHeightChangedEvent, value); } } public event DataGridViewAutoSizeModeEventHandler ColumnHeadersHeightSizeModeChanged { add { Events.AddHandler (ColumnHeadersHeightSizeModeChangedEvent, value); } remove { Events.RemoveHandler (ColumnHeadersHeightSizeModeChangedEvent, value); } } public event DataGridViewColumnEventHandler ColumnMinimumWidthChanged { add { Events.AddHandler (ColumnMinimumWidthChangedEvent, value); } remove { Events.RemoveHandler (ColumnMinimumWidthChangedEvent, value); } } public event DataGridViewColumnEventHandler ColumnNameChanged { add { Events.AddHandler (ColumnNameChangedEvent, value); } remove { Events.RemoveHandler (ColumnNameChangedEvent, value); } } public event DataGridViewColumnEventHandler ColumnRemoved { add { Events.AddHandler (ColumnRemovedEvent, value); } remove { Events.RemoveHandler (ColumnRemovedEvent, value); } } public event DataGridViewColumnEventHandler ColumnSortModeChanged { add { Events.AddHandler (ColumnSortModeChangedEvent, value); } remove { Events.RemoveHandler (ColumnSortModeChangedEvent, value); } } public event DataGridViewColumnStateChangedEventHandler ColumnStateChanged { add { Events.AddHandler (ColumnStateChangedEvent, value); } remove { Events.RemoveHandler (ColumnStateChangedEvent, value); } } public event DataGridViewColumnEventHandler ColumnToolTipTextChanged { add { Events.AddHandler (ColumnToolTipTextChangedEvent, value); } remove { Events.RemoveHandler (ColumnToolTipTextChangedEvent, value); } } public event DataGridViewColumnEventHandler ColumnWidthChanged { add { Events.AddHandler (ColumnWidthChangedEvent, value); } remove { Events.RemoveHandler (ColumnWidthChangedEvent, value); } } public event EventHandler CurrentCellChanged { add { Events.AddHandler (CurrentCellChangedEvent, value); } remove { Events.RemoveHandler (CurrentCellChangedEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event EventHandler CurrentCellDirtyStateChanged { add { Events.AddHandler (CurrentCellDirtyStateChangedEvent, value); } remove { Events.RemoveHandler (CurrentCellDirtyStateChangedEvent, value); } } public event DataGridViewBindingCompleteEventHandler DataBindingComplete { add { Events.AddHandler (DataBindingCompleteEvent, value); } remove { Events.RemoveHandler (DataBindingCompleteEvent, value); } } public event DataGridViewDataErrorEventHandler DataError { add { Events.AddHandler (DataErrorEvent, value); } remove { Events.RemoveHandler (DataErrorEvent, value); } } public event EventHandler DataMemberChanged { add { Events.AddHandler (DataMemberChangedEvent, value); } remove { Events.RemoveHandler (DataMemberChangedEvent, value); } } public event EventHandler DataSourceChanged { add { Events.AddHandler (DataSourceChangedEvent, value); } remove { Events.RemoveHandler (DataSourceChangedEvent, value); } } public event EventHandler DefaultCellStyleChanged { add { Events.AddHandler (DefaultCellStyleChangedEvent, value); } remove { Events.RemoveHandler (DefaultCellStyleChangedEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event DataGridViewRowEventHandler DefaultValuesNeeded { add { Events.AddHandler (DefaultValuesNeededEvent, value); } remove { Events.RemoveHandler (DefaultValuesNeededEvent, value); } } public event DataGridViewEditingControlShowingEventHandler EditingControlShowing { add { Events.AddHandler (EditingControlShowingEvent, value); } remove { Events.RemoveHandler (EditingControlShowingEvent, value); } } public event EventHandler EditModeChanged { add { Events.AddHandler (EditModeChangedEvent, value); } remove { Events.RemoveHandler (EditModeChangedEvent, value); } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Advanced)] public new event EventHandler FontChanged { add { base.FontChanged += value; } remove { base.FontChanged -= value; } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Advanced)] public new event EventHandler ForeColorChanged { add { base.ForeColorChanged += value; } remove { base.ForeColorChanged -= value; } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Never)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public new event EventHandler PaddingChanged { add { base.PaddingChanged += value; } remove { base.PaddingChanged -= value; } } public event EventHandler GridColorChanged { add { Events.AddHandler (GridColorChangedEvent, value); } remove { Events.RemoveHandler (GridColorChangedEvent, value); } } public event EventHandler MultiSelectChanged { add { Events.AddHandler (MultiSelectChangedEvent, value); } remove { Events.RemoveHandler (MultiSelectChangedEvent, value); } } public event DataGridViewRowEventHandler NewRowNeeded { add { Events.AddHandler (NewRowNeededEvent, value); } remove { Events.RemoveHandler (NewRowNeededEvent, value); } } public event EventHandler ReadOnlyChanged { add { Events.AddHandler (ReadOnlyChangedEvent, value); } remove { Events.RemoveHandler (ReadOnlyChangedEvent, value); } } public event DataGridViewRowEventHandler RowContextMenuStripChanged { add { Events.AddHandler (RowContextMenuStripChangedEvent, value); } remove { Events.RemoveHandler (RowContextMenuStripChangedEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event DataGridViewRowContextMenuStripNeededEventHandler RowContextMenuStripNeeded { add { Events.AddHandler (RowContextMenuStripNeededEvent, value); } remove { Events.RemoveHandler (RowContextMenuStripNeededEvent, value); } } public event DataGridViewRowEventHandler RowDefaultCellStyleChanged { add { Events.AddHandler (RowDefaultCellStyleChangedEvent, value); } remove { Events.RemoveHandler (RowDefaultCellStyleChangedEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event QuestionEventHandler RowDirtyStateNeeded { add { Events.AddHandler (RowDirtyStateNeededEvent, value); } remove { Events.RemoveHandler (RowDirtyStateNeededEvent, value); } } public event DataGridViewRowDividerDoubleClickEventHandler RowDividerDoubleClick { add { Events.AddHandler (RowDividerDoubleClickEvent, value); } remove { Events.RemoveHandler (RowDividerDoubleClickEvent, value); } } public event DataGridViewRowEventHandler RowDividerHeightChanged { add { Events.AddHandler (RowDividerHeightChangedEvent, value); } remove { Events.RemoveHandler (RowDividerHeightChangedEvent, value); } } public event DataGridViewCellEventHandler RowEnter { add { Events.AddHandler (RowEnterEvent, value); } remove { Events.RemoveHandler (RowEnterEvent, value); } } public event DataGridViewRowEventHandler RowErrorTextChanged { add { Events.AddHandler (RowErrorTextChangedEvent, value); } remove { Events.RemoveHandler (RowErrorTextChangedEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event DataGridViewRowErrorTextNeededEventHandler RowErrorTextNeeded { add { Events.AddHandler (RowErrorTextNeededEvent, value); } remove { Events.RemoveHandler (RowErrorTextNeededEvent, value); } } public event DataGridViewRowEventHandler RowHeaderCellChanged { add { Events.AddHandler (RowHeaderCellChangedEvent, value); } remove { Events.RemoveHandler (RowHeaderCellChangedEvent, value); } } public event DataGridViewCellMouseEventHandler RowHeaderMouseClick { add { Events.AddHandler (RowHeaderMouseClickEvent, value); } remove { Events.RemoveHandler (RowHeaderMouseClickEvent, value); } } public event DataGridViewCellMouseEventHandler RowHeaderMouseDoubleClick { add { Events.AddHandler (RowHeaderMouseDoubleClickEvent, value); } remove { Events.RemoveHandler (RowHeaderMouseDoubleClickEvent, value); } } public event EventHandler RowHeadersBorderStyleChanged { add { Events.AddHandler (RowHeadersBorderStyleChangedEvent, value); } remove { Events.RemoveHandler (RowHeadersBorderStyleChangedEvent, value); } } public event EventHandler RowHeadersDefaultCellStyleChanged { add { Events.AddHandler (RowHeadersDefaultCellStyleChangedEvent, value); } remove { Events.RemoveHandler (RowHeadersDefaultCellStyleChangedEvent, value); } } public event EventHandler RowHeadersWidthChanged { add { Events.AddHandler (RowHeadersWidthChangedEvent, value); } remove { Events.RemoveHandler (RowHeadersWidthChangedEvent, value); } } public event DataGridViewAutoSizeModeEventHandler RowHeadersWidthSizeModeChanged { add { Events.AddHandler (RowHeadersWidthSizeModeChangedEvent, value); } remove { Events.RemoveHandler (RowHeadersWidthSizeModeChangedEvent, value); } } public event DataGridViewRowEventHandler RowHeightChanged { add { Events.AddHandler (RowHeightChangedEvent, value); } remove { Events.RemoveHandler (RowHeightChangedEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event DataGridViewRowHeightInfoNeededEventHandler RowHeightInfoNeeded { add { Events.AddHandler (RowHeightInfoNeededEvent, value); } remove { Events.RemoveHandler (RowHeightInfoNeededEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event DataGridViewRowHeightInfoPushedEventHandler RowHeightInfoPushed { add { Events.AddHandler (RowHeightInfoPushedEvent, value); } remove { Events.RemoveHandler (RowHeightInfoPushedEvent, value); } } public event DataGridViewCellEventHandler RowLeave { add { Events.AddHandler (RowLeaveEvent, value); } remove { Events.RemoveHandler (RowLeaveEvent, value); } } public event DataGridViewRowEventHandler RowMinimumHeightChanged { add { Events.AddHandler (RowMinimumHeightChangedEvent, value); } remove { Events.RemoveHandler (RowMinimumHeightChangedEvent, value); } } public event DataGridViewRowPostPaintEventHandler RowPostPaint { add { Events.AddHandler (RowPostPaintEvent, value); } remove { Events.RemoveHandler (RowPostPaintEvent, value); } } public event DataGridViewRowPrePaintEventHandler RowPrePaint { add { Events.AddHandler (RowPrePaintEvent, value); } remove { Events.RemoveHandler (RowPrePaintEvent, value); } } public event DataGridViewRowsAddedEventHandler RowsAdded { add { Events.AddHandler (RowsAddedEvent, value); } remove { Events.RemoveHandler (RowsAddedEvent, value); } } public event EventHandler RowsDefaultCellStyleChanged { add { Events.AddHandler (RowsDefaultCellStyleChangedEvent, value); } remove { Events.RemoveHandler (RowsDefaultCellStyleChangedEvent, value); } } public event DataGridViewRowsRemovedEventHandler RowsRemoved { add { Events.AddHandler (RowsRemovedEvent, value); } remove { Events.RemoveHandler (RowsRemovedEvent, value); } } public event DataGridViewRowStateChangedEventHandler RowStateChanged { add { Events.AddHandler (RowStateChangedEvent, value); } remove { Events.RemoveHandler (RowStateChangedEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event DataGridViewRowEventHandler RowUnshared { add { Events.AddHandler (RowUnsharedEvent, value); } remove { Events.RemoveHandler (RowUnsharedEvent, value); } } public event DataGridViewCellEventHandler RowValidated { add { Events.AddHandler (RowValidatedEvent, value); } remove { Events.RemoveHandler (RowValidatedEvent, value); } } public event DataGridViewCellCancelEventHandler RowValidating { add { Events.AddHandler (RowValidatingEvent, value); } remove { Events.RemoveHandler (RowValidatingEvent, value); } } public event ScrollEventHandler Scroll { add { Events.AddHandler (ScrollEvent, value); } remove { Events.RemoveHandler (ScrollEvent, value); } } public event EventHandler SelectionChanged { add { Events.AddHandler (SelectionChangedEvent, value); } remove { Events.RemoveHandler (SelectionChangedEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event DataGridViewSortCompareEventHandler SortCompare { add { Events.AddHandler (SortCompareEvent, value); } remove { Events.RemoveHandler (SortCompareEvent, value); } } public event EventHandler Sorted { add { Events.AddHandler (SortedEvent, value); } remove { Events.RemoveHandler (SortedEvent, value); } } public event DataGridViewRowEventHandler UserAddedRow { add { Events.AddHandler (UserAddedRowEvent, value); } remove { Events.RemoveHandler (UserAddedRowEvent, value); } } public event DataGridViewRowEventHandler UserDeletedRow { add { Events.AddHandler (UserDeletedRowEvent, value); } remove { Events.RemoveHandler (UserDeletedRowEvent, value); } } public event DataGridViewRowCancelEventHandler UserDeletingRow { add { Events.AddHandler (UserDeletingRowEvent, value); } remove { Events.RemoveHandler (UserDeletingRowEvent, value); } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Never)] public new event EventHandler StyleChanged { add { base.StyleChanged += value; } remove { base.StyleChanged -= value; } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Never)] public new event EventHandler TextChanged { add { base.TextChanged += value; } remove { base.TextChanged -= value; } } [EditorBrowsable (EditorBrowsableState.Advanced)] public virtual DataGridViewAdvancedBorderStyle AdjustColumnHeaderBorderStyle (DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStyleInput, DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStylePlaceholder, bool isFirstDisplayedColumn, bool isLastVisibleColumn) { return (DataGridViewAdvancedBorderStyle) ((ICloneable)dataGridViewAdvancedBorderStyleInput).Clone(); } public bool AreAllCellsSelected (bool includeInvisibleCells) { foreach (DataGridViewRow row in rows) { foreach (DataGridViewCell cell in row.Cells) { if (includeInvisibleCells == false && cell.Visible == false) { continue; } if (!cell.Selected) { return false; } } } return true; } public void AutoResizeColumn (int columnIndex) { AutoResizeColumn (columnIndex, DataGridViewAutoSizeColumnMode.AllCells); } public void AutoResizeColumn (int columnIndex, DataGridViewAutoSizeColumnMode autoSizeColumnMode) { AutoResizeColumnInternal (columnIndex, autoSizeColumnMode); } public void AutoResizeColumnHeadersHeight () { int new_height = 0; foreach (DataGridViewColumn col in Columns) new_height = Math.Max (new_height, col.HeaderCell.PreferredSize.Height); if (ColumnHeadersHeight != new_height) ColumnHeadersHeight = new_height; } [MonoTODO ("columnIndex parameter is not used")] public void AutoResizeColumnHeadersHeight (int columnIndex) { AutoResizeColumnHeadersHeight (); } public void AutoResizeColumns () { AutoResizeColumns (DataGridViewAutoSizeColumnsMode.AllCells); } public void AutoResizeColumns (DataGridViewAutoSizeColumnsMode autoSizeColumnsMode) { AutoResizeColumns (autoSizeColumnsMode, true); } public void AutoResizeRow (int rowIndex) { AutoResizeRow (rowIndex, DataGridViewAutoSizeRowMode.AllCells, true); } public void AutoResizeRow (int rowIndex, DataGridViewAutoSizeRowMode autoSizeRowMode) { AutoResizeRow (rowIndex, autoSizeRowMode, true); } public void AutoResizeRowHeadersWidth (DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode) { if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToFirstHeader) { RowHeadersWidth = GetRowInternal (0).HeaderCell.PreferredSize.Width; return; } int new_width = 0; if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders) { foreach (DataGridViewRow row in Rows) if (row.Displayed) new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width); if (RowHeadersWidth != new_width) RowHeadersWidth = new_width; return; } if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders) { foreach (DataGridViewRow row in Rows) new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width); if (RowHeadersWidth != new_width) RowHeadersWidth = new_width; return; } } [MonoTODO ("Does not use rowIndex parameter.")] public void AutoResizeRowHeadersWidth (int rowIndex, DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode) { AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode); } public void AutoResizeRows () { AutoResizeRows (0, Rows.Count, DataGridViewAutoSizeRowMode.AllCells, false); } public void AutoResizeRows (DataGridViewAutoSizeRowsMode autoSizeRowsMode) { if (!Enum.IsDefined(typeof(DataGridViewAutoSizeRowsMode), autoSizeRowsMode)) throw new InvalidEnumArgumentException ("Parameter autoSizeRowsMode is not a valid DataGridViewRowsMode."); if ((autoSizeRowsMode == DataGridViewAutoSizeRowsMode.AllHeaders || autoSizeRowsMode == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && rowHeadersVisible == false) throw new InvalidOperationException ("Parameter autoSizeRowsMode cannot be AllHeaders or DisplayedHeaders in this DataGridView."); if (autoSizeRowsMode == DataGridViewAutoSizeRowsMode.None) throw new ArgumentException ("Parameter autoSizeRowsMode cannot be None."); AutoResizeRows (autoSizeRowsMode, false); } public virtual bool BeginEdit (bool selectAll) { if (currentCell == null || currentCell.IsInEditMode) return false; if (currentCell.RowIndex >= 0) { if ((currentCell.InheritedState & DataGridViewElementStates.ReadOnly) == DataGridViewElementStates.ReadOnly) { return false; } } DataGridViewCell cell = currentCell; Type editType = cell.EditType; if (editType == null && !(cell is IDataGridViewEditingCell)) return false; // Give user a chance to cancel the edit DataGridViewCellCancelEventArgs e = new DataGridViewCellCancelEventArgs (cell.ColumnIndex, cell.RowIndex); OnCellBeginEdit (e); if (e.Cancel) return false; cell.SetIsInEditMode (true); // The cell has an editing control we need to setup if (editType != null) { Control ctrl = EditingControlInternal; // Check if we can reuse the one we already have bool isCorrectType = ctrl != null && ctrl.GetType () == editType; if (!isCorrectType) ctrl = null; // We couldn't use the existing one, create a new one if (ctrl == null) { ctrl = (Control) Activator.CreateInstance (editType); EditingControlInternal = ctrl; } // Call some functions that allows the editing control to get setup DataGridViewCellStyle style = cell.RowIndex == -1 ? DefaultCellStyle : cell.InheritedStyle; cell.InitializeEditingControl (cell.RowIndex, cell.FormattedValue, style); cell.PositionEditingControl (true, true, this.GetCellDisplayRectangle (cell.ColumnIndex, cell.RowIndex, false), bounds, style, false, false, (columns [cell.ColumnIndex].DisplayIndex == 0), (cell.RowIndex == 0)); // Show the editing control if (EditingControlInternal != null) EditingControlInternal.Visible = true; IDataGridViewEditingControl dgvEditingControl = (IDataGridViewEditingControl) EditingControlInternal; if (dgvEditingControl != null) { dgvEditingControl.EditingControlDataGridView = this; dgvEditingControl.EditingControlRowIndex = currentCell.OwningRow.Index; dgvEditingControl.ApplyCellStyleToEditingControl (style); dgvEditingControl.PrepareEditingControlForEdit (selectAll); dgvEditingControl.EditingControlFormattedValue = currentCell.EditedFormattedValue; } return true; } // If we are here, it means we have a cell that does not have an editing control // and simply implements IDataGridViewEditingCell itself. (cell as IDataGridViewEditingCell).PrepareEditingCellForEdit (selectAll); return true; } public bool CancelEdit () { if (currentCell != null) { if (currentCell.IsInEditMode) { currentCell.SetIsInEditMode (false); currentCell.DetachEditingControl (); } if (currentCell.RowIndex == NewRowIndex) { if (DataManager != null) DataManager.CancelCurrentEdit (); new_row_editing = false; PrepareEditingRow (false, false); MoveCurrentCell (currentCell.ColumnIndex, NewRowIndex, true, false, false, true); OnUserDeletedRow (new DataGridViewRowEventArgs (EditingRow)); } } return true; } public void ClearSelection () { foreach (DataGridViewColumn col in SelectedColumns) col.Selected = false; foreach (DataGridViewRow row in SelectedRows) row.Selected = false; foreach (DataGridViewCell cell in SelectedCells) cell.Selected = false; } public bool CommitEdit (DataGridViewDataErrorContexts context) { if (currentCell == null) return true; try { // convert object newValue = currentCell.ParseFormattedValue (currentCell.EditedFormattedValue, currentCell.InheritedStyle, null, null); DataGridViewCellValidatingEventArgs validateArgs = new DataGridViewCellValidatingEventArgs (currentCell.ColumnIndex, currentCell.RowIndex, newValue); // validate OnCellValidating (validateArgs); if (validateArgs.Cancel) return false; OnCellValidated (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex)); // commit currentCell.Value = newValue; } catch (Exception e) { DataGridViewDataErrorEventArgs args = new DataGridViewDataErrorEventArgs (e, currentCell.ColumnIndex, currentCell.RowIndex, DataGridViewDataErrorContexts.Commit); OnDataError (false, args); if (args.ThrowException) throw e; return false; } return true; } public int DisplayedColumnCount (bool includePartialColumns) { int result = 0; int columnLeft = 0; if (RowHeadersVisible) columnLeft += RowHeadersWidth; Size visibleClientArea = ClientSize; if (verticalScrollBar.Visible) visibleClientArea.Width -= verticalScrollBar.Width; if (horizontalScrollBar.Visible) visibleClientArea.Height -= horizontalScrollBar.Height; for (int index = first_col_index; index < Columns.Count; index++) { DataGridViewColumn column = Columns[ColumnDisplayIndexToIndex (index)]; if (columnLeft + column.Width <= visibleClientArea.Width) { result++; columnLeft += column.Width; } else { if (includePartialColumns) result++; break; } } return result; } public int DisplayedRowCount (bool includePartialRow) { int result = 0; int rowTop = 0; if (ColumnHeadersVisible) rowTop += ColumnHeadersHeight; Size visibleClientArea = ClientSize; if (verticalScrollBar.Visible) visibleClientArea.Width -= verticalScrollBar.Width; if (horizontalScrollBar.Visible) visibleClientArea.Height -= horizontalScrollBar.Height; for (int index = first_row_index; index < Rows.Count; index++) { DataGridViewRow row = GetRowInternal (index); if (rowTop + row.Height <= visibleClientArea.Height) { result++; rowTop += row.Height; } else { if (includePartialRow) result++; break; } } return result; } public bool EndEdit () { return EndEdit (DataGridViewDataErrorContexts.Commit); } [MonoTODO ("Does not use context parameter")] public bool EndEdit (DataGridViewDataErrorContexts context) { if (currentCell == null || !currentCell.IsInEditMode) return true; if (!CommitEdit (context)) { if (DataManager != null) DataManager.EndCurrentEdit (); if (EditingControl != null) EditingControl.Focus (); return false; } currentCell.SetIsInEditMode (false); currentCell.DetachEditingControl (); OnCellEndEdit (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex)); Focus (); if (currentCell.RowIndex == NewRowIndex) { new_row_editing = false; editing_row = null; // editing row becomes a real row PrepareEditingRow (true, false); // add a new editing row MoveCurrentCell (currentCell.ColumnIndex, NewRowIndex, true, false, false, true); } return true; } public int GetCellCount (DataGridViewElementStates includeFilter) { int result = 0; foreach (DataGridViewRow row in rows) { foreach (DataGridViewCell cell in row.Cells) { if ((cell.State & includeFilter) != 0) { result++; } } } return result; } internal DataGridViewRow GetRowInternal (int rowIndex) { return Rows.SharedRow (rowIndex); } internal DataGridViewCell GetCellInternal (int colIndex, int rowIndex) { return GetRowInternal (rowIndex).Cells.GetCellInternal (colIndex); } public Rectangle GetCellDisplayRectangle (int columnIndex, int rowIndex, bool cutOverflow) { if (columnIndex < 0 || columnIndex >= columns.Count) { throw new ArgumentOutOfRangeException("Column index is out of range."); } int x = 0, y = 0, w = 0, h = 0; x = BorderWidth; y = BorderWidth; if (ColumnHeadersVisible) y += ColumnHeadersHeight; if (RowHeadersVisible) x += RowHeadersWidth; List cols = columns.ColumnDisplayIndexSortedArrayList; for (int i = first_col_index; i < cols.Count; i++) { if (!cols[i].Visible) continue; if (cols[i].Index == columnIndex) { w = cols[i].Width; break; } x += cols[i].Width; } for (int i = first_row_index; i < Rows.Count; i++) { if (!rows[i].Visible) continue; if (rows[i].Index == rowIndex) { h = rows [i].Height; break; } y += rows [i].Height; } return new Rectangle (x, y, w, h); } public virtual DataObject GetClipboardContent () { if (clipboardCopyMode == DataGridViewClipboardCopyMode.Disable) throw new InvalidOperationException ("Generating Clipboard content is not supported when the ClipboardCopyMode property is Disable."); int start_row = int.MaxValue, end_row = int.MinValue; int start_col = int.MaxValue, end_col = int.MinValue; bool include_row_headers = false; bool include_col_headers = false; bool only_included_headers = false; bool headers_includable = false; switch (ClipboardCopyMode) { case DataGridViewClipboardCopyMode.EnableWithoutHeaderText: break; case DataGridViewClipboardCopyMode.EnableWithAutoHeaderText: // Headers are included if not selection mode is CellSelect, and any header is selected. headers_includable = selectionMode != DataGridViewSelectionMode.CellSelect; break; case DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText: include_col_headers = include_row_headers = true; break; } BitArray included_rows = new BitArray (RowCount); BitArray included_cols = new BitArray (ColumnCount); // If there are any selected columns, // include the column headers (if headers are to be shown). if (headers_includable && !include_col_headers) { for (int c = 0; c < ColumnCount; c++) { if (Columns [c].Selected) { include_col_headers = true; break; } } } // Find the smallest rectangle that encompasses all selected cells. for (int r = 0; r < RowCount; r++) { DataGridViewRow row = Rows [r]; if (headers_includable && !include_row_headers && row.Selected) { include_row_headers = true; } for (int c = 0; c < ColumnCount; c++) { DataGridViewCell cell = row.Cells [c]; if (cell == null || !cell.Selected) continue; included_cols [c] = true; included_rows [r] = true; start_row = Math.Min (start_row, r); start_col = Math.Min (start_col, c); end_row = Math.Max (end_row, r); end_col = Math.Max (end_col, c); } } // Mark rows/columns in between selected cells as included if the selection mode isn't FullHeaderSelect. switch (selectionMode){ case DataGridViewSelectionMode.CellSelect: case DataGridViewSelectionMode.ColumnHeaderSelect: case DataGridViewSelectionMode.RowHeaderSelect: if (selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect) { for (int r = start_row; r <= end_row; r++) { included_rows.Set (r, true); } } else if (start_row <= end_row) { included_rows.SetAll (true); } if (selectionMode != DataGridViewSelectionMode.RowHeaderSelect) { for (int c = start_col; c <= end_col; c++) { included_cols.Set (c, true); } } break; case DataGridViewSelectionMode.FullColumnSelect: case DataGridViewSelectionMode.FullRowSelect: only_included_headers = true; break; } if (start_row > end_row) return null; if (start_col > end_col) return null; DataObject result = new DataObject (); System.Text.StringBuilder text_builder = new System.Text.StringBuilder (); System.Text.StringBuilder utext_builder = new System.Text.StringBuilder (); System.Text.StringBuilder html_builder = new System.Text.StringBuilder (); System.Text.StringBuilder csv_builder = new System.Text.StringBuilder (); // Loop through all rows and columns to create the content. // -1 is the header row/column. int first_row = start_row; int first_col = start_col; if (include_col_headers) { first_row = -1; } for (int r = first_row; r <= end_row; r++) { DataGridViewRow row = null; if (r >= 0) { if (!included_rows [r]) continue; row = Rows [r]; } if (include_row_headers) { first_col = -1; } for (int c = first_col; c <= end_col; c++) { DataGridViewCell cell = null; if (c >= 0 && only_included_headers && !included_cols [c]) continue; if (row == null) { if (c == -1) { cell = TopLeftHeaderCell; } else { cell = Columns [c].HeaderCell; } } else { if (c == -1) { cell = row.HeaderCell; } else { cell = row.Cells [c]; } } string text, utext, html, csv; bool is_first_cell = (c == first_col); bool is_last_cell = (c == end_col); bool is_first_row = (r == first_row); bool is_last_row = (r == end_row); if (cell == null) { text = string.Empty; utext = string.Empty; html = string.Empty; csv = string.Empty; } else { text = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.Text) as string; utext = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.UnicodeText) as string; html = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.Html) as string; csv = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.CommaSeparatedValue) as string; } text_builder.Append (text); utext_builder.Append (utext); html_builder.Append (html); csv_builder.Append (csv); if (c == -1) { // If we just did the row header, jump to the first column. c = start_col - 1; } } if (r == -1) {// If we just did the column header, jump to the first row. r = start_row - 1; } } // // Html content always get the \r\n newline // It's valid html anyway, and it eases testing quite a bit // (since otherwise we'd have to change the start indices // in the added prologue/epilogue text) // int fragment_end = 135 + html_builder.Length; int html_end = fragment_end + 36; string html_start = "Version:1.0{0}" + "StartHTML:00000097{0}" + "EndHTML:{1:00000000}{0}" + "StartFragment:00000133{0}" + "EndFragment:{2:00000000}{0}" + "{0}" + "{0}" + ""; html_start = string.Format (html_start, "\r\n", html_end, fragment_end); html_builder.Insert (0, html_start); html_builder.AppendFormat ("{0}{0}{0}", "\r\n"); result.SetData (DataFormats.CommaSeparatedValue, false, csv_builder.ToString ()); result.SetData (DataFormats.Html, false, html_builder.ToString ()); result.SetData (DataFormats.UnicodeText, false, utext_builder.ToString ()); result.SetData (DataFormats.Text, false, text_builder.ToString ()); return result; } [MonoTODO ("Does not use cutOverflow parameter")] public Rectangle GetColumnDisplayRectangle (int columnIndex, bool cutOverflow) { if (columnIndex < 0 || columnIndex > Columns.Count - 1) throw new ArgumentOutOfRangeException ("columnIndex"); int x = 0; int w = 0; x = BorderWidth; if (RowHeadersVisible) x += RowHeadersWidth; List cols = columns.ColumnDisplayIndexSortedArrayList; for (int i = first_col_index; i < cols.Count; i++) { if (!cols[i].Visible) continue; if (cols[i].Index == columnIndex) { w = cols[i].Width; break; } x += cols[i].Width; } return new Rectangle (x, 0, w, Height); } [MonoTODO ("Does not use cutOverflow parameter")] public Rectangle GetRowDisplayRectangle (int rowIndex, bool cutOverflow) { if (rowIndex < 0 || rowIndex > Rows.Count - 1) throw new ArgumentOutOfRangeException ("rowIndex"); int y = 0; int h = 0; y = BorderWidth; if (ColumnHeadersVisible) y += ColumnHeadersHeight; for (int i = first_row_index; i < Rows.Count; i++) { if (!rows[i].Visible) continue; if (rows[i].Index == rowIndex) { h = rows [i].Height; break; } y += rows [i].Height; } return new Rectangle (0, y, Width, h); } public HitTestInfo HitTest (int x, int y) { /////////////////////////////////////////////////////// //Console.WriteLine ("HitTest ({0}, {1})", x, y); bool isInColHeader = columnHeadersVisible && y >= 0 && y <= ColumnHeadersHeight; bool isInRowHeader = rowHeadersVisible && x >= 0 && x <= RowHeadersWidth; // TopLeftHeader if (isInColHeader && isInRowHeader) return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.TopLeftHeader); // HorizontalScrollBar if (horizontalScrollBar.Visible && horizontalScrollBar.Bounds.Contains (x, y)) return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.HorizontalScrollBar); // VerticalScrollBar if (verticalScrollBar.Visible && verticalScrollBar.Bounds.Contains (x, y)) return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.VerticalScrollBar); // The little box in the bottom right if both scrollbars are shown is None if (verticalScrollBar.Visible && horizontalScrollBar.Visible) if (new Rectangle (verticalScrollBar.Left, horizontalScrollBar.Top, verticalScrollBar.Width, horizontalScrollBar.Height).Contains (x, y)) return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.None); int rowindex = -1; int colindex = -1; int top = columnHeadersVisible ? columnHeadersHeight : 0; for (int i = first_row_index; i < Rows.Count; i++) { DataGridViewRow row = Rows[i]; if (!row.Visible) continue; if (y > top && y <= (top + row.Height)) { rowindex = i; break; } top += row.Height; } int left = rowHeadersVisible ? RowHeadersWidth : 0; List cols = columns.ColumnDisplayIndexSortedArrayList; for (int i = first_col_index; i < cols.Count; i++) { if (!cols[i].Visible) continue; if (x > left && x <= (left + cols[i].Width)) { colindex = cols[i].Index; break; } left += cols[i].Width; } if (colindex >= 0 && rowindex >= 0) return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.Cell); if (isInColHeader && colindex > -1) return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.ColumnHeader); if (isInRowHeader && rowindex > -1) return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.RowHeader); return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.None); } public void InvalidateCell (DataGridViewCell dataGridViewCell) { if (dataGridViewCell == null) throw new ArgumentNullException ("Cell is null"); if (dataGridViewCell.DataGridView != this) throw new ArgumentException ("The specified cell does not belong to this DataGridView."); InvalidateCell (dataGridViewCell.ColumnIndex, dataGridViewCell.RowIndex); } public void InvalidateCell (int columnIndex, int rowIndex) { if (columnIndex < 0 || columnIndex >= columns.Count) throw new ArgumentOutOfRangeException ("Column index is out of range."); if (rowIndex < 0 || rowIndex >= rows.Count) throw new ArgumentOutOfRangeException ("Row index is out of range."); if (!is_binding) Invalidate (GetCellDisplayRectangle (columnIndex, rowIndex, true)); } public void InvalidateColumn (int columnIndex) { if (columnIndex < 0 || columnIndex >= columns.Count) throw new ArgumentOutOfRangeException ("Column index is out of range."); if (!is_binding) Invalidate (GetColumnDisplayRectangle (columnIndex, true)); } public void InvalidateRow (int rowIndex) { if (rowIndex < 0 || rowIndex >= rows.Count) throw new ArgumentOutOfRangeException ("Row index is out of range."); if (!is_binding) Invalidate (GetRowDisplayRectangle (rowIndex, true)); } public virtual void NotifyCurrentCellDirty (bool dirty) { if (currentCell != null) InvalidateCell (currentCell); } public bool RefreshEdit () { if (IsCurrentCellInEditMode) { currentCell.InitializeEditingControl (currentCell.RowIndex, currentCell.FormattedValue, currentCell.InheritedStyle); return true; } return false; } [EditorBrowsable (EditorBrowsableState.Never)] public override void ResetText () { Text = string.Empty; } public void SelectAll () { switch (selectionMode) { case DataGridViewSelectionMode.FullRowSelect: foreach (DataGridViewRow row in rows) { (row as DataGridViewBand).Selected = true; } break; case DataGridViewSelectionMode.FullColumnSelect: foreach (DataGridViewColumn col in columns) { (col as DataGridViewBand).Selected = true; } break; default: foreach (DataGridViewRow row in rows) { foreach (DataGridViewCell cell in row.Cells) { cell.Selected = true; } } break; } Invalidate (); } public virtual void Sort (IComparer comparer) { if (comparer == null) throw new ArgumentNullException ("comparer"); if (VirtualMode || DataSource != null) throw new InvalidOperationException (); if (SortedColumn != null) SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None; EndEdit (); Rows.Sort (comparer); sortedColumn = null; sortOrder = SortOrder.None; currentCell = null; Invalidate (); OnSorted (EventArgs.Empty); } public virtual void Sort (DataGridViewColumn dataGridViewColumn, ListSortDirection direction) { if (dataGridViewColumn == null) throw new ArgumentNullException ("dataGridViewColumn"); if (dataGridViewColumn.DataGridView != this) throw new ArgumentException ("dataGridViewColumn"); if (!EndEdit ()) return; if (SortedColumn != null) SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None; sortedColumn = dataGridViewColumn; sortOrder = direction == ListSortDirection.Ascending ? SortOrder.Ascending : SortOrder.Descending; if (Rows.Count == 0) return; if (dataGridViewColumn.IsDataBound) { IBindingList bindingList = DataManager.List as IBindingList; if (bindingList != null && bindingList.SupportsSorting) { bindingList.ApplySort (DataManager.GetItemProperties()[dataGridViewColumn.DataPropertyName], direction); dataGridViewColumn.HeaderCell.SortGlyphDirection = sortOrder; } } else { // Figure out if this is a numeric sort or text sort bool is_numeric = true; double n; foreach (DataGridViewRow row in Rows) { object val = row.Cells[dataGridViewColumn.Index].Value; if (val != null && !double.TryParse (val.ToString (), out n)) { is_numeric = false; break; } } ColumnSorter sorter = new ColumnSorter (dataGridViewColumn, direction, is_numeric); Rows.Sort (sorter); dataGridViewColumn.HeaderCell.SortGlyphDirection = sortOrder; } Invalidate (); OnSorted (EventArgs.Empty); } public void UpdateCellErrorText (int columnIndex, int rowIndex) { if (columnIndex < 0 || columnIndex > Columns.Count - 1) throw new ArgumentOutOfRangeException ("columnIndex"); if (rowIndex < 0 || rowIndex > Rows.Count - 1) throw new ArgumentOutOfRangeException ("rowIndex"); InvalidateCell (columnIndex, rowIndex); } public void UpdateCellValue (int columnIndex, int rowIndex) { if (columnIndex < 0 || columnIndex > Columns.Count - 1) throw new ArgumentOutOfRangeException ("columnIndex"); if (rowIndex < 0 || rowIndex > Rows.Count - 1) throw new ArgumentOutOfRangeException ("rowIndex"); InvalidateCell (columnIndex, rowIndex); } public void UpdateRowErrorText (int rowIndex) { if (rowIndex < 0 || rowIndex > Rows.Count - 1) throw new ArgumentOutOfRangeException ("rowIndex"); InvalidateRow (rowIndex); } public void UpdateRowErrorText (int rowIndexStart, int rowIndexEnd) { if (rowIndexStart < 0 || rowIndexStart > Rows.Count - 1) throw new ArgumentOutOfRangeException ("rowIndexStart"); if (rowIndexEnd < 0 || rowIndexEnd > Rows.Count - 1) throw new ArgumentOutOfRangeException ("rowIndexEnd"); if (rowIndexEnd < rowIndexStart) throw new ArgumentOutOfRangeException ("rowIndexEnd", "rowIndexEnd must be greater than rowIndexStart"); for (int i = rowIndexStart; i <= rowIndexEnd; i++) InvalidateRow (i); } public void UpdateRowHeightInfo (int rowIndex, bool updateToEnd) { if (rowIndex < 0 && updateToEnd) throw new ArgumentOutOfRangeException ("rowIndex"); if (rowIndex < -1 && !updateToEnd) throw new ArgumentOutOfRangeException ("rowIndex"); if (rowIndex >= Rows.Count) throw new ArgumentOutOfRangeException ("rowIndex"); if (!VirtualMode && DataManager == null) return; if (rowIndex == -1) { updateToEnd = true; rowIndex = 0; } if (updateToEnd) { for (int i = rowIndex; i < Rows.Count; i++) { DataGridViewRow row = Rows[i]; if (!row.Visible) continue; DataGridViewRowHeightInfoNeededEventArgs rowInfo = new DataGridViewRowHeightInfoNeededEventArgs (row.Index, row.Height, row.MinimumHeight); OnRowHeightInfoNeeded (rowInfo); if (row.Height != rowInfo.Height || row.MinimumHeight != rowInfo.MinimumHeight) { row.Height = rowInfo.Height; row.MinimumHeight = rowInfo.MinimumHeight; OnRowHeightInfoPushed (new DataGridViewRowHeightInfoPushedEventArgs (row.Index, rowInfo.Height, rowInfo.MinimumHeight)); } } } else { DataGridViewRow row = Rows[rowIndex]; DataGridViewRowHeightInfoNeededEventArgs rowInfo = new DataGridViewRowHeightInfoNeededEventArgs (row.Index, row.Height, row.MinimumHeight); OnRowHeightInfoNeeded (rowInfo); if (row.Height != rowInfo.Height || row.MinimumHeight != rowInfo.MinimumHeight) { row.Height = rowInfo.Height; row.MinimumHeight = rowInfo.MinimumHeight; OnRowHeightInfoPushed (new DataGridViewRowHeightInfoPushedEventArgs (row.Index, rowInfo.Height, rowInfo.MinimumHeight)); } } } protected override bool CanEnableIme { get { if (CurrentCell != null && CurrentCell.EditType != null) return true; return false; } } protected override Size DefaultSize { get { return new Size (240, 150); } } protected ScrollBar HorizontalScrollBar { get { return horizontalScrollBar; } } protected ScrollBar VerticalScrollBar { get { return verticalScrollBar; } } protected virtual void AccessibilityNotifyCurrentCellChanged (Point cellAddress) { throw new NotImplementedException (); } [MonoTODO ("Does not use fixedHeight parameter")] protected void AutoResizeColumn (int columnIndex, DataGridViewAutoSizeColumnMode autoSizeColumnMode, bool fixedHeight) { AutoResizeColumn (columnIndex, autoSizeColumnMode); } [MonoTODO ("Does not use fixedRowHeadersWidth or fixedColumnsWidth parameters")] protected void AutoResizeColumnHeadersHeight (bool fixedRowHeadersWidth, bool fixedColumnsWidth) { AutoResizeColumnHeadersHeight (); } [MonoTODO ("Does not use columnIndex or fixedRowHeadersWidth or fixedColumnsWidth parameters")] protected void AutoResizeColumnHeadersHeight (int columnIndex, bool fixedRowHeadersWidth, bool fixedColumnWidth) { AutoResizeColumnHeadersHeight (columnIndex); } protected void AutoResizeColumns (DataGridViewAutoSizeColumnsMode autoSizeColumnsMode, bool fixedHeight) { for (int i = 0; i < Columns.Count; i++) { AutoResizeColumn (i, (DataGridViewAutoSizeColumnMode) autoSizeColumnsMode, fixedHeight); } } [MonoTODO ("Does not use fixedWidth parameter")] protected void AutoResizeRow (int rowIndex, DataGridViewAutoSizeRowMode autoSizeRowMode, bool fixedWidth) { if (autoSizeRowMode == DataGridViewAutoSizeRowMode.RowHeader && !rowHeadersVisible) throw new InvalidOperationException ("row headers are not visible"); if (rowIndex < 0 || rowIndex > Rows.Count - 1) throw new ArgumentOutOfRangeException ("rowIndex"); DataGridViewRow row = GetRowInternal (rowIndex); int new_height = row.GetPreferredHeight (rowIndex, autoSizeRowMode, true); if (row.Height != new_height) row.SetAutoSizeHeight (new_height); } [MonoTODO ("Does not use fixedColumnHeadersHeight or fixedRowsHeight parameter")] protected void AutoResizeRowHeadersWidth (DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode, bool fixedColumnHeadersHeight, bool fixedRowsHeight) { AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode); } [MonoTODO ("Does not use rowIndex or fixedColumnHeadersHeight or fixedRowsHeight parameter")] protected void AutoResizeRowHeadersWidth (int rowIndex, DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode, bool fixedColumnHeadersHeight, bool fixedRowHeight) { AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode); } [MonoTODO ("Does not use fixedWidth parameter")] protected void AutoResizeRows (DataGridViewAutoSizeRowsMode autoSizeRowsMode, bool fixedWidth) { if (autoSizeRowsMode == DataGridViewAutoSizeRowsMode.None) return; bool displayed_only = false; DataGridViewAutoSizeRowMode mode = DataGridViewAutoSizeRowMode.AllCells; switch (autoSizeRowsMode) { case DataGridViewAutoSizeRowsMode.AllHeaders: mode = DataGridViewAutoSizeRowMode.RowHeader; break; case DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders: mode = DataGridViewAutoSizeRowMode.AllCellsExceptHeader; break; case DataGridViewAutoSizeRowsMode.AllCells: mode = DataGridViewAutoSizeRowMode.AllCells; break; case DataGridViewAutoSizeRowsMode.DisplayedHeaders: mode = DataGridViewAutoSizeRowMode.RowHeader; displayed_only = true; break; case DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders: mode = DataGridViewAutoSizeRowMode.AllCellsExceptHeader; displayed_only = true; break; case DataGridViewAutoSizeRowsMode.DisplayedCells: mode = DataGridViewAutoSizeRowMode.AllCells; displayed_only = true; break; } foreach (DataGridViewRow row in Rows) { if (!row.Visible) continue; if (!displayed_only || row.Displayed) { int new_height = row.GetPreferredHeight (row.Index, mode, fixedWidth); if (row.Height != new_height) row.SetAutoSizeHeight (new_height); } } } [MonoTODO ("Does not use fixedMode parameter")] protected void AutoResizeRows (int rowIndexStart, int rowsCount, DataGridViewAutoSizeRowMode autoSizeRowMode, bool fixedWidth) { for (int i = rowIndexStart; i < rowIndexStart + rowsCount; i++) AutoResizeRow (i, autoSizeRowMode, fixedWidth); } protected void ClearSelection (int columnIndexException, int rowIndexException, bool selectExceptionElement) { if (columnIndexException >= columns.Count) { throw new ArgumentOutOfRangeException("ColumnIndexException is greater than the highest column index."); } if (selectionMode == DataGridViewSelectionMode.FullRowSelect) { if (columnIndexException < -1) { throw new ArgumentOutOfRangeException("ColumnIndexException is less than -1."); } } else { if (columnIndexException < 0) { throw new ArgumentOutOfRangeException("ColumnIndexException is less than 0."); } } if (rowIndexException >= rows.Count) { throw new ArgumentOutOfRangeException("RowIndexException is greater than the highest row index."); } if (selectionMode == DataGridViewSelectionMode.FullColumnSelect) { if (rowIndexException < -1) { throw new ArgumentOutOfRangeException("RowIndexException is less than -1."); } } else { if (rowIndexException < 0) { throw new ArgumentOutOfRangeException("RowIndexException is less than 0."); } } switch (selectionMode) { case DataGridViewSelectionMode.FullRowSelect: foreach (DataGridViewRow row in rows) { if (selectExceptionElement && row.Index == rowIndexException) { continue; } SetSelectedRowCore (row.Index, false); } break; case DataGridViewSelectionMode.FullColumnSelect: foreach (DataGridViewColumn col in columns) { if (selectExceptionElement && col.Index == columnIndexException) { continue; } SetSelectedColumnCore (col.Index, false); } break; default: foreach (DataGridViewCell cell in SelectedCells) { if (selectExceptionElement && cell.RowIndex == rowIndexException && cell.ColumnIndex == columnIndexException) { continue; } SetSelectedCellCore (cell.ColumnIndex, cell.RowIndex, false); } break; } } protected override AccessibleObject CreateAccessibilityInstance () { return new DataGridViewAccessibleObject(this); } [EditorBrowsable (EditorBrowsableState.Advanced)] protected virtual DataGridViewColumnCollection CreateColumnsInstance () { return new DataGridViewColumnCollection(this); } protected override Control.ControlCollection CreateControlsInstance () { return new DataGridViewControlCollection (this); } [EditorBrowsable (EditorBrowsableState.Advanced)] protected virtual DataGridViewRowCollection CreateRowsInstance () { return new DataGridViewRowCollection(this); } protected override void Dispose (bool disposing) { } protected override AccessibleObject GetAccessibilityObjectById (int objectId) { throw new NotImplementedException(); } protected override bool IsInputChar (char charCode) { return true; } protected override bool IsInputKey (Keys keyData) { // Don't look at the modifiers keyData = keyData & ~Keys.Modifiers; switch (keyData) { case Keys.Return: case Keys.PageUp: case Keys.Next: case Keys.End: case Keys.Home: case Keys.Left: case Keys.Up: case Keys.Right: case Keys.Down: case Keys.Delete: case Keys.D0: case Keys.NumPad0: case Keys.F2: return true; } return false; } protected virtual void OnAllowUserToAddRowsChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [AllowUserToAddRowsChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnAllowUserToDeleteRowsChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [AllowUserToDeleteRowsChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnAllowUserToOrderColumnsChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [AllowUserToOrderColumnsChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnAllowUserToResizeColumnsChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [AllowUserToResizeColumnsChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnAllowUserToResizeRowsChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [AllowUserToResizeRowsChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnAlternatingRowsDefaultCellStyleChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [AlternatingRowsDefaultCellStyleChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnAutoGenerateColumnsChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [AutoGenerateColumnsChangedEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnAutoSizeColumnModeChanged (DataGridViewAutoSizeColumnModeEventArgs e) { DataGridViewAutoSizeColumnModeEventHandler eh = (DataGridViewAutoSizeColumnModeEventHandler)(Events [AutoSizeColumnModeChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnAutoSizeColumnsModeChanged (DataGridViewAutoSizeColumnsModeEventArgs e) { DataGridViewAutoSizeColumnsModeEventHandler eh = (DataGridViewAutoSizeColumnsModeEventHandler)(Events [AutoSizeColumnsModeChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnAutoSizeRowsModeChanged (DataGridViewAutoSizeModeEventArgs e) { DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [AutoSizeRowsModeChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnBackgroundColorChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [BackgroundColorChangedEvent]); if (eh != null) eh (this, e); } protected override void OnBindingContextChanged (EventArgs e) { base.OnBindingContextChanged(e); ReBind(); } protected virtual void OnBorderStyleChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [BorderStyleChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnCancelRowEdit (QuestionEventArgs e) { QuestionEventHandler eh = (QuestionEventHandler)(Events [CancelRowEditEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellBeginEdit (DataGridViewCellCancelEventArgs e) { DataGridViewCellCancelEventHandler eh = (DataGridViewCellCancelEventHandler)(Events [CellBeginEditEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellBorderStyleChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [CellBorderStyleChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellClick (DataGridViewCellEventArgs e) { DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex); cell.OnClickInternal (e); DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellClickEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellContentClick (DataGridViewCellEventArgs e) { DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex); cell.OnContentClickInternal (e); DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContentClickEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellContentDoubleClick (DataGridViewCellEventArgs e) { DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex); cell.OnContentDoubleClickInternal (e); DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContentDoubleClickEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellContextMenuStripChanged (DataGridViewCellEventArgs e) { DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContextMenuStripChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellContextMenuStripNeeded (DataGridViewCellContextMenuStripNeededEventArgs e) { DataGridViewCellContextMenuStripNeededEventHandler eh = (DataGridViewCellContextMenuStripNeededEventHandler)(Events [CellContextMenuStripNeededEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellDoubleClick (DataGridViewCellEventArgs e) { DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex); cell.OnDoubleClickInternal (e); DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellDoubleClickEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellEndEdit (DataGridViewCellEventArgs e) { DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellEndEditEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellEnter (DataGridViewCellEventArgs e) { DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex); cell.OnEnterInternal (e.RowIndex, true); DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellEnterEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnCellErrorTextChanged (DataGridViewCellEventArgs e) { DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellErrorTextChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellErrorTextNeeded (DataGridViewCellErrorTextNeededEventArgs e) { DataGridViewCellErrorTextNeededEventHandler eh = (DataGridViewCellErrorTextNeededEventHandler)(Events [CellErrorTextNeededEvent]); if (eh != null) eh (this, e); } internal void OnCellFormattingInternal (DataGridViewCellFormattingEventArgs e) { OnCellFormatting (e); } protected virtual void OnCellFormatting (DataGridViewCellFormattingEventArgs e) { DataGridViewCellFormattingEventHandler eh = (DataGridViewCellFormattingEventHandler)(Events [CellFormattingEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellLeave (DataGridViewCellEventArgs e) { DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex); cell.OnLeaveInternal (e.RowIndex, true); DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellLeaveEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellMouseClick (DataGridViewCellMouseEventArgs e) { DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex); cell.OnMouseClickInternal (e); DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseClickEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellMouseDoubleClick (DataGridViewCellMouseEventArgs e) { DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex); cell.OnMouseDoubleClickInternal (e); DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseDoubleClickEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellMouseDown (DataGridViewCellMouseEventArgs e) { DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex); cell.OnMouseDownInternal (e); DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseDownEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellMouseEnter (DataGridViewCellEventArgs e) { DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex); cell.OnMouseEnterInternal (e.RowIndex); DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellMouseEnterEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellMouseLeave (DataGridViewCellEventArgs e) { DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex); cell.OnMouseLeaveInternal (e.RowIndex); DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellMouseLeaveEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellMouseMove (DataGridViewCellMouseEventArgs e) { DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex); cell.OnMouseMoveInternal (e); DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseMoveEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellMouseUp (DataGridViewCellMouseEventArgs e) { DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex); cell.OnMouseUpInternal (e); DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseUpEvent]); if (eh != null) eh (this, e); } internal void OnCellPaintingInternal (DataGridViewCellPaintingEventArgs e) { OnCellPainting (e); } protected virtual void OnCellPainting (DataGridViewCellPaintingEventArgs e) { DataGridViewCellPaintingEventHandler eh = (DataGridViewCellPaintingEventHandler)(Events [CellPaintingEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnCellParsing (DataGridViewCellParsingEventArgs e) { DataGridViewCellParsingEventHandler eh = (DataGridViewCellParsingEventHandler)(Events [CellParsingEvent]); if (eh != null) eh (this, e); } internal void OnCellStateChangedInternal (DataGridViewCellStateChangedEventArgs e) { this.OnCellStateChanged (e); } protected virtual void OnCellStateChanged (DataGridViewCellStateChangedEventArgs e) { DataGridViewCellStateChangedEventHandler eh = (DataGridViewCellStateChangedEventHandler)(Events [CellStateChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellStyleChanged (DataGridViewCellEventArgs e) { DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellStyleChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellStyleContentChanged (DataGridViewCellStyleContentChangedEventArgs e) { DataGridViewCellStyleContentChangedEventHandler eh = (DataGridViewCellStyleContentChangedEventHandler)(Events [CellStyleContentChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellToolTipTextChanged (DataGridViewCellEventArgs e) { DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellToolTipTextChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellToolTipTextNeeded (DataGridViewCellToolTipTextNeededEventArgs e) { DataGridViewCellToolTipTextNeededEventHandler eh = (DataGridViewCellToolTipTextNeededEventHandler)(Events [CellToolTipTextNeededEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellValidated (DataGridViewCellEventArgs e) { DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellValidatedEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellValidating (DataGridViewCellValidatingEventArgs e) { DataGridViewCellValidatingEventHandler eh = (DataGridViewCellValidatingEventHandler)(Events [CellValidatingEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellValueChanged (DataGridViewCellEventArgs e) { DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellValueChangedEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnCellValueNeeded (DataGridViewCellValueEventArgs e) { DataGridViewCellValueEventHandler eh = (DataGridViewCellValueEventHandler)(Events [CellValueNeededEvent]); if (eh != null) eh (this, e); } protected virtual void OnCellValuePushed (DataGridViewCellValueEventArgs e) { DataGridViewCellValueEventHandler eh = (DataGridViewCellValueEventHandler)(Events [CellValuePushedEvent]); if (eh != null) eh (this, e); } internal void OnColumnAddedInternal (DataGridViewColumnEventArgs e) { e.Column.DataColumnIndex = FindDataColumnIndex (e.Column); if (e.Column.CellTemplate != null) { // The first column has just been added programatically instead of // autogenerated so we need to create the rows for the first time. // if (!is_autogenerating_columns && columns.Count == 1) ReBind (); // Add/Remove/Update the cells in the existing rows foreach (DataGridViewRow row in Rows) { if (row.Index == NewRowIndex) continue; DataGridViewCell newCell = (DataGridViewCell)e.Column.CellTemplate.Clone (); if (row.Cells.Count == columns.Count) { DataGridViewCell oldCell = row.Cells[e.Column.Index]; if (currentCell != null && oldCell == currentCell) currentCell = newCell; // copy the value only if the cell is not-databound if (!e.Column.IsDataBound && oldCell.OwningRow.DataBoundItem == null) newCell.Value = oldCell.Value; row.Cells.Replace (e.Column.Index, newCell); } else if (e.Column.Index >= row.Cells.Count) row.Cells.Add (newCell); else row.Cells.Insert (e.Column.Index, newCell); } } AutoResizeColumnsInternal (); OnColumnAdded (e); PrepareEditingRow (false, true); } private int FindDataColumnIndex (DataGridViewColumn column) { if (column != null && DataManager != null) { PropertyDescriptorCollection properties = DataManager.GetItemProperties(); for (int i = 0; i < properties.Count; i++) { if (String.Compare (column.DataPropertyName, properties[i].Name, true) == 0) return i; } } return -1; } protected virtual void OnColumnAdded (DataGridViewColumnEventArgs e) { DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnAddedEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnColumnContextMenuStripChanged (DataGridViewColumnEventArgs e) { DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnContextMenuStripChangedEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnColumnDataPropertyNameChanged (DataGridViewColumnEventArgs e) { DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDataPropertyNameChangedEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnColumnDefaultCellStyleChanged (DataGridViewColumnEventArgs e) { DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDefaultCellStyleChangedEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnColumnDisplayIndexChanged (DataGridViewColumnEventArgs e) { DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDisplayIndexChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnColumnDividerDoubleClick (DataGridViewColumnDividerDoubleClickEventArgs e) { DataGridViewColumnDividerDoubleClickEventHandler eh = (DataGridViewColumnDividerDoubleClickEventHandler)(Events [ColumnDividerDoubleClickEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnColumnDividerWidthChanged (DataGridViewColumnEventArgs e) { DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDividerWidthChangedEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnColumnHeaderCellChanged (DataGridViewColumnEventArgs e) { DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnHeaderCellChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnColumnHeaderMouseClick (DataGridViewCellMouseEventArgs e) { DataGridViewColumn col = Columns[e.ColumnIndex]; if (col.SortMode == DataGridViewColumnSortMode.Automatic) { ListSortDirection new_order; // Always use ascending unless we are clicking on a // column that is already sorted ascending. if (SortedColumn != col || sortOrder != SortOrder.Ascending) new_order = ListSortDirection.Ascending; else new_order = ListSortDirection.Descending; Sort (col, new_order); } DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [ColumnHeaderMouseClickEvent]); if (eh != null) eh (this, e); } protected virtual void OnColumnHeaderMouseDoubleClick (DataGridViewCellMouseEventArgs e) { DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [ColumnHeaderMouseDoubleClickEvent]); if (eh != null) eh (this, e); } protected virtual void OnColumnHeadersBorderStyleChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [ColumnHeadersBorderStyleChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnColumnHeadersDefaultCellStyleChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [ColumnHeadersDefaultCellStyleChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnColumnHeadersHeightChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [ColumnHeadersHeightChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnColumnHeadersHeightSizeModeChanged (DataGridViewAutoSizeModeEventArgs e) { DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [ColumnHeadersHeightSizeModeChangedEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnColumnMinimumWidthChanged (DataGridViewColumnEventArgs e) { DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnMinimumWidthChangedEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnColumnNameChanged (DataGridViewColumnEventArgs e) { DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnNameChangedEvent]); if (eh != null) eh (this, e); } internal void OnColumnPreRemovedInternal (DataGridViewColumnEventArgs e) { if (Columns.Count - 1 == 0) { MoveCurrentCell (-1, -1, true, false, false, true); rows.ClearInternal (); } else if (currentCell != null && CurrentCell.ColumnIndex == e.Column.Index) { int nextColumnIndex = e.Column.Index; if (nextColumnIndex >= Columns.Count - 1) nextColumnIndex = Columns.Count - 1 - 1; MoveCurrentCell (nextColumnIndex, currentCell.RowIndex, true, false, false, true); if (hover_cell != null && hover_cell.ColumnIndex >= e.Column.Index) hover_cell = null; } } private void OnColumnPostRemovedInternal (DataGridViewColumnEventArgs e) { if (e.Column.CellTemplate != null) { int index = e.Column.Index; foreach (DataGridViewRow row in Rows) row.Cells.RemoveAt (index); } AutoResizeColumnsInternal (); PrepareEditingRow (false, true); OnColumnRemoved (e); } protected virtual void OnColumnRemoved (DataGridViewColumnEventArgs e) { DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnRemovedEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnColumnSortModeChanged (DataGridViewColumnEventArgs e) { DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnSortModeChangedEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnColumnStateChanged (DataGridViewColumnStateChangedEventArgs e) { DataGridViewColumnStateChangedEventHandler eh = (DataGridViewColumnStateChangedEventHandler)(Events [ColumnStateChangedEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnColumnToolTipTextChanged (DataGridViewColumnEventArgs e) { DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnToolTipTextChangedEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnColumnWidthChanged (DataGridViewColumnEventArgs e) { DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnWidthChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnCurrentCellChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [CurrentCellChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnCurrentCellDirtyStateChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [CurrentCellDirtyStateChangedEvent]); if (eh != null) eh (this, e); } protected override void OnCursorChanged (EventArgs e) { base.OnCursorChanged (e); } protected virtual void OnDataBindingComplete (DataGridViewBindingCompleteEventArgs e) { DataGridViewBindingCompleteEventHandler eh = (DataGridViewBindingCompleteEventHandler)(Events [DataBindingCompleteEvent]); if (eh != null) eh (this, e); } protected virtual void OnDataError (bool displayErrorDialogIfNoHandler, DataGridViewDataErrorEventArgs e) { DataGridViewDataErrorEventHandler eh = (DataGridViewDataErrorEventHandler)(Events [DataErrorEvent]); if (eh != null) eh (this, e); else if (displayErrorDialogIfNoHandler) MessageBox.Show (e.ToString ()); } protected virtual void OnDataMemberChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [DataMemberChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnDataSourceChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [DataSourceChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnDefaultCellStyleChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [DefaultCellStyleChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnDefaultValuesNeeded (DataGridViewRowEventArgs e) { DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [DefaultValuesNeededEvent]); if (eh != null) eh (this, e); } protected override void OnDoubleClick (EventArgs e) { base.OnDoubleClick(e); Point mouseLocation = this.PointToClient (Control.MousePosition); HitTestInfo hitInfo = HitTest (mouseLocation.X, mouseLocation.Y); if (hitInfo.Type == DataGridViewHitTestType.Cell) OnCellDoubleClick (new DataGridViewCellEventArgs (hitInfo.ColumnIndex, hitInfo.RowIndex)); } protected virtual void OnEditingControlShowing (DataGridViewEditingControlShowingEventArgs e) { DataGridViewEditingControlShowingEventHandler eh = (DataGridViewEditingControlShowingEventHandler)(Events [EditingControlShowingEvent]); if (eh != null) eh (this, e); } protected virtual void OnEditModeChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [EditModeChangedEvent]); if (eh != null) eh (this, e); } protected override void OnEnabledChanged (EventArgs e) { base.OnEnabledChanged(e); } protected override void OnEnter (EventArgs e ) { base.OnEnter(e); } protected override void OnGotFocus(EventArgs e) { base.OnGotFocus (e); // To add focus rectangle if needed if (currentCell != null && ShowFocusCues) InvalidateCell (currentCell); } protected override void OnFontChanged (EventArgs e) { base.OnFontChanged(e); } protected override void OnForeColorChanged (EventArgs e) { base.OnForeColorChanged(e); } protected virtual void OnGridColorChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [GridColorChangedEvent]); if (eh != null) eh (this, e); } protected override void OnHandleCreated (EventArgs e) { base.OnHandleCreated(e); ReBind (); if (DataManager == null && CurrentCell == null && Rows.Count > 0 && Columns.Count > 0) MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, false, false, false); } protected override void OnHandleDestroyed(EventArgs e) { base.OnHandleDestroyed (e); } [EditorBrowsable (EditorBrowsableState.Advanced)] protected override void OnKeyDown (KeyEventArgs e) { base.OnKeyDown (e); e.Handled = ProcessDataGridViewKey (e); } [EditorBrowsable (EditorBrowsableState.Advanced)] protected override void OnKeyPress (KeyPressEventArgs e) { base.OnKeyPress(e); } [EditorBrowsable (EditorBrowsableState.Advanced)] protected override void OnKeyUp (KeyEventArgs e) { base.OnKeyUp(e); } protected override void OnLayout (LayoutEventArgs e) { if (horizontalScrollBar.Visible && verticalScrollBar.Visible) { horizontalScrollBar.Bounds = new Rectangle (BorderWidth, Height - BorderWidth - horizontalScrollBar.Height, Width - (2 * BorderWidth) - verticalScrollBar.Width, horizontalScrollBar.Height); verticalScrollBar.Bounds = new Rectangle (Width - BorderWidth - verticalScrollBar.Width, BorderWidth, verticalScrollBar.Width, Height - (2 * BorderWidth) - horizontalScrollBar.Height); } else if (horizontalScrollBar.Visible) horizontalScrollBar.Bounds = new Rectangle (BorderWidth, Height - BorderWidth - horizontalScrollBar.Height, Width - (2 * BorderWidth), horizontalScrollBar.Height); else if (verticalScrollBar.Visible) verticalScrollBar.Bounds = new Rectangle (Width - BorderWidth - verticalScrollBar.Width, BorderWidth, verticalScrollBar.Width, Height - (2 * BorderWidth)); AutoResizeColumnsInternal (); Invalidate (); } protected override void OnLeave (EventArgs e) { base.OnLeave(e); } protected override void OnLostFocus(EventArgs e) { base.OnLostFocus (e); // To remove focus rectangle if needed if (currentCell != null && ShowFocusCues) InvalidateCell (currentCell); } protected override void OnMouseClick (MouseEventArgs e) { base.OnMouseClick(e); if (column_resize_active || row_resize_active) return; //Console.WriteLine("Mouse: Clicks: {0}; Delta: {1}; X: {2}; Y: {3};", e.Clicks, e.Delta, e.X, e.Y); HitTestInfo hit = HitTest (e.X, e.Y); switch (hit.Type) { case DataGridViewHitTestType.Cell: Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false); Point cellpoint = new Point (e.X - display.X, e.Y - display.Y); OnCellMouseClick (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, cellpoint.X, cellpoint.Y, e)); DataGridViewCell cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex); if (cell.GetContentBounds (hit.RowIndex).Contains (cellpoint)) { DataGridViewCellEventArgs dgvcea = new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex); OnCellContentClick (dgvcea); } break; case DataGridViewHitTestType.ColumnHeader: Rectangle display2 = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false); Point cellpoint2 = new Point (e.X - display2.X, e.Y - display2.Y); OnColumnHeaderMouseClick (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, cellpoint2.X, cellpoint2.Y, e)); break; } } protected override void OnMouseDoubleClick (MouseEventArgs e) { base.OnMouseDoubleClick(e); HitTestInfo hitInfo = HitTest (e.X, e.Y); if (hitInfo.Type == DataGridViewHitTestType.Cell) OnCellMouseDoubleClick (new DataGridViewCellMouseEventArgs (hitInfo.ColumnIndex, hitInfo.RowIndex, hitInfo.ColumnX, hitInfo.RowY, e)); } private void DoSelectionOnMouseDown (HitTestInfo hitTest) { Keys modifiers = Control.ModifierKeys; bool isControl = (modifiers & Keys.Control) != 0; bool isShift = (modifiers & Keys.Shift) != 0; //bool isRowHeader = hitTest.Type == DataGridViewHitTestType.RowHeader; //bool isColHeader = hitTest.Type == DataGridViewHitTestType.ColumnHeader; DataGridViewSelectionMode mode; switch (hitTest.Type) { case DataGridViewHitTestType.Cell: mode = selectionMode; break; case DataGridViewHitTestType.ColumnHeader: mode = selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect ? DataGridViewSelectionMode.FullColumnSelect : selectionMode; if (mode != DataGridViewSelectionMode.FullColumnSelect) return; break; case DataGridViewHitTestType.RowHeader: mode = selectionMode == DataGridViewSelectionMode.RowHeaderSelect ? DataGridViewSelectionMode.FullRowSelect : selectionMode; if (mode != DataGridViewSelectionMode.FullRowSelect) return; break; // Handled below default: return; } if (!isControl) { // If SHIFT is pressed: // Select all from selected_row/column/cell to current row/column/cell, unselect everything else // otherwise: // Unselect all rows/columns/cells, select the clicked one int min_row, max_row; int min_col, max_col; if (!isShift) { selected_row = hitTest.RowIndex; selected_column = hitTest.ColumnIndex; } if (!isShift) { if (selected_row != -1) selected_row = hitTest.RowIndex; if (selected_column != -1) selected_column = hitTest.ColumnIndex; } if (selected_row >= hitTest.RowIndex) { min_row = hitTest.RowIndex; max_row = isShift ? selected_row : min_row; } else { max_row = hitTest.RowIndex; min_row = isShift ? selected_row : max_row; } if (selected_column >= hitTest.ColumnIndex) { min_col = hitTest.ColumnIndex; max_col = isShift ? selected_column : min_col; } else { max_col = hitTest.ColumnIndex; min_col = isShift ? selected_column : max_col; } switch (mode) { case DataGridViewSelectionMode.FullRowSelect: for (int i = 0; i < RowCount; i++) { bool select = i >= min_row && i <= max_row; if (!select) { for (int c = 0; c < ColumnCount; c++) { if (Rows [i].Cells [c].Selected) { SetSelectedCellCore (c, i, false); } } } if (select != Rows [i].Selected) { SetSelectedRowCore (i, select); } } break; case DataGridViewSelectionMode.FullColumnSelect: for (int i = 0; i < ColumnCount; i++) { bool select = i >= min_col && i <= max_col; if (!select) { for (int r = 0; r < RowCount; r++) { if (Rows [r].Cells [i].Selected) { SetSelectedCellCore (i, r, false); } } } if (select != Columns [i].Selected) { SetSelectedColumnCore (i, select); } } break; case DataGridViewSelectionMode.ColumnHeaderSelect: case DataGridViewSelectionMode.RowHeaderSelect: //break; case DataGridViewSelectionMode.CellSelect: if (!isShift) { for (int c = 0; c < ColumnCount; c++) { if (columns [c].Selected) SetSelectedColumnCore (c, false); } for (int r = 0; r < RowCount; r++) { if (rows [r].Selected) SetSelectedRowCore (r, false); } } for (int r = 0; r < RowCount; r++) { for (int c = 0; c < ColumnCount; c++) { bool select = (r >= min_row && r <= max_row) && (c >= min_col && c <= max_col); if (select != Rows [r].Cells [c].Selected) SetSelectedCellCore (c, r, select); } } break; } } else if (isControl) { // Switch the selected state of the row. switch (mode) { case DataGridViewSelectionMode.FullRowSelect: SetSelectedRowCore (hitTest.RowIndex, !rows [hitTest.RowIndex].Selected); break; case DataGridViewSelectionMode.FullColumnSelect: SetSelectedColumnCore (hitTest.ColumnIndex, !columns [hitTest.ColumnIndex].Selected); break; case DataGridViewSelectionMode.ColumnHeaderSelect: case DataGridViewSelectionMode.RowHeaderSelect: //break; case DataGridViewSelectionMode.CellSelect: if (hitTest.ColumnIndex >= 0 && hitTest.RowIndex >= 0) { SetSelectedCellCore (hitTest.ColumnIndex, hitTest.RowIndex, !Rows [hitTest.RowIndex].Cells [hitTest.ColumnIndex].Selected); } break; } } } protected override void OnMouseDown (MouseEventArgs e) { base.OnMouseDown(e); if (!EndEdit ()) return; HitTestInfo hitTest = HitTest(e.X, e.Y); DataGridViewCell cell = null; DataGridViewRow row = null; Rectangle cellBounds; if ((hitTest.Type == DataGridViewHitTestType.ColumnHeader || (hitTest.Type == DataGridViewHitTestType.Cell && !ColumnHeadersVisible)) && MouseOverColumnResize (hitTest.ColumnIndex, e.X)) { if (e.Clicks == 2) { AutoResizeColumn (hitTest.ColumnIndex); return; } resize_band = hitTest.ColumnIndex; column_resize_active = true; resize_band_start = e.X; resize_band_delta = 0; DrawVerticalResizeLine (resize_band_start); return; } if (hitTest.Type == DataGridViewHitTestType.RowHeader && MouseOverRowResize (hitTest.RowIndex, e.Y)) { if (e.Clicks == 2) { AutoResizeRow (hitTest.RowIndex); return; } resize_band = hitTest.RowIndex; row_resize_active = true; resize_band_start = e.Y; resize_band_delta = 0; DrawHorizontalResizeLine (resize_band_start); return; } if (hitTest.Type == DataGridViewHitTestType.Cell) { row = rows [hitTest.RowIndex]; cell = row.Cells [hitTest.ColumnIndex]; SetCurrentCellAddressCore (cell.ColumnIndex, cell.RowIndex, false, true, true); cellBounds = GetCellDisplayRectangle (hitTest.ColumnIndex, hitTest.RowIndex, false); OnCellMouseDown (new DataGridViewCellMouseEventArgs (hitTest.ColumnIndex, hitTest.RowIndex, e.X - cellBounds.X, e.Y - cellBounds.Y, e)); OnCellClick (new DataGridViewCellEventArgs (hitTest.ColumnIndex, hitTest.RowIndex)); } DoSelectionOnMouseDown (hitTest); if (hitTest.Type != DataGridViewHitTestType.Cell) { if (hitTest.Type == DataGridViewHitTestType.ColumnHeader) pressed_header_cell = columns [hitTest.ColumnIndex].HeaderCell; else if (hitTest.Type == DataGridViewHitTestType.RowHeader) pressed_header_cell = rows [hitTest.RowIndex].HeaderCell; Invalidate (); return; } Invalidate(); return; } private void UpdateBindingPosition (int position) { if (DataManager != null) DataManager.Position = position; } protected override void OnMouseEnter (EventArgs e) { base.OnMouseEnter(e); } protected override void OnMouseLeave (EventArgs e) { base.OnMouseLeave (e); if (hover_cell != null) { OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex)); hover_cell = null; } EnteredHeaderCell = null; } protected override void OnMouseMove (MouseEventArgs e) { base.OnMouseMove (e); if (column_resize_active) { // Erase the old line DrawVerticalResizeLine (resize_band_start + resize_band_delta); resize_band_delta = e.X - resize_band_start; // Draw the new line DrawVerticalResizeLine (resize_band_start + resize_band_delta); return; } if (row_resize_active) { // Erase the old line DrawHorizontalResizeLine (resize_band_start + resize_band_delta); resize_band_delta = e.Y - resize_band_start; // Draw the new line DrawHorizontalResizeLine (resize_band_start + resize_band_delta); return; } Cursor new_cursor = Cursors.Default; HitTestInfo hit = this.HitTest (e.X, e.Y); if (hit.Type == DataGridViewHitTestType.ColumnHeader || (!ColumnHeadersVisible && hit.Type == DataGridViewHitTestType.Cell && MouseOverColumnResize (hit.ColumnIndex, e.X))) { EnteredHeaderCell = Columns [hit.ColumnIndex].HeaderCell; if (MouseOverColumnResize (hit.ColumnIndex, e.X)) new_cursor = Cursors.VSplit; } else if (hit.Type == DataGridViewHitTestType.Cell) { EnteredHeaderCell = null; DataGridViewCell new_cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex); // Check if we have moved into an error icon area Rectangle icon = new_cell.ErrorIconBounds; if (!icon.IsEmpty) { Point loc = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false).Location; icon.X += loc.X; icon.Y += loc.Y; if (icon.Contains (e.X, e.Y)) { if (tooltip_currently_showing != new_cell) MouseEnteredErrorIcon (new_cell); } else MouseLeftErrorIcon (new_cell); } Cursor = new_cursor; // We have never been in a cell before if (hover_cell == null) { hover_cell = new_cell; OnCellMouseEnter (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex)); Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false); OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e)); return; } // Were we already in this cell? if (hover_cell.RowIndex == hit.RowIndex && hover_cell.ColumnIndex == hit.ColumnIndex) { Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false); OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e)); return; } // We are changing cells OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex)); hover_cell = new_cell; OnCellMouseEnter (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex)); Rectangle display2 = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false); OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display2.X, e.Y - display2.Y, e)); return; } else if (hit.Type == DataGridViewHitTestType.RowHeader) { DataGridViewRowHeaderCell new_cell = Rows[hit.RowIndex].HeaderCell; EnteredHeaderCell = new_cell; if (MouseOverRowResize (hit.RowIndex, e.Y)) new_cursor = Cursors.HSplit; // Check if we have moved into an error icon area Rectangle icon = new_cell.InternalErrorIconsBounds; if (!icon.IsEmpty) { Point loc = GetCellDisplayRectangle (0, hit.RowIndex, false).Location; icon.X += BorderWidth; icon.Y += loc.Y; if (icon.Contains (e.X, e.Y)) { if (tooltip_currently_showing != new_cell) MouseEnteredErrorIcon (new_cell); } else MouseLeftErrorIcon (new_cell); } } else if (hit.Type == DataGridViewHitTestType.TopLeftHeader) { EnteredHeaderCell = null; DataGridViewTopLeftHeaderCell new_cell = (DataGridViewTopLeftHeaderCell)TopLeftHeaderCell; // Check if we have moved into an error icon area Rectangle icon = new_cell.InternalErrorIconsBounds; if (!icon.IsEmpty) { Point loc = Point.Empty; icon.X += BorderWidth; icon.Y += loc.Y; if (icon.Contains (e.X, e.Y)) { if (tooltip_currently_showing != new_cell) MouseEnteredErrorIcon (new_cell); } else MouseLeftErrorIcon (new_cell); } } else { EnteredHeaderCell = null; // We have left the cell area if (hover_cell != null) { OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex)); hover_cell = null; } } Cursor = new_cursor; } protected override void OnMouseUp (MouseEventArgs e) { base.OnMouseUp(e); if (column_resize_active) { column_resize_active = false; if (resize_band_delta + Columns[resize_band].Width < 0) resize_band_delta = -Columns[resize_band].Width; Columns[resize_band].Width = Math.Max (resize_band_delta + Columns[resize_band].Width, Columns[resize_band].MinimumWidth); Invalidate (); return; } if (row_resize_active) { row_resize_active = false; if (resize_band_delta + Rows[resize_band].Height < 0) resize_band_delta = -Rows[resize_band].Height; Rows[resize_band].Height = Math.Max (resize_band_delta + Rows[resize_band].Height, Rows[resize_band].MinimumHeight); Invalidate (); return; } HitTestInfo hit = this.HitTest (e.X, e.Y); if (hit.Type == DataGridViewHitTestType.Cell) { Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false); OnCellMouseUp (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e)); } if (pressed_header_cell != null) { DataGridViewHeaderCell cell = pressed_header_cell; pressed_header_cell = null; if (ThemeEngine.Current.DataGridViewHeaderCellHasPressedStyle (this)) Invalidate (GetHeaderCellBounds (cell)); } } protected override void OnMouseWheel (MouseEventArgs e) { base.OnMouseWheel(e); int delta = SystemInformation.MouseWheelScrollLines * verticalScrollBar.SmallChange; if (e.Delta < 0) verticalScrollBar.SafeValueSet (verticalScrollBar.Value + delta); else verticalScrollBar.SafeValueSet (verticalScrollBar.Value - delta); OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value)); } protected virtual void OnMultiSelectChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [MultiSelectChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnNewRowNeeded (DataGridViewRowEventArgs e) { DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [NewRowNeededEvent]); if (eh != null) eh (this, e); } int first_row_index = 0; internal int first_col_index = 0; protected override void OnPaint (PaintEventArgs e) { Graphics g = e.Graphics; Rectangle bounds = ClientRectangle; // Paint the background PaintBackground (g, e.ClipRectangle, bounds); List sortedColumns = columns.ColumnDisplayIndexSortedArrayList; // Take borders into account bounds.Inflate (-BorderWidth, -BorderWidth); // Paint the top left cell if (rowHeadersVisible && columnHeadersVisible && ColumnCount > 0) { Rectangle topleftbounds = new Rectangle (bounds.X, bounds.Y, rowHeadersWidth, columnHeadersHeight); TopLeftHeaderCell.PaintWork (g, e.ClipRectangle, topleftbounds, -1, TopLeftHeaderCell.State, ColumnHeadersDefaultCellStyle, AdvancedColumnHeadersBorderStyle, DataGridViewPaintParts.All); } // Paint the column headers if (columnHeadersVisible) { Rectangle headerBounds = bounds; headerBounds.Height = columnHeadersHeight; if (rowHeadersVisible) headerBounds.X += rowHeadersWidth; for (int index = first_col_index; index < sortedColumns.Count; index++) { DataGridViewColumn col = sortedColumns[index]; if (!col.Visible) continue; headerBounds.Width = col.Width; DataGridViewCell cell = col.HeaderCell; DataGridViewAdvancedBorderStyle intermediateBorderStyle = (DataGridViewAdvancedBorderStyle)((ICloneable)this.AdvancedColumnHeadersBorderStyle).Clone (); DataGridViewAdvancedBorderStyle borderStyle = AdjustColumnHeaderBorderStyle (this.AdvancedColumnHeadersBorderStyle, intermediateBorderStyle, cell.ColumnIndex == 0, cell.ColumnIndex == columns.Count - 1); cell.PaintWork (g, e.ClipRectangle, headerBounds, -1, cell.State, cell.InheritedStyle, borderStyle, DataGridViewPaintParts.All); headerBounds.X += col.Width; } bounds.Y += columnHeadersHeight; } // Reset not displayed columns to !Displayed for (int i = 0; i < first_col_index; i++) Columns[i].DisplayedInternal = false; int gridWidth = rowHeadersVisible ? rowHeadersWidth : 0; // Set Displayed columns for (int i = first_col_index; i < Columns.Count; i++) { DataGridViewColumn col = Columns.ColumnDisplayIndexSortedArrayList[i]; if (!col.Visible) continue; col.DisplayedInternal = true; gridWidth += col.Width; if (gridWidth >= Width) break; } // Reset all not displayed rows to !Displayed for (int i = 0; i < first_row_index; i++) GetRowInternal (i).DisplayedInternal = false; // Draw rows for (int index = first_row_index; index < Rows.Count; index++) { DataGridViewRow row = Rows[index]; if (!row.Visible) continue; GetRowInternal (index).DisplayedInternal = true; bounds.Height = row.Height; bool is_first = row.Index == 0; bool is_last = row.Index == rows.Count - 1; row.Paint (g, e.ClipRectangle, bounds, row.Index, row.GetState (row.Index), is_first, is_last); bounds.Y += bounds.Height; bounds.X = BorderWidth; if (bounds.Y >= ClientSize.Height - (horizontalScrollBar.Visible ? horizontalScrollBar.Height : 0)) break; } RefreshScrollBars (); // Paint the bottom right square if both scrollbars are displayed if (horizontalScrollBar.Visible && verticalScrollBar.Visible) g.FillRectangle (SystemBrushes.Control, new Rectangle (horizontalScrollBar.Right, verticalScrollBar.Bottom, verticalScrollBar.Width, horizontalScrollBar.Height)); // Paint the border bounds = ClientRectangle; switch (BorderStyle) { case BorderStyle.FixedSingle: g.DrawRectangle (Pens.Black, new Rectangle (bounds.Left, bounds.Top, bounds.Width - 1, bounds.Height - 1)); break; case BorderStyle.Fixed3D: ControlPaint.DrawBorder3D (g, bounds, Border3DStyle.Sunken); break; } // Call the base impl at the end. base.OnPaint(e); } private void RefreshScrollBars () { int gridWidth = 0; int gridHeight = 0; foreach (DataGridViewColumn col in columns.ColumnDisplayIndexSortedArrayList) if (col.Visible) gridWidth += col.Width; foreach (DataGridViewRow row in Rows) if (row.Visible) gridHeight += row.Height; if (rowHeadersVisible) gridWidth += rowHeadersWidth; if (columnHeadersVisible) gridHeight += columnHeadersHeight; bool horizontalVisible = false; bool verticalVisible = false; if (AutoSize) { if (gridWidth > Size.Width || gridHeight > Size.Height) Size = new Size(gridWidth, gridHeight); } else { if (gridWidth > Size.Width) horizontalVisible = true; if (gridHeight > Size.Height) verticalVisible = true; if (horizontalScrollBar.Visible && (gridHeight + horizontalScrollBar.Height) > Size.Height) verticalVisible = true; if (verticalScrollBar.Visible && (gridWidth + verticalScrollBar.Width) > Size.Width) horizontalVisible = true; if (horizontalVisible) { horizontalScrollBar.Minimum = 0; horizontalScrollBar.Maximum = gridWidth; horizontalScrollBar.SmallChange = Columns[first_col_index].Width; int largeChange = ClientSize.Width - rowHeadersWidth - horizontalScrollBar.Height; if (largeChange <= 0) largeChange = ClientSize.Width; horizontalScrollBar.LargeChange = largeChange; } if (verticalVisible) { verticalScrollBar.Minimum = 0; verticalScrollBar.Maximum = gridHeight; int first_row_height = Rows.Count > 0 ? Rows[Math.Min (Rows.Count - 1, first_row_index)].Height : 0; verticalScrollBar.SmallChange = first_row_height + 1; int largeChange = ClientSize.Height - columnHeadersHeight - verticalScrollBar.Width; if (largeChange <= 0) largeChange = ClientSize.Height; verticalScrollBar.LargeChange = largeChange; } // Force the visibility of the scrollbars *after* computing the scrolling values, // as we need them *always* for navigation purposes. if (scrollBars != ScrollBars.Vertical && scrollBars != ScrollBars.Both) verticalVisible = false; if (scrollBars != ScrollBars.Horizontal && scrollBars != ScrollBars.Both) horizontalVisible = false; // MSNET compatibility here if (RowCount <= 1) verticalVisible = false; } horizontalScrollBar.Visible = horizontalVisible; verticalScrollBar.Visible = verticalVisible; } protected virtual void OnReadOnlyChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [ReadOnlyChangedEvent]); if (eh != null) eh (this, e); } protected override void OnResize (EventArgs e) { base.OnResize(e); AutoResizeColumnsInternal (); OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value)); OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value)); } protected override void OnRightToLeftChanged (EventArgs e) { base.OnRightToLeftChanged(e); } // In MSDN2 documentation there's no internal here protected internal virtual void OnRowContextMenuStripChanged (DataGridViewRowEventArgs e) { DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowContextMenuStripChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowContextMenuStripNeeded (DataGridViewRowContextMenuStripNeededEventArgs e) { DataGridViewRowContextMenuStripNeededEventHandler eh = (DataGridViewRowContextMenuStripNeededEventHandler)(Events [RowContextMenuStripNeededEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnRowDefaultCellStyleChanged (DataGridViewRowEventArgs e) { DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowDefaultCellStyleChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowDirtyStateNeeded (QuestionEventArgs e) { QuestionEventHandler eh = (QuestionEventHandler)(Events [RowDirtyStateNeededEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowDividerDoubleClick (DataGridViewRowDividerDoubleClickEventArgs e) { DataGridViewRowDividerDoubleClickEventHandler eh = (DataGridViewRowDividerDoubleClickEventHandler)(Events [RowDividerDoubleClickEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowDividerHeightChanged (DataGridViewRowEventArgs e) { DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowDividerHeightChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowEnter (DataGridViewCellEventArgs e) { DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowEnterEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnRowErrorTextChanged (DataGridViewRowEventArgs e) { DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowErrorTextChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowErrorTextNeeded (DataGridViewRowErrorTextNeededEventArgs e) { DataGridViewRowErrorTextNeededEventHandler eh = (DataGridViewRowErrorTextNeededEventHandler)(Events [RowErrorTextNeededEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnRowHeaderCellChanged (DataGridViewRowEventArgs e) { DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowHeaderCellChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowHeaderMouseClick (DataGridViewCellMouseEventArgs e) { DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [RowHeaderMouseClickEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowHeaderMouseDoubleClick (DataGridViewCellMouseEventArgs e) { DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [RowHeaderMouseDoubleClickEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowHeadersBorderStyleChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [RowHeadersBorderStyleChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowHeadersDefaultCellStyleChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [RowHeadersDefaultCellStyleChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowHeadersWidthChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [RowHeadersWidthChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowHeadersWidthSizeModeChanged (DataGridViewAutoSizeModeEventArgs e) { DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [RowHeadersWidthSizeModeChangedEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnRowHeightChanged (DataGridViewRowEventArgs e) { UpdateRowHeightInfo (e.Row.Index, false); DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowHeightChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowHeightInfoNeeded (DataGridViewRowHeightInfoNeededEventArgs e) { DataGridViewRowHeightInfoNeededEventHandler eh = (DataGridViewRowHeightInfoNeededEventHandler)(Events [RowHeightInfoNeededEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowHeightInfoPushed (DataGridViewRowHeightInfoPushedEventArgs e) { DataGridViewRowHeightInfoPushedEventHandler eh = (DataGridViewRowHeightInfoPushedEventHandler)(Events [RowHeightInfoPushedEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowLeave (DataGridViewCellEventArgs e) { DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowLeaveEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnRowMinimumHeightChanged (DataGridViewRowEventArgs e) { DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowMinimumHeightChangedEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnRowPostPaint (DataGridViewRowPostPaintEventArgs e) { DataGridViewRowPostPaintEventHandler eh = (DataGridViewRowPostPaintEventHandler)(Events [RowPostPaintEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnRowPrePaint (DataGridViewRowPrePaintEventArgs e) { DataGridViewRowPrePaintEventHandler eh = (DataGridViewRowPrePaintEventHandler)(Events [RowPrePaintEvent]); if (eh != null) eh (this, e); } internal void OnRowsAddedInternal (DataGridViewRowsAddedEventArgs e) { if (hover_cell != null && hover_cell.RowIndex >= e.RowIndex) hover_cell = null; // Select the first row if we are not databound. // If we are databound selection is managed by the data manager. if (IsHandleCreated && DataManager == null && CurrentCell == null && Rows.Count > 0 && Columns.Count > 0) MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, false, false, true); AutoResizeColumnsInternal (); Invalidate (); OnRowsAdded (e); } protected virtual void OnRowsAdded (DataGridViewRowsAddedEventArgs e) { DataGridViewRowsAddedEventHandler eh = (DataGridViewRowsAddedEventHandler)(Events [RowsAddedEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowsDefaultCellStyleChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [RowsDefaultCellStyleChangedEvent]); if (eh != null) eh (this, e); } internal void OnRowsPreRemovedInternal (DataGridViewRowsRemovedEventArgs e) { if (selected_rows != null) selected_rows.InternalClear (); if (selected_columns != null) selected_columns.InternalClear (); if (Rows.Count - e.RowCount <= 0) { MoveCurrentCell (-1, -1, true, false, false, true); hover_cell = null; } else if (Columns.Count == 0) { MoveCurrentCell (-1, -1, true, false, false, true); hover_cell = null; } else if (currentCell != null && currentCell.RowIndex == e.RowIndex) { int nextRowIndex = e.RowIndex; if (nextRowIndex >= Rows.Count - e.RowCount) nextRowIndex = Rows.Count - 1 - e.RowCount; MoveCurrentCell (currentCell != null ? currentCell.ColumnIndex : 0, nextRowIndex, true, false, false, true); if (hover_cell != null && hover_cell.RowIndex >= e.RowIndex) hover_cell = null; } } internal void OnRowsPostRemovedInternal (DataGridViewRowsRemovedEventArgs e) { Invalidate (); OnRowsRemoved (e); } protected virtual void OnRowsRemoved (DataGridViewRowsRemovedEventArgs e) { DataGridViewRowsRemovedEventHandler eh = (DataGridViewRowsRemovedEventHandler)(Events [RowsRemovedEvent]); if (eh != null) eh (this, e); } protected internal virtual void OnRowStateChanged (int rowIndex, DataGridViewRowStateChangedEventArgs e) { DataGridViewRowStateChangedEventHandler eh = (DataGridViewRowStateChangedEventHandler)(Events [RowStateChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowUnshared (DataGridViewRowEventArgs e) { DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowUnsharedEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowValidated (DataGridViewCellEventArgs e) { DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowValidatedEvent]); if (eh != null) eh (this, e); } protected virtual void OnRowValidating (DataGridViewCellCancelEventArgs e) { DataGridViewCellCancelEventHandler eh = (DataGridViewCellCancelEventHandler)(Events [RowValidatingEvent]); if (eh != null) eh (this, e); } protected virtual void OnScroll (ScrollEventArgs e) { ScrollEventHandler eh = (ScrollEventHandler)(Events [ScrollEvent]); if (eh != null) eh (this, e); } protected virtual void OnSelectionChanged (EventArgs e) { EventHandler eh = (EventHandler)(Events [SelectionChangedEvent]); if (eh != null) eh (this, e); } protected virtual void OnSortCompare (DataGridViewSortCompareEventArgs e) { DataGridViewSortCompareEventHandler eh = (DataGridViewSortCompareEventHandler)(Events [SortCompareEvent]); if (eh != null) eh (this, e); } protected virtual void OnSorted (EventArgs e) { EventHandler eh = (EventHandler)(Events [SortedEvent]); if (eh != null) eh (this, e); } protected virtual void OnUserAddedRow (DataGridViewRowEventArgs e) { PrepareEditingRow (false, false); new_row_editing = true; if (DataManager != null) { // Switch the current editing row with a real one if (editing_row != null) { Rows.RemoveInternal (editing_row); editing_row = null; } DataManager.AddNew (); // will raise OnListPositionChanged } e = new DataGridViewRowEventArgs (Rows[NewRowIndex]); DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [UserAddedRowEvent]); if (eh != null) eh (this, e); } protected virtual void OnUserDeletedRow (DataGridViewRowEventArgs e) { DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [UserDeletedRowEvent]); if (eh != null) eh (this, e); } protected virtual void OnUserDeletingRow (DataGridViewRowCancelEventArgs e) { DataGridViewRowCancelEventHandler eh = (DataGridViewRowCancelEventHandler)(Events [UserDeletingRowEvent]); if (eh != null) eh (this, e); } protected override void OnValidating (CancelEventArgs e) { base.OnValidating(e); } protected override void OnVisibleChanged (EventArgs e) { base.OnVisibleChanged(e); } protected virtual void PaintBackground (Graphics graphics, Rectangle clipBounds, Rectangle gridBounds) { graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (backgroundColor), gridBounds); } protected bool ProcessAKey (Keys keyData) { if (!MultiSelect) return false; if ((keyData & Keys.Control) == Keys.Control) { SelectAll (); return true; } return false; } protected virtual bool ProcessDataGridViewKey (KeyEventArgs e) { switch (e.KeyData & ~Keys.Modifiers) { case Keys.A: return ProcessAKey (e.KeyData); case Keys.Delete: return ProcessDeleteKey (e.KeyData); case Keys.Down: return ProcessDownKey (e.KeyData); case Keys.Escape: return ProcessEscapeKey (e.KeyData); case Keys.End: return ProcessEndKey (e.KeyData); case Keys.Enter: return ProcessEnterKey (e.KeyData); case Keys.F2: return ProcessF2Key (e.KeyData); case Keys.Home: return ProcessHomeKey (e.KeyData); case Keys.Left: return ProcessLeftKey (e.KeyData); case Keys.Next: return ProcessNextKey (e.KeyData); case Keys.Prior: return ProcessPriorKey (e.KeyData); case Keys.Right: return ProcessRightKey (e.KeyData); case Keys.Space: return ProcessSpaceKey (e.KeyData); case Keys.Tab: return ProcessTabKey (e.KeyData); case Keys.Up: return ProcessUpKey (e.KeyData); case Keys.D0: case Keys.NumPad0: return ProcessZeroKey (e.KeyData); } return false; } protected bool ProcessDeleteKey (Keys keyData) { if (!AllowUserToDeleteRows || SelectedRows.Count == 0) return false; for (int i = SelectedRows.Count - 1; i >= 0; i--) { DataGridViewRow row = SelectedRows[i]; if (row.IsNewRow) continue; if (hover_cell != null && hover_cell.OwningRow == row) hover_cell = null; if (DataManager != null) DataManager.RemoveAt (row.Index); else Rows.RemoveAt (row.Index); } return true; } protected override bool ProcessDialogKey (Keys keyData) { switch (keyData) { case Keys.Tab: case Keys.Shift | Keys.Tab: if (standardTab) return base.ProcessDialogKey (keyData & ~Keys.Control); if (ProcessDataGridViewKey (new KeyEventArgs (keyData))) return true; break; case Keys.Control | Keys.Tab: case Keys.Control | Keys.Shift | Keys.Tab: if (!standardTab) return base.ProcessDialogKey (keyData & ~Keys.Control); if (ProcessDataGridViewKey (new KeyEventArgs (keyData))) return true; break; case Keys.Enter: case Keys.Escape: if (ProcessDataGridViewKey (new KeyEventArgs (keyData))) return true; break; } return base.ProcessDialogKey(keyData); } protected bool ProcessDownKey (Keys keyData) { int current_row = CurrentCellAddress.Y; if (current_row < Rows.Count - 1) { // Move to the last cell in the column if ((keyData & Keys.Control) == Keys.Control) MoveCurrentCell (CurrentCellAddress.X, Rows.Count - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true); // Move one cell down else MoveCurrentCell (CurrentCellAddress.X, current_row + 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true); return true; } return false; } protected bool ProcessEndKey (Keys keyData) { int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X); // Move to the last cell in the control if ((keyData & Keys.Control) == Keys.Control) { MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), Rows.Count - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true); return true; } // Move to the last cell in the row if (disp_index < Columns.Count - 1) { MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true); return true; } return false; } protected bool ProcessEnterKey (Keys keyData) { if (ProcessDownKey (keyData)) return true; // ProcessDown may fail if we are on the last row, // but Enter should still EndEdit if this is the last row EndEdit (); return true; } protected bool ProcessEscapeKey (Keys keyData) { if (!IsCurrentCellInEditMode) return false; CancelEdit (); return true; } protected bool ProcessF2Key (Keys keyData) { if (editMode == DataGridViewEditMode.EditOnF2 || editMode == DataGridViewEditMode.EditOnKeystrokeOrF2) { BeginEdit (true); return true; } return false; } protected bool ProcessHomeKey (Keys keyData) { int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X); // Move to the first cell in the control if ((keyData & Keys.Control) == Keys.Control) { MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true); return true; } // Move to the first cell in the row if (disp_index > 0) { MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true); return true; } return false; } [MonoInternalNote ("What does insert do?")] protected bool ProcessInsertKey (Keys keyData) { return false; } protected override bool ProcessKeyEventArgs (ref Message m) { DataGridViewCell cell = CurrentCell; if (cell != null) { if (cell.KeyEntersEditMode (new KeyEventArgs ((Keys)m.WParam.ToInt32 ()))) BeginEdit (true); if (EditingControl != null && ((Msg)m.Msg == Msg.WM_KEYDOWN || (Msg)m.Msg == Msg.WM_CHAR)) XplatUI.SendMessage (EditingControl.Handle, (Msg)m.Msg, m.WParam, m.LParam); } return base.ProcessKeyEventArgs (ref m); } protected override bool ProcessKeyPreview (ref Message m) { if ((Msg)m.Msg == Msg.WM_KEYDOWN && (IsCurrentCellInEditMode || m.HWnd == horizontalScrollBar.Handle || m.HWnd == verticalScrollBar.Handle)) { KeyEventArgs e = new KeyEventArgs ((Keys)m.WParam.ToInt32 ()); IDataGridViewEditingControl ctrl = (IDataGridViewEditingControl)EditingControlInternal; if (ctrl != null) if (ctrl.EditingControlWantsInputKey (e.KeyData, false)) return false; switch (e.KeyData) { case Keys.Escape: case Keys.Down: case Keys.Up: case Keys.Left: case Keys.Right: case Keys.Tab: case Keys.Prior: case Keys.Next: return ProcessDataGridViewKey (e); } } return base.ProcessKeyPreview (ref m); } protected bool ProcessLeftKey (Keys keyData) { int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X); if (disp_index > 0) { // Move to the first cell in the row if ((keyData & Keys.Control) == Keys.Control) MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true); // Move one cell to the left else MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true); return true; } return false; } // Page Down protected bool ProcessNextKey (Keys keyData) { int current_row = CurrentCellAddress.Y; if (current_row < Rows.Count - 1) { // Move one "page" of cells down int new_row = Math.Min (Rows.Count - 1, current_row + DisplayedRowCount (false)); MoveCurrentCell (CurrentCellAddress.X, new_row, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true); return true; } return false; } // Page Up protected bool ProcessPriorKey (Keys keyData) { int current_row = CurrentCellAddress.Y; if (current_row > 0) { // Move one "page" of cells up int new_row = Math.Max (0, current_row - DisplayedRowCount (false)); MoveCurrentCell (CurrentCellAddress.X, new_row, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true); return true; } return false; } protected bool ProcessRightKey (Keys keyData) { int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X); if (disp_index < Columns.Count - 1) { // Move to the last cell in the row if ((keyData & Keys.Control) == Keys.Control) MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true); // Move one cell to the right else MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index + 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true); return true; } return false; } protected bool ProcessSpaceKey (Keys keyData) { if ((keyData & Keys.Shift) == Keys.Shift) { if (selectionMode == DataGridViewSelectionMode.RowHeaderSelect) { SetSelectedRowCore (CurrentCellAddress.Y, true); InvalidateRow (CurrentCellAddress.Y); return true; } if (selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect) { SetSelectedColumnCore (CurrentCellAddress.X, true); InvalidateColumn (CurrentCellAddress.X); return true; } } if (CurrentCell is DataGridViewButtonCell || CurrentCell is DataGridViewLinkCell || CurrentCell is DataGridViewCheckBoxCell) { DataGridViewCellEventArgs e = new DataGridViewCellEventArgs (CurrentCell.ColumnIndex, CurrentCell.RowIndex); OnCellClick (e); OnCellContentClick (e); if (CurrentCell is DataGridViewButtonCell) (CurrentCell as DataGridViewButtonCell).OnClickInternal (e); if (CurrentCell is DataGridViewCheckBoxCell) (CurrentCell as DataGridViewCheckBoxCell).OnClickInternal (e); return true; } return false; } protected bool ProcessTabKey (Keys keyData) { Form f = FindForm (); if (f != null) f.ActivateFocusCues (); int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X); // Tab goes forward // Shift-tab goes backwards if ((keyData & Keys.Shift) == Keys.Shift) { if (disp_index > 0) { // Move one cell to the left MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, false, true); return true; } else if (currentCellAddress.Y > 0) { // Move to the last cell in the previous row MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y - 1, true, false, false, true); return true; } } else { if (disp_index < Columns.Count - 1) { // Move one cell to the right MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index + 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, false, true); return true; } else if (currentCellAddress.Y < Rows.Count - 1) { // Move to the first cell in the next row MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y + 1, true, false, false, true); return true; } } return false; } protected bool ProcessUpKey (Keys keyData) { int current_row = CurrentCellAddress.Y; if (current_row > 0) { // Move to the first cell in the column if ((keyData & Keys.Control) == Keys.Control) MoveCurrentCell (CurrentCellAddress.X, 0, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true); // Move one cell up else MoveCurrentCell (CurrentCellAddress.X, current_row - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true); return true; } return false; } protected bool ProcessZeroKey (Keys keyData) { if ((keyData & Keys.Control) == Keys.Control && CurrentCell.EditType != null) { CurrentCell.Value = DBNull.Value; InvalidateCell (CurrentCell); return true; } return false; } protected override void SetBoundsCore (int x, int y, int width, int height, BoundsSpecified specified) { base.SetBoundsCore(x, y, width, height, specified); } [MonoTODO ("Does not use validateCurrentCell")] protected virtual bool SetCurrentCellAddressCore (int columnIndex, int rowIndex, bool setAnchorCellAddress, bool validateCurrentCell, bool throughMouseClick) { if ((columnIndex < 0 || columnIndex > Columns.Count - 1) && rowIndex != -1) throw new ArgumentOutOfRangeException ("columnIndex"); if ((rowIndex < 0 || rowIndex > Rows.Count - 1) && columnIndex != -1) throw new ArgumentOutOfRangeException ("rowIndex"); DataGridViewCell cell; if (columnIndex == -1 && rowIndex == -1) cell = null; else cell = Rows.SharedRow (rowIndex).Cells[columnIndex]; if (cell != null && !cell.Visible) throw new InvalidOperationException ("cell is not visible"); // Always update the current cell address property // If the row has moved it would be out of date. if (currentCell != null) { if (setAnchorCellAddress) { anchor_cell.X = currentCell.ColumnIndex; anchor_cell.Y = currentCell.RowIndex; } currentCellAddress.X = currentCell.ColumnIndex; currentCellAddress.Y = currentCell.RowIndex; } if (cell != currentCell) { if (currentCell != null) { if (currentCell.IsInEditMode) { if (!EndEdit ()) return false; else if (currentCell.RowIndex == NewRowIndex && new_row_editing) CancelEdit (); } else { // CancelEdit will replace the uncommited real editing row with a place holder row if (new_row_editing && currentCell.RowIndex == NewRowIndex) CancelEdit (); } OnCellLeave (new DataGridViewCellEventArgs(currentCell.ColumnIndex, currentCell.RowIndex)); OnRowLeave (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex)); } currentCell = cell; if (setAnchorCellAddress) anchor_cell = new Point (columnIndex, rowIndex); currentCellAddress = new Point (columnIndex, rowIndex); if (cell != null) { UpdateBindingPosition (cell.RowIndex); OnRowEnter (new DataGridViewCellEventArgs (cell.ColumnIndex, cell.RowIndex)); OnCellEnter (new DataGridViewCellEventArgs(cell.ColumnIndex, cell.RowIndex)); } OnCurrentCellChanged (EventArgs.Empty); if (cell != null) { // If the user begins an edit in the NewRow, add a new real row if (AllowUserToAddRows && cell.RowIndex == NewRowIndex && !is_binding && !new_row_editing) { // OnUserAddedRow will add a real row and reset the current cell OnUserAddedRow (new DataGridViewRowEventArgs (Rows[NewRowIndex])); } else { if (editMode == DataGridViewEditMode.EditOnEnter) BeginEdit (true); } } } else { if (cell != null && throughMouseClick) BeginEdit (true); } return true; } protected virtual void SetSelectedCellCore (int columnIndex, int rowIndex, bool selected) { rows [rowIndex].Cells [columnIndex].Selected = selected; OnSelectionChanged (EventArgs.Empty); } internal void SetSelectedColumnCoreInternal (int columnIndex, bool selected) { SetSelectedColumnCore (columnIndex, selected); } protected virtual void SetSelectedColumnCore (int columnIndex, bool selected) { if (selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect && selectionMode != DataGridViewSelectionMode.FullColumnSelect) return; DataGridViewColumn col = columns [columnIndex]; col.SelectedInternal = selected; if (selected_columns == null) selected_columns = new DataGridViewSelectedColumnCollection (); if (!selected && selected_columns.Contains (col)) { selected_columns.InternalRemove (col); } else if (selected && !selected_columns.Contains (col)) { selected_columns.InternalAdd (col); } Invalidate(); } internal void SetSelectedRowCoreInternal (int rowIndex, bool selected) { if (rowIndex >= 0 && rowIndex < Rows.Count) SetSelectedRowCore (rowIndex, selected); } protected virtual void SetSelectedRowCore (int rowIndex, bool selected) { DataGridViewRow row = rows [rowIndex]; row.SelectedInternal = selected; if (selected_rows == null) selected_rows = new DataGridViewSelectedRowCollection (this); if (!selected && selected_rows.Contains (row)) { selected_rows.InternalRemove (row); } else if (selected && !selected_rows.Contains (row)) { selected_rows.InternalAdd (row); } Invalidate(); } protected override void WndProc (ref Message m) { base.WndProc (ref m); } internal void InternalOnCellClick (DataGridViewCellEventArgs e) { OnCellClick (e); } internal void InternalOnCellContentClick (DataGridViewCellEventArgs e) { OnCellContentClick (e); } internal void InternalOnCellContentDoubleClick (DataGridViewCellEventArgs e) { OnCellContentDoubleClick (e); } internal void InternalOnCellValueChanged (DataGridViewCellEventArgs e) { OnCellValueChanged (e); } internal void InternalOnDataError (DataGridViewDataErrorEventArgs e) { /////////////// false? //////////// OnDataError (false, e); } internal void InternalOnMouseWheel (MouseEventArgs e) { OnMouseWheel (e); } internal void OnHScrollBarScroll (object sender, ScrollEventArgs e) { int lastRightVisibleColumntIndex = Columns.Count - DisplayedColumnCount (false); horizontalScrollingOffset = e.NewValue; int left = 0; for (int index = 0; index < Columns.Count; index++) { DataGridViewColumn col = Columns[index]; if (col.Index >= lastRightVisibleColumntIndex) { first_col_index = lastRightVisibleColumntIndex; Invalidate (); OnScroll (e); } else if (e.NewValue < left + col.Width) { if (first_col_index != index) { first_col_index = index; Invalidate (); OnScroll (e); } return; } left += col.Width; } } internal void OnVScrollBarScroll (object sender, ScrollEventArgs e) { verticalScrollingOffset = e.NewValue; if (Rows.Count == 0) return; int top = 0; int lastTopVisibleRowIndex = Rows.Count - DisplayedRowCount (false); for (int index = 0; index < Rows.Count; index++) { DataGridViewRow row = Rows[index]; if (!row.Visible) continue; if (row.Index >= lastTopVisibleRowIndex) { first_row_index = lastTopVisibleRowIndex; Invalidate (); OnScroll (e); } else if (e.NewValue < top + row.Height) { if (first_row_index != index) { first_row_index = index; Invalidate (); OnScroll (e); } return; } top += row.Height; } first_row_index = lastTopVisibleRowIndex; Invalidate (); OnScroll (e); } internal void RaiseCellStyleChanged (DataGridViewCellEventArgs e) { OnCellStyleChanged(e); } internal void OnColumnCollectionChanged (object sender, CollectionChangeEventArgs e) { switch (e.Action) { case CollectionChangeAction.Add: OnColumnAddedInternal(new DataGridViewColumnEventArgs(e.Element as DataGridViewColumn)); break; case CollectionChangeAction.Remove: OnColumnPostRemovedInternal(new DataGridViewColumnEventArgs(e.Element as DataGridViewColumn)); break; case CollectionChangeAction.Refresh: hover_cell = null; MoveCurrentCell (-1, -1, true, false, false, true); break; } } // Resizes all columns according to their AutoResizeMode property. // First all the columns that aren't Filled are resized, then we resize all the Filled columns. internal void AutoResizeColumnsInternal () { for (int i = 0; i < Columns.Count; i++) AutoResizeColumnInternal (i, Columns [i].InheritedAutoSizeMode); AutoFillColumnsInternal (); } internal void AutoFillColumnsInternal () { float totalFillWeight = 0; int FillCount = 0; // The number of columns that has AutoSizeMode.Fill set int spaceLeft = ClientSize.Width - (verticalScrollBar.VisibleInternal ? verticalScrollBar.Width : 0); if (RowHeadersVisible) { spaceLeft -= RowHeadersWidth; } spaceLeft -= BorderWidth * 2; int [] fixed_widths = new int [Columns.Count]; int [] new_widths = new int [Columns.Count]; bool fixed_any = false; for (int i = 0; i < Columns.Count; i++) { DataGridViewColumn col = Columns [i]; if (!col.Visible) continue; switch (col.InheritedAutoSizeMode) { case DataGridViewAutoSizeColumnMode.Fill: FillCount++; totalFillWeight += col.FillWeight; break; case DataGridViewAutoSizeColumnMode.AllCellsExceptHeader: case DataGridViewAutoSizeColumnMode.AllCells: case DataGridViewAutoSizeColumnMode.DisplayedCells: case DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader: case DataGridViewAutoSizeColumnMode.None: case DataGridViewAutoSizeColumnMode.NotSet: spaceLeft -= Columns [i].Width; break; } } spaceLeft = Math.Max (0, spaceLeft); do { fixed_any = false; for (int i = 0; i < columns.Count; i++) { DataGridViewColumn col = Columns [i]; int width; if (col.InheritedAutoSizeMode != DataGridViewAutoSizeColumnMode.Fill) continue; if (!col.Visible) continue; if (fixed_widths [i] != 0) continue; width = (totalFillWeight == 0) ? 0 : (int) Math.Round (spaceLeft * (col.FillWeight / totalFillWeight), 0); if (width < 0) width = 0; if (width < col.MinimumWidth) { width = col.MinimumWidth; fixed_widths [i] = width; fixed_any = true; spaceLeft -= width; totalFillWeight -= col.FillWeight; } new_widths [i] = width; } } while (fixed_any); for (int i = 0; i < columns.Count; i++) { if (Columns [i].InheritedAutoSizeMode != DataGridViewAutoSizeColumnMode.Fill) continue; if (!Columns[i].Visible) continue; Columns [i].Width = new_widths [i]; } } internal void AutoResizeColumnInternal (int columnIndex, DataGridViewAutoSizeColumnMode mode) { // http://msdn2.microsoft.com/en-us/library/ms171605.aspx int size = 0; DataGridViewColumn col = Columns [columnIndex]; switch (mode) { case DataGridViewAutoSizeColumnMode.Fill: return; case DataGridViewAutoSizeColumnMode.AllCellsExceptHeader: case DataGridViewAutoSizeColumnMode.AllCells: case DataGridViewAutoSizeColumnMode.DisplayedCells: case DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader: size = Math.Max (CalculateColumnCellWidth (columnIndex, col.InheritedAutoSizeMode), col.HeaderCell.ContentBounds.Width); break; case DataGridViewAutoSizeColumnMode.ColumnHeader: size = col.HeaderCell.ContentBounds.Width; break; default: size = col.Width; break; } if (size < 0) size = 0; if (size < col.MinimumWidth) size = col.MinimumWidth; col.Width = size; } internal int CalculateColumnCellWidth (int index, DataGridViewAutoSizeColumnMode mode) { int first_row = 0; int last_row = Rows.Count; int result = 0; if (mode == DataGridViewAutoSizeColumnMode.DisplayedCells || mode == DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader) { first_row = first_row_index; last_row = DisplayedRowCount (true);; } for (int i = first_row; i < last_row; i++) { if (!Rows[i].Visible) continue; int cell_width = Rows[i].Cells[index].PreferredSize.Width; result = Math.Max (result, cell_width); } return result; } Rectangle GetHeaderCellBounds (DataGridViewHeaderCell cell) { Rectangle bounds = new Rectangle (ClientRectangle.Location, cell.Size); if (cell is DataGridViewColumnHeaderCell) { if (RowHeadersVisible) bounds.X += RowHeadersWidth; List sortedColumns = columns.ColumnDisplayIndexSortedArrayList; for (int index = first_col_index; index < sortedColumns.Count; index++) { DataGridViewColumn column = sortedColumns [index]; if (column.Index == cell.ColumnIndex) break; bounds.X += column.Width; } } else { if (ColumnHeadersVisible) bounds.Y += ColumnHeadersHeight; for (int index = first_row_index; index < Rows.Count; index++) { DataGridViewRow row = GetRowInternal (index); if (row.HeaderCell == cell) break; bounds.Y += row.Height; } } return bounds; } private void PrepareEditingRow (bool cell_changed, bool column_changed) { if (new_row_editing) return; bool show = false; show = ColumnCount > 0 && AllowUserToAddRows; if (!show) { RemoveEditingRow (); } else if (show) { if (editing_row != null && (cell_changed || column_changed)) { // The row changed, it's no longer an editing row. // or // The number of columns has changed, we need a new editing row. RemoveEditingRow (); } if (editing_row == null) { editing_row = RowTemplateFull; Rows.AddInternal (editing_row, false); } } } internal void RemoveEditingRow () { if (editing_row != null) { if (Rows.Contains (editing_row)) Rows.RemoveInternal (editing_row); editing_row = null; } } internal DataGridViewRow EditingRow { get { return editing_row; } } private void AddBoundRow (object element) { // Don't add rows if there are no columns if (ColumnCount == 0) return; DataGridViewRow row = (DataGridViewRow)RowTemplateFull; rows.AddInternal (row, false); } private bool IsColumnAlreadyBound (string name) { foreach (DataGridViewColumn col in Columns) if (String.Compare (col.DataPropertyName, name, true) == 0) return true; return false; } private DataGridViewColumn CreateColumnByType (Type type) { if (type == typeof (bool)) return new DataGridViewCheckBoxColumn (); else if (typeof(Bitmap).IsAssignableFrom (type)) return new DataGridViewImageColumn (); return new DataGridViewTextBoxColumn (); } private void ClearBinding () { if (IsCurrentCellInEditMode && !EndEdit ()) CancelEdit (); MoveCurrentCell (-1, -1, false, false, false, true); if (DataManager != null) { DataManager.ListChanged -= OnListChanged; DataManager.PositionChanged -= OnListPositionChanged; columns.ClearAutoGeneratedColumns (); rows.Clear (); RemoveEditingRow (); } } private void ResetRows () { rows.Clear (); RemoveEditingRow (); if (DataManager != null) { foreach (object element in DataManager.List) AddBoundRow (element); } PrepareEditingRow (false, true); OnListPositionChanged (this, EventArgs.Empty); } private void DoBinding () { /* 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: - the System.Collections.IList interface, including one-dimensional arrays. - the System.ComponentModel.IListSource interface, such as the System.Data.DataTable and System.Data.DataSet classes. - the System.ComponentModel.IBindingList interface, such as the System.ComponentModel.Collections.BindingList<> class. - the System.ComponentModel.IBindingListView interface, such as the System.Windows.Forms.BindingSource class. */ if (dataSource != null && DataManager != null) { if (autoGenerateColumns) { is_autogenerating_columns = true; foreach (PropertyDescriptor property in DataManager.GetItemProperties()) { // This keeps out things like arrays if ((typeof(ICollection).IsAssignableFrom (property.PropertyType))) continue; if (!property.IsBrowsable) continue; if (IsColumnAlreadyBound (property.Name)) continue; DataGridViewColumn col = CreateColumnByType (property.PropertyType); col.Name = property.DisplayName; col.DataPropertyName = property.Name; col.ReadOnly = !DataManager.AllowEdit || property.IsReadOnly; col.ValueType = property.PropertyType; col.AutoGenerated = true; columns.Add (col); } is_autogenerating_columns = false; } // DataBind both autogenerated and not columns if there is a matching property foreach (DataGridViewColumn column in columns) column.DataColumnIndex = FindDataColumnIndex (column); foreach (object element in DataManager.List) AddBoundRow (element); DataManager.ListChanged += OnListChanged; DataManager.PositionChanged += OnListPositionChanged; OnDataBindingComplete (new DataGridViewBindingCompleteEventArgs (ListChangedType.Reset)); OnListPositionChanged (this, EventArgs.Empty); } else { if (Rows.Count > 0 && Columns.Count > 0) MoveCurrentCell (0, 0, true, false, false, false); } PrepareEditingRow (false, true); } private void MoveCurrentCell (int x, int y, bool select, bool isControl, bool isShift, bool scroll) { if (x == -1 || y == -1) x = y = -1; else { if (x < 0 || x > Columns.Count - 1) throw new ArgumentOutOfRangeException ("x"); if (y < 0 || y > Rows.Count - 1) throw new ArgumentOutOfRangeException ("y"); if (!Rows[y].Visible) { for (int i = y; i < Rows.Count; i++) { if (Rows[i].Visible) { y = i; break; } } } if (!Columns[x].Visible) { for (int i = x; i < Columns.Count; i++) { if (Columns[i].Visible) { x = i; break; } } } // in case either no visible columns or rows if (!Rows[y].Visible || !Columns[x].Visible) x = y = -1; } if (!SetCurrentCellAddressCore (x, y, true, false, false)) { ClearSelection (); return; } if (x == -1 && y == -1) { ClearSelection (); return; } bool full_row_selected = Rows.SharedRow(CurrentCellAddress.Y).Selected; bool full_col_selected = Columns[CurrentCellAddress.X].Selected; // Move Selection DataGridViewSelectionMode mode = selectionMode; // If we are row header select and we clicked a row header, use full row if (mode == DataGridViewSelectionMode.RowHeaderSelect && (x == -1 || (full_row_selected && CurrentCellAddress.X == x))) mode = DataGridViewSelectionMode.FullRowSelect; else if (mode == DataGridViewSelectionMode.RowHeaderSelect) mode = DataGridViewSelectionMode.CellSelect; // If we are col header select and we clicked a col header, use full col if (mode == DataGridViewSelectionMode.ColumnHeaderSelect && (y == -1 || (full_col_selected && CurrentCellAddress.Y == y))) mode = DataGridViewSelectionMode.FullColumnSelect; else if (mode == DataGridViewSelectionMode.ColumnHeaderSelect) mode = DataGridViewSelectionMode.CellSelect; // If the current cell isn't visible, scroll to it if (scroll) { int disp_x = ColumnIndexToDisplayIndex (x); bool scrollbarsRefreshed = false; int displayedColumnsCount = DisplayedColumnCount (false); int delta_x = 0; // The trick here is that in order to avoid unnecessary calculations each time a row/column // is added/removed we recalculate the whole grid size just before the scroll to selection. if (disp_x < first_col_index) { RefreshScrollBars (); scrollbarsRefreshed = true; if (disp_x == 0) delta_x = horizontalScrollBar.Value; else { // in case the column got removed if (first_col_index >= ColumnCount) first_col_index = ColumnCount - 1; for (int i = disp_x; i < first_col_index; i++) delta_x += Columns[ColumnDisplayIndexToIndex (i)].Width; } horizontalScrollBar.SafeValueSet (horizontalScrollBar.Value - delta_x); OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value)); } else if (disp_x > first_col_index + displayedColumnsCount - 1) { RefreshScrollBars (); scrollbarsRefreshed = true; if (disp_x == Columns.Count - 1) delta_x = horizontalScrollBar.Maximum - horizontalScrollBar.Value; else for (int i = first_col_index + displayedColumnsCount - 1; i < disp_x; i++) delta_x += Columns[ColumnDisplayIndexToIndex (i)].Width; horizontalScrollBar.SafeValueSet (horizontalScrollBar.Value + delta_x); OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value)); } int disp_y = y; int displayedRowsCount = DisplayedRowCount (false); int delta_y = 0; if (disp_y < first_row_index) { if (!scrollbarsRefreshed) RefreshScrollBars (); if (disp_y == 0) delta_y = verticalScrollBar.Value; else { // in case the row got removed if (first_row_index >= RowCount) first_row_index = RowCount - 1; for (int i = disp_y; i < first_row_index; i++) delta_y += GetRowInternal (i).Height; } verticalScrollBar.SafeValueSet (verticalScrollBar.Value - delta_y); OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value)); } else if (disp_y > first_row_index + displayedRowsCount - 1) { if (!scrollbarsRefreshed) RefreshScrollBars (); if (disp_y == Rows.Count - 1) delta_y = verticalScrollBar.Maximum - verticalScrollBar.Value; else for (int i = first_row_index + displayedRowsCount - 1; i < disp_y; i++) delta_y += GetRowInternal (i).Height; verticalScrollBar.SafeValueSet (verticalScrollBar.Value + delta_y); OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value)); } } if (!select) return; // Clear old selection unless multi-selecting if (!isShift) ClearSelection (); switch (mode) { case DataGridViewSelectionMode.CellSelect: SetSelectedCellCore (x, y, true); break; case DataGridViewSelectionMode.FullRowSelect: SetSelectedRowCore (y, true); break; case DataGridViewSelectionMode.FullColumnSelect: SetSelectedColumnCore (x, true); break; } Invalidate (); } private int ColumnIndexToDisplayIndex (int index) { if (index == -1) return index; return Columns[index].DisplayIndex; } private int ColumnDisplayIndexToIndex (int index) { return Columns.ColumnDisplayIndexSortedArrayList[index].Index; } private void OnListChanged (object sender, ListChangedEventArgs args) { switch (args.ListChangedType) { case ListChangedType.ItemAdded: AddBoundRow (DataManager[args.NewIndex]); break; case ListChangedType.ItemDeleted: Rows.RemoveAtInternal (args.NewIndex); break; case ListChangedType.ItemChanged: break; default: ResetRows (); break; } Invalidate (); } private void OnListPositionChanged (object sender, EventArgs args) { if (Rows.Count > 0 && Columns.Count > 0 && DataManager.Position != -1) MoveCurrentCell (currentCell != null ? currentCell.ColumnIndex : 0, DataManager.Position, true, false, false, true); else MoveCurrentCell (-1, -1, true, false, false, true); } private void ReBind () { if (!is_binding) { SuspendLayout (); is_binding = true; ClearBinding (); DoBinding (); is_binding = false; ResumeLayout (true); Invalidate (); } } private bool MouseOverColumnResize (int col, int mousex) { if (!allowUserToResizeColumns) return false; Rectangle col_bounds = GetCellDisplayRectangle (col, 0, false); if (mousex >= col_bounds.Right - 4 && mousex <= col_bounds.Right) return true; return false; } private bool MouseOverRowResize (int row, int mousey) { if (!allowUserToResizeRows) return false; Rectangle row_bounds = GetCellDisplayRectangle (0, row, false); if (mousey >= row_bounds.Bottom - 4 && mousey <= row_bounds.Bottom) return true; return false; } private void DrawVerticalResizeLine (int x) { Rectangle splitter = new Rectangle (x, Bounds.Y + 3 + (ColumnHeadersVisible ? ColumnHeadersHeight : 0), 1, Bounds.Height - 3 - (ColumnHeadersVisible ? ColumnHeadersHeight : 0)); XplatUI.DrawReversibleRectangle (Handle, splitter, 2); } private void DrawHorizontalResizeLine (int y) { Rectangle splitter = new Rectangle (Bounds.X + 3 + (RowHeadersVisible ? RowHeadersWidth : 0), y, Bounds.Width - 3 + (RowHeadersVisible ? RowHeadersWidth : 0), 1); XplatUI.DrawReversibleRectangle (Handle, splitter, 2); } #region Stuff for ToolTips private void MouseEnteredErrorIcon (DataGridViewCell item) { tooltip_currently_showing = item; ToolTipTimer.Start (); } private void MouseLeftErrorIcon (DataGridViewCell item) { ToolTipTimer.Stop (); ToolTipWindow.Hide (this); tooltip_currently_showing = null; } private Timer ToolTipTimer { get { if (tooltip_timer == null) { tooltip_timer = new Timer (); tooltip_timer.Enabled = false; tooltip_timer.Interval = 500; tooltip_timer.Tick += new EventHandler (ToolTipTimer_Tick); } return tooltip_timer; } } private ToolTip ToolTipWindow { get { if (tooltip_window == null) tooltip_window = new ToolTip (); return tooltip_window; } } private void ToolTipTimer_Tick (object o, EventArgs args) { string tooltip = tooltip_currently_showing.ErrorText; if (!string.IsNullOrEmpty (tooltip)) ToolTipWindow.Present (this, tooltip); ToolTipTimer.Stop (); } #endregion private class ColumnSorter : IComparer { int column; int direction = 1; bool numeric_sort; public ColumnSorter (DataGridViewColumn column, ListSortDirection direction, bool numeric) { this.column = column.Index; this.numeric_sort = numeric; if (direction == ListSortDirection.Descending) this.direction = -1; } #region IComparer Members public int Compare (object x, object y) { DataGridViewRow row1 = (DataGridViewRow)x; DataGridViewRow row2 = (DataGridViewRow)y; if (row1.Cells[column].ValueType == typeof (DateTime) && row2.Cells[column].ValueType == typeof (DateTime)) return DateTime.Compare ((DateTime)row1.Cells[column].Value, (DateTime)row2.Cells[column].Value) * direction; object val1 = row1.Cells[column].FormattedValue; object val2 = row2.Cells[column].FormattedValue; object val1NullValue = row1.Cells[column].InheritedStyle.NullValue; object val2NullValue = row2.Cells[column].InheritedStyle.NullValue; if (val1 == val1NullValue && val2 == val2NullValue) return 0; if (val1 == val1NullValue) return direction; if (val2 == val2NullValue) return -1 * direction; if (numeric_sort) return (int)(double.Parse (val1.ToString ()) - double.Parse (val2.ToString ())) * direction; else return string.Compare (val1.ToString (), val2.ToString ()) * direction; } #endregion } public sealed class HitTestInfo { public static readonly HitTestInfo Nowhere = new HitTestInfo(-1, -1, -1, -1, DataGridViewHitTestType.None); private int columnIndex; private int columnX; private int rowIndex; private int rowY; private DataGridViewHitTestType type; internal HitTestInfo (int columnIndex, int columnX, int rowIndex, int rowY, DataGridViewHitTestType type) { this.columnIndex = columnIndex; this.columnX = columnX; this.rowIndex = rowIndex; this.rowY = rowY; this.type = type; } public int ColumnIndex { get { return columnIndex; } } public int ColumnX { get { return columnX; } } public int RowIndex { get { return rowIndex; } } public int RowY { get { return rowY; } } public DataGridViewHitTestType Type { get { return type; } } public override bool Equals (object value) { if (value is HitTestInfo) { HitTestInfo aux = (HitTestInfo) value; if (aux.columnIndex == columnIndex && aux.columnX == columnX && aux.rowIndex == rowIndex && aux.rowY == rowY && aux.type == type) { return true; } } return false; } public override int GetHashCode () { return base.GetHashCode(); } public override string ToString () { return string.Format ("Type:{0}, Column:{1}, Row:{2}", type, columnIndex, rowIndex); } } [ComVisible (false)] public class DataGridViewControlCollection : Control.ControlCollection { private DataGridView owner; public DataGridViewControlCollection (DataGridView owner) : base (owner) { this.owner = owner; } public override void Clear () { // // This is severely buggy, just as MS' implementation is. // for (int i = 0; i < Count; i++) { Remove (this [i]); } } public void CopyTo (Control [] array, int index) { base.CopyTo (array, index); } public void Insert (int index, Control value) { throw new NotSupportedException (); } public override void Remove (Control value) { if (value == owner.horizontalScrollBar) return; if (value == owner.verticalScrollBar) return; if (value == owner.editingControl) return; base.Remove (value); } internal void RemoveInternal (Control value) { base.Remove (value); } } [ComVisibleAttribute(true)] protected class DataGridViewAccessibleObject : ControlAccessibleObject { public DataGridViewAccessibleObject (DataGridView owner) : base (owner){ } public override AccessibleRole Role { get { return base.Role; } } public override string Name { get { return base.Name; } } public override AccessibleObject GetChild (int index) { return base.GetChild(index); } public override int GetChildCount () { return base.GetChildCount(); } public override AccessibleObject GetFocused () { return base.GetFocused(); } public override AccessibleObject GetSelected () { return base.GetSelected(); } public override AccessibleObject HitTest (int x, int y) { return base.HitTest(x, y); } public override AccessibleObject Navigate( AccessibleNavigation navigationDirection) { return base.Navigate(navigationDirection); } } [ComVisible (true)] protected class DataGridViewTopRowAccessibleObject : AccessibleObject { #region Constructors public DataGridViewTopRowAccessibleObject () { } public DataGridViewTopRowAccessibleObject (DataGridView owner) { this.owner = owner; } #endregion #region Public Methods public override AccessibleObject GetChild (int index) { return base.GetChild (index); } public override int GetChildCount () { return base.GetChildCount (); } public override AccessibleObject Navigate (AccessibleNavigation navigationDirection) { return base.Navigate (navigationDirection); } #endregion #region Public Properties public override Rectangle Bounds { get { return base.Bounds; } } public override string Name { get { return base.Name; } } public DataGridView Owner { get { return (DataGridView)owner; } set { if (owner != null) throw new InvalidOperationException ("owner has already been set"); owner = value; } } public override AccessibleObject Parent { get { return base.Parent; } } public override AccessibleRole Role { get { return base.Role; } } public override string Value { get { return base.Value; } } #endregion } } } #endif