PageRenderTime 47ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 1ms

/mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridView.cs

https://bitbucket.org/danipen/mono
C# | 6814 lines | 5459 code | 1143 blank | 212 comment | 1513 complexity | 87251461e09094f579a0da9c80b4575a MD5 | raw file
Possible License(s): Unlicense, Apache-2.0, LGPL-2.0, MPL-2.0-no-copyleft-exception, CC-BY-SA-3.0, GPL-2.0
  1. // Permission is hereby granted, free of charge, to any person obtaining
  2. // a copy of this software and associated documentation files (the
  3. // "Software"), to deal in the Software without restriction, including
  4. // without limitation the rights to use, copy, modify, merge, publish,
  5. // distribute, sublicense, and/or sell copies of the Software, and to
  6. // permit persons to whom the Software is furnished to do so, subject to
  7. // the following conditions:
  8. //
  9. // The above copyright notice and this permission notice shall be
  10. // included in all copies or substantial portions of the Software.
  11. //
  12. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  13. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  14. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  15. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  16. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  17. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  18. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  19. //
  20. // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
  21. //
  22. // Author:
  23. // Pedro Martínez Juliá <pedromj@gmail.com>
  24. // Ivan N. Zlatev <contact@i-nz.net>
  25. //
  26. using System;
  27. using System.ComponentModel;
  28. using System.Runtime.InteropServices;
  29. using System.Drawing;
  30. using System.Reflection;
  31. using System.Collections;
  32. using System.Text;
  33. using System.Collections.Generic;
  34. namespace System.Windows.Forms {
  35. [ComVisibleAttribute(true)]
  36. [ClassInterfaceAttribute(ClassInterfaceType.AutoDispatch)]
  37. [Designer("System.Windows.Forms.Design.DataGridViewDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
  38. [Editor("System.Windows.Forms.Design.DataGridViewComponentEditor, " + Consts.AssemblySystem_Design, typeof (System.ComponentModel.ComponentEditor))]
  39. [ComplexBindingProperties ("DataSource", "DataMember")]
  40. [DefaultEvent ("CellContentClick")]
  41. [Docking (DockingBehavior.Ask)]
  42. public class DataGridView : Control, ISupportInitialize, IBindableComponent, IDropTarget
  43. {
  44. private DataGridViewAdvancedBorderStyle adjustedTopLeftHeaderBorderStyle;
  45. private DataGridViewAdvancedBorderStyle advancedCellBorderStyle;
  46. private DataGridViewAdvancedBorderStyle advancedColumnHeadersBorderStyle;
  47. private DataGridViewAdvancedBorderStyle advancedRowHeadersBorderStyle;
  48. private bool allowUserToAddRows;
  49. private bool allowUserToDeleteRows;
  50. private bool allowUserToOrderColumns;
  51. private bool allowUserToResizeColumns;
  52. private bool allowUserToResizeRows;
  53. private DataGridViewCellStyle alternatingRowsDefaultCellStyle;
  54. private Point anchor_cell;
  55. private bool autoGenerateColumns;
  56. private bool autoSize;
  57. private DataGridViewAutoSizeColumnsMode autoSizeColumnsMode;
  58. private DataGridViewAutoSizeRowsMode autoSizeRowsMode;
  59. private Color backColor;
  60. private Color backgroundColor;
  61. private Image backgroundImage;
  62. private BorderStyle borderStyle;
  63. private DataGridViewCellBorderStyle cellBorderStyle;
  64. private DataGridViewClipboardCopyMode clipboardCopyMode;
  65. private DataGridViewHeaderBorderStyle columnHeadersBorderStyle;
  66. private DataGridViewCellStyle columnHeadersDefaultCellStyle;
  67. private int columnHeadersHeight;
  68. private DataGridViewColumnHeadersHeightSizeMode columnHeadersHeightSizeMode;
  69. private bool columnHeadersVisible;
  70. private DataGridViewColumnCollection columns;
  71. private DataGridViewCell currentCell;
  72. private Point currentCellAddress;
  73. //private DataGridViewRow currentRow;
  74. private string dataMember;
  75. private object dataSource;
  76. private DataGridViewCellStyle defaultCellStyle;
  77. //private Control editingControl;
  78. private DataGridViewEditMode editMode;
  79. private bool enableHeadersVisualStyles = true;
  80. private DataGridViewCell firstDisplayedCell;
  81. private int firstDisplayedScrollingColumnHiddenWidth;
  82. private int firstDisplayedScrollingColumnIndex;
  83. private int firstDisplayedScrollingRowIndex;
  84. private Color gridColor = Color.FromKnownColor(KnownColor.ControlDark);
  85. private int horizontalScrollingOffset;
  86. private DataGridViewCell hover_cell = null;
  87. private bool isCurrentCellDirty;
  88. //private bool isCurrentRowDirty;
  89. private bool multiSelect;
  90. private bool readOnly;
  91. private DataGridViewHeaderBorderStyle rowHeadersBorderStyle;
  92. private DataGridViewCellStyle rowHeadersDefaultCellStyle;
  93. private bool rowHeadersVisible;
  94. private int rowHeadersWidth;
  95. private DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode;
  96. private DataGridViewRowCollection rows;
  97. private DataGridViewCellStyle rowsDefaultCellStyle;
  98. private DataGridViewRow rowTemplate;
  99. private ScrollBars scrollBars;
  100. private DataGridViewSelectionMode selectionMode;
  101. private bool showCellErrors;
  102. private bool showCellToolTips;
  103. private bool showEditingIcon;
  104. private bool showRowErrors;
  105. private DataGridViewColumn sortedColumn = null;
  106. private SortOrder sortOrder;
  107. private bool standardTab;
  108. private DataGridViewHeaderCell topLeftHeaderCell;
  109. private Cursor userSetCursor;
  110. private int verticalScrollingOffset;
  111. private bool virtualMode;
  112. private HScrollBar horizontalScrollBar;
  113. private VScrollBar verticalScrollBar;
  114. private Control editingControl;
  115. private bool is_autogenerating_columns = false;
  116. private bool is_binding = false;
  117. private bool new_row_editing = false;
  118. // These are used to implement selection behaviour with SHIFT pressed.
  119. private int selected_row = -1;
  120. private int selected_column = -1;
  121. // Stuff for error Tooltips
  122. private Timer tooltip_timer;
  123. private ToolTip tooltip_window;
  124. private DataGridViewCell tooltip_currently_showing;
  125. private DataGridViewSelectedRowCollection selected_rows;
  126. private DataGridViewSelectedColumnCollection selected_columns;
  127. private DataGridViewRow editing_row;
  128. DataGridViewHeaderCell pressed_header_cell;
  129. DataGridViewHeaderCell entered_header_cell;
  130. // For column/row resizing via mouse
  131. private bool column_resize_active = false;
  132. private bool row_resize_active = false;
  133. private int resize_band = -1;
  134. private int resize_band_start = 0;
  135. private int resize_band_delta = 0;
  136. public DataGridView ()
  137. {
  138. SetStyle (ControlStyles.Opaque, true);
  139. //SetStyle (ControlStyles.UserMouse, true);
  140. SetStyle (ControlStyles.OptimizedDoubleBuffer, true);
  141. adjustedTopLeftHeaderBorderStyle = new DataGridViewAdvancedBorderStyle();
  142. adjustedTopLeftHeaderBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
  143. advancedCellBorderStyle = new DataGridViewAdvancedBorderStyle();
  144. advancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
  145. advancedColumnHeadersBorderStyle = new DataGridViewAdvancedBorderStyle();
  146. advancedColumnHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
  147. advancedRowHeadersBorderStyle = new DataGridViewAdvancedBorderStyle();
  148. advancedRowHeadersBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single;
  149. alternatingRowsDefaultCellStyle = new DataGridViewCellStyle();
  150. allowUserToAddRows = true;
  151. allowUserToDeleteRows = true;
  152. allowUserToOrderColumns = false;
  153. allowUserToResizeColumns = true;
  154. allowUserToResizeRows = true;
  155. autoGenerateColumns = true;
  156. autoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
  157. autoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
  158. backColor = Control.DefaultBackColor;
  159. backgroundColor = SystemColors.AppWorkspace;
  160. borderStyle = BorderStyle.FixedSingle;
  161. cellBorderStyle = DataGridViewCellBorderStyle.Single;
  162. clipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithAutoHeaderText;
  163. columnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
  164. columnHeadersDefaultCellStyle = new DataGridViewCellStyle();
  165. columnHeadersDefaultCellStyle.BackColor = SystemColors.Control;
  166. columnHeadersDefaultCellStyle.ForeColor = SystemColors.WindowText;
  167. columnHeadersDefaultCellStyle.SelectionBackColor = SystemColors.Highlight;
  168. columnHeadersDefaultCellStyle.SelectionForeColor = SystemColors.HighlightText;
  169. columnHeadersDefaultCellStyle.Font = this.Font;
  170. columnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
  171. columnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.True;
  172. columnHeadersHeight = 23;
  173. columnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
  174. columnHeadersVisible = true;
  175. columns = CreateColumnsInstance();
  176. columns.CollectionChanged += OnColumnCollectionChanged;
  177. currentCellAddress = new Point (-1, -1);
  178. dataMember = String.Empty;
  179. defaultCellStyle = new DataGridViewCellStyle();
  180. defaultCellStyle.BackColor = SystemColors.Window;
  181. defaultCellStyle.ForeColor = SystemColors.ControlText;
  182. defaultCellStyle.SelectionBackColor = SystemColors.Highlight;
  183. defaultCellStyle.SelectionForeColor = SystemColors.HighlightText;
  184. defaultCellStyle.Font = this.Font;
  185. defaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
  186. defaultCellStyle.WrapMode = DataGridViewTriState.False;
  187. editMode = DataGridViewEditMode.EditOnKeystrokeOrF2;
  188. firstDisplayedScrollingColumnHiddenWidth = 0;
  189. isCurrentCellDirty = false;
  190. multiSelect = true;
  191. readOnly = false;
  192. rowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
  193. rowHeadersDefaultCellStyle = (DataGridViewCellStyle) columnHeadersDefaultCellStyle.Clone ();
  194. rowHeadersVisible = true;
  195. rowHeadersWidth = 41;
  196. rowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing;
  197. rows = CreateRowsInstance();
  198. rowsDefaultCellStyle = new DataGridViewCellStyle();
  199. selectionMode = DataGridViewSelectionMode.RowHeaderSelect;
  200. showCellErrors = true;
  201. showEditingIcon = true;
  202. scrollBars = ScrollBars.Both;
  203. userSetCursor = Cursor.Current;
  204. virtualMode = false;
  205. horizontalScrollBar = new HScrollBar();
  206. horizontalScrollBar.Scroll += OnHScrollBarScroll;
  207. horizontalScrollBar.Visible = false;
  208. verticalScrollBar = new VScrollBar();
  209. verticalScrollBar.Scroll += OnVScrollBarScroll;
  210. verticalScrollBar.Visible = false;
  211. Controls.AddRange (new Control[] {horizontalScrollBar, verticalScrollBar});
  212. }
  213. void ISupportInitialize.BeginInit ()
  214. {
  215. }
  216. void ISupportInitialize.EndInit ()
  217. {
  218. }
  219. // Propiedades
  220. [Browsable (false)]
  221. [EditorBrowsable (EditorBrowsableState.Advanced)]
  222. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  223. public virtual DataGridViewAdvancedBorderStyle AdjustedTopLeftHeaderBorderStyle {
  224. get { return adjustedTopLeftHeaderBorderStyle; }
  225. }
  226. [Browsable (false)]
  227. [EditorBrowsable (EditorBrowsableState.Advanced)]
  228. public DataGridViewAdvancedBorderStyle AdvancedCellBorderStyle {
  229. get { return advancedCellBorderStyle; }
  230. }
  231. [Browsable (false)]
  232. [EditorBrowsable (EditorBrowsableState.Advanced)]
  233. public DataGridViewAdvancedBorderStyle AdvancedColumnHeadersBorderStyle {
  234. get { return advancedColumnHeadersBorderStyle; }
  235. }
  236. [Browsable (false)]
  237. [EditorBrowsable (EditorBrowsableState.Advanced)]
  238. public DataGridViewAdvancedBorderStyle AdvancedRowHeadersBorderStyle {
  239. get { return advancedRowHeadersBorderStyle; }
  240. }
  241. [DefaultValue (true)]
  242. public bool AllowUserToAddRows {
  243. get {
  244. if (allowUserToAddRows && DataManager != null)
  245. return DataManager.AllowNew;
  246. return allowUserToAddRows;
  247. }
  248. set {
  249. if (allowUserToAddRows != value) {
  250. allowUserToAddRows = value;
  251. if (!value) {
  252. if (new_row_editing)
  253. CancelEdit ();
  254. RemoveEditingRow ();
  255. } else {
  256. PrepareEditingRow (false, false);
  257. }
  258. OnAllowUserToAddRowsChanged(EventArgs.Empty);
  259. Invalidate ();
  260. }
  261. }
  262. }
  263. [DefaultValue (true)]
  264. public bool AllowUserToDeleteRows {
  265. get {
  266. if (allowUserToDeleteRows && DataManager != null)
  267. return DataManager.AllowRemove;
  268. return allowUserToDeleteRows;
  269. }
  270. set {
  271. if (allowUserToDeleteRows != value) {
  272. allowUserToDeleteRows = value;
  273. OnAllowUserToDeleteRowsChanged(EventArgs.Empty);
  274. }
  275. }
  276. }
  277. [DefaultValue (false)]
  278. public bool AllowUserToOrderColumns {
  279. get { return allowUserToOrderColumns; }
  280. set {
  281. if (allowUserToOrderColumns != value) {
  282. allowUserToOrderColumns = value;
  283. OnAllowUserToOrderColumnsChanged(EventArgs.Empty);
  284. }
  285. }
  286. }
  287. [DefaultValue (true)]
  288. public bool AllowUserToResizeColumns {
  289. get { return allowUserToResizeColumns; }
  290. set {
  291. if (allowUserToResizeColumns != value) {
  292. allowUserToResizeColumns = value;
  293. OnAllowUserToResizeColumnsChanged(EventArgs.Empty);
  294. }
  295. }
  296. }
  297. [DefaultValue (true)]
  298. public bool AllowUserToResizeRows {
  299. get { return allowUserToResizeRows; }
  300. set {
  301. if (allowUserToResizeRows != value) {
  302. allowUserToResizeRows = value;
  303. OnAllowUserToResizeRowsChanged(EventArgs.Empty);
  304. }
  305. }
  306. }
  307. public DataGridViewCellStyle AlternatingRowsDefaultCellStyle {
  308. get { return alternatingRowsDefaultCellStyle; }
  309. set {
  310. if (alternatingRowsDefaultCellStyle != value) {
  311. alternatingRowsDefaultCellStyle = value;
  312. OnAlternatingRowsDefaultCellStyleChanged(EventArgs.Empty);
  313. Invalidate();
  314. }
  315. }
  316. }
  317. [Browsable (false)]
  318. [EditorBrowsable (EditorBrowsableState.Advanced)]
  319. [DefaultValue (true)]
  320. public bool AutoGenerateColumns {
  321. get { return autoGenerateColumns; }
  322. set {
  323. if (autoGenerateColumns != value) {
  324. autoGenerateColumns = value;
  325. OnAutoGenerateColumnsChanged(EventArgs.Empty);
  326. }
  327. }
  328. }
  329. public override bool AutoSize {
  330. get { return autoSize; }
  331. set {
  332. if (autoSize != value) {
  333. autoSize = value;
  334. //OnAutoSizeChanged(EventArgs.Empty);
  335. }
  336. }
  337. }
  338. [DefaultValue (DataGridViewAutoSizeColumnsMode.None)]
  339. public DataGridViewAutoSizeColumnsMode AutoSizeColumnsMode {
  340. get { return autoSizeColumnsMode; }
  341. set {
  342. if (!Enum.IsDefined(typeof(DataGridViewAutoSizeColumnsMode), value)) {
  343. throw new InvalidEnumArgumentException("Value is not valid DataGridViewAutoSizeColumnsMode.");
  344. }
  345. if (value == DataGridViewAutoSizeColumnsMode.ColumnHeader && columnHeadersVisible == false) {
  346. foreach (DataGridViewColumn col in columns) {
  347. if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet) {
  348. throw new InvalidOperationException("Cant set this property to ColumnHeader in this DataGridView.");
  349. }
  350. }
  351. }
  352. if (value == DataGridViewAutoSizeColumnsMode.Fill) {
  353. foreach (DataGridViewColumn col in columns) {
  354. if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.NotSet) {
  355. if (col.Frozen) {
  356. throw new InvalidOperationException("Cant set this property to Fill in this DataGridView.");
  357. }
  358. }
  359. }
  360. }
  361. autoSizeColumnsMode = value;
  362. AutoResizeColumns (value);
  363. Invalidate ();
  364. }
  365. }
  366. [DefaultValue (DataGridViewAutoSizeRowsMode.None)]
  367. public DataGridViewAutoSizeRowsMode AutoSizeRowsMode {
  368. get { return autoSizeRowsMode; }
  369. set {
  370. if (autoSizeRowsMode != value) {
  371. if (!Enum.IsDefined(typeof(DataGridViewAutoSizeRowsMode), value)) {
  372. throw new InvalidEnumArgumentException("Value is not valid DataGridViewRowsMode.");
  373. }
  374. if ((value == DataGridViewAutoSizeRowsMode.AllHeaders || value == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && rowHeadersVisible == false) {
  375. throw new InvalidOperationException("Cant set this property to AllHeaders or DisplayedHeaders in this DataGridView.");
  376. }
  377. autoSizeRowsMode = value;
  378. if (value == DataGridViewAutoSizeRowsMode.None)
  379. foreach (DataGridViewRow row in Rows)
  380. row.ResetToExplicitHeight ();
  381. else
  382. AutoResizeRows (value);
  383. OnAutoSizeRowsModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
  384. Invalidate ();
  385. ////////////////////////////////////////////////////////////////
  386. }
  387. }
  388. }
  389. [Browsable (false)]
  390. [EditorBrowsable (EditorBrowsableState.Never)]
  391. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  392. public override Color BackColor {
  393. get { return backColor; }
  394. set {
  395. if (backColor != value) {
  396. backColor = value;
  397. OnBackColorChanged(EventArgs.Empty);
  398. }
  399. }
  400. }
  401. public Color BackgroundColor {
  402. get { return backgroundColor; }
  403. set {
  404. if (backgroundColor != value) {
  405. if (value == Color.Empty) {
  406. throw new ArgumentException("Cant set an Empty color.");
  407. }
  408. backgroundColor = value;
  409. OnBackgroundColorChanged(EventArgs.Empty);
  410. }
  411. }
  412. }
  413. [Browsable (false)]
  414. [EditorBrowsable (EditorBrowsableState.Never)]
  415. public override Image BackgroundImage {
  416. get { return backgroundImage; }
  417. set {
  418. if (backgroundImage != value) {
  419. backgroundImage = value;
  420. OnBackgroundImageChanged(EventArgs.Empty);
  421. }
  422. }
  423. }
  424. [Browsable (false)]
  425. [EditorBrowsable (EditorBrowsableState.Never)]
  426. public override ImageLayout BackgroundImageLayout {
  427. get { return base.BackgroundImageLayout; }
  428. set { base.BackgroundImageLayout = value; }
  429. }
  430. [DefaultValue (BorderStyle.FixedSingle)]
  431. public BorderStyle BorderStyle {
  432. get { return borderStyle; }
  433. set {
  434. if (borderStyle != value) {
  435. if (!Enum.IsDefined(typeof(BorderStyle), value)) {
  436. throw new InvalidEnumArgumentException("Invalid border style.");
  437. }
  438. borderStyle = value;
  439. OnBorderStyleChanged(EventArgs.Empty);
  440. }
  441. }
  442. }
  443. internal int BorderWidth {
  444. get {
  445. switch (BorderStyle) {
  446. case BorderStyle.Fixed3D:
  447. return 2;
  448. case BorderStyle.FixedSingle:
  449. return 1;
  450. case BorderStyle.None:
  451. default:
  452. return 0;
  453. }
  454. }
  455. }
  456. [Browsable (true)]
  457. [DefaultValue (DataGridViewCellBorderStyle.Single)]
  458. public DataGridViewCellBorderStyle CellBorderStyle {
  459. get { return cellBorderStyle; }
  460. set {
  461. if (cellBorderStyle != value) {
  462. if (value == DataGridViewCellBorderStyle.Custom)
  463. throw new ArgumentException ("CellBorderStyle cannot be set to Custom.");
  464. cellBorderStyle = value;
  465. DataGridViewAdvancedBorderStyle border = new DataGridViewAdvancedBorderStyle ();
  466. switch (cellBorderStyle) {
  467. case DataGridViewCellBorderStyle.Single:
  468. border.All = DataGridViewAdvancedCellBorderStyle.Single;
  469. break;
  470. case DataGridViewCellBorderStyle.Raised:
  471. case DataGridViewCellBorderStyle.RaisedVertical:
  472. border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
  473. border.Top = DataGridViewAdvancedCellBorderStyle.None;
  474. border.Left = DataGridViewAdvancedCellBorderStyle.Outset;
  475. border.Right = DataGridViewAdvancedCellBorderStyle.Outset;
  476. break;
  477. case DataGridViewCellBorderStyle.Sunken:
  478. border.All = DataGridViewAdvancedCellBorderStyle.Inset;
  479. break;
  480. case DataGridViewCellBorderStyle.None:
  481. border.All = DataGridViewAdvancedCellBorderStyle.None;
  482. break;
  483. case DataGridViewCellBorderStyle.SingleVertical:
  484. border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
  485. border.Top = DataGridViewAdvancedCellBorderStyle.None;
  486. border.Left = DataGridViewAdvancedCellBorderStyle.None;
  487. border.Right = DataGridViewAdvancedCellBorderStyle.Single;
  488. break;
  489. case DataGridViewCellBorderStyle.SunkenVertical:
  490. border.Bottom = DataGridViewAdvancedCellBorderStyle.None;
  491. border.Top = DataGridViewAdvancedCellBorderStyle.None;
  492. border.Left = DataGridViewAdvancedCellBorderStyle.Inset;
  493. border.Right = DataGridViewAdvancedCellBorderStyle.Inset;
  494. break;
  495. case DataGridViewCellBorderStyle.SingleHorizontal:
  496. case DataGridViewCellBorderStyle.SunkenHorizontal:
  497. border.Bottom = DataGridViewAdvancedCellBorderStyle.Inset;
  498. border.Top = DataGridViewAdvancedCellBorderStyle.Inset;
  499. border.Left = DataGridViewAdvancedCellBorderStyle.None;
  500. border.Right = DataGridViewAdvancedCellBorderStyle.None;
  501. break;
  502. case DataGridViewCellBorderStyle.RaisedHorizontal:
  503. border.Bottom = DataGridViewAdvancedCellBorderStyle.Outset;
  504. border.Top = DataGridViewAdvancedCellBorderStyle.Outset;
  505. border.Left = DataGridViewAdvancedCellBorderStyle.None;
  506. border.Right = DataGridViewAdvancedCellBorderStyle.None;
  507. break;
  508. }
  509. advancedCellBorderStyle = border;
  510. OnCellBorderStyleChanged (EventArgs.Empty);
  511. }
  512. }
  513. }
  514. [Browsable (true)]
  515. [DefaultValue (DataGridViewClipboardCopyMode.EnableWithAutoHeaderText)]
  516. public DataGridViewClipboardCopyMode ClipboardCopyMode {
  517. get { return clipboardCopyMode; }
  518. set { clipboardCopyMode = value; }
  519. }
  520. [Browsable (false)]
  521. [EditorBrowsable (EditorBrowsableState.Advanced)]
  522. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  523. [DefaultValue (0)]
  524. public int ColumnCount {
  525. get { return columns.Count; }
  526. set {
  527. if (value < 0) {
  528. throw new ArgumentOutOfRangeException("ColumnCount",
  529. "ColumnCount must be >= 0.");
  530. }
  531. if (dataSource != null) {
  532. throw new InvalidOperationException("Cant change column count if DataSource is set.");
  533. }
  534. if (value < columns.Count) {
  535. for (int i = columns.Count -1; i >= value; i--) {
  536. columns.RemoveAt(i);
  537. }
  538. }
  539. else if (value > columns.Count) {
  540. for (int i = columns.Count; i < value; i++) {
  541. DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn ();
  542. columns.Add(col);
  543. }
  544. }
  545. }
  546. }
  547. [Browsable (true)]
  548. [DefaultValue (DataGridViewHeaderBorderStyle.Raised)]
  549. public DataGridViewHeaderBorderStyle ColumnHeadersBorderStyle {
  550. get { return columnHeadersBorderStyle; }
  551. set {
  552. if (columnHeadersBorderStyle != value) {
  553. columnHeadersBorderStyle = value;
  554. OnColumnHeadersBorderStyleChanged(EventArgs.Empty);
  555. }
  556. }
  557. }
  558. [AmbientValue (null)]
  559. public DataGridViewCellStyle ColumnHeadersDefaultCellStyle {
  560. get { return columnHeadersDefaultCellStyle; }
  561. set {
  562. if (columnHeadersDefaultCellStyle != value) {
  563. columnHeadersDefaultCellStyle = value;
  564. OnColumnHeadersDefaultCellStyleChanged(EventArgs.Empty);
  565. }
  566. }
  567. }
  568. [Localizable (true)]
  569. public int ColumnHeadersHeight {
  570. get { return columnHeadersHeight; }
  571. set {
  572. if (columnHeadersHeight != value) {
  573. if (value < 4) {
  574. throw new ArgumentOutOfRangeException("ColumnHeadersHeight",
  575. "Column headers height cant be less than 4.");
  576. }
  577. if (value > 32768 ) {
  578. throw new ArgumentOutOfRangeException("ColumnHeadersHeight",
  579. "Column headers height cannot be more than 32768.");
  580. }
  581. columnHeadersHeight = value;
  582. OnColumnHeadersHeightChanged(EventArgs.Empty);
  583. if (columnHeadersVisible)
  584. Invalidate ();
  585. }
  586. }
  587. }
  588. [RefreshProperties (RefreshProperties.All)]
  589. [DefaultValue (DataGridViewColumnHeadersHeightSizeMode.EnableResizing)]
  590. public DataGridViewColumnHeadersHeightSizeMode ColumnHeadersHeightSizeMode {
  591. get { return columnHeadersHeightSizeMode; }
  592. set {
  593. if (columnHeadersHeightSizeMode != value) {
  594. if (!Enum.IsDefined(typeof(DataGridViewColumnHeadersHeightSizeMode), value)) {
  595. throw new InvalidEnumArgumentException("Value is not a valid DataGridViewColumnHeadersHeightSizeMode.");
  596. }
  597. columnHeadersHeightSizeMode = value;
  598. OnColumnHeadersHeightSizeModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
  599. }
  600. }
  601. }
  602. [DefaultValue (true)]
  603. public bool ColumnHeadersVisible {
  604. get { return columnHeadersVisible; }
  605. set {
  606. if (columnHeadersVisible != value) {
  607. columnHeadersVisible = value;
  608. Invalidate ();
  609. }
  610. }
  611. }
  612. [MergableProperty (false)]
  613. [Editor ("System.Windows.Forms.Design.DataGridViewColumnCollectionEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
  614. [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
  615. public DataGridViewColumnCollection Columns {
  616. get { return columns; }
  617. }
  618. [Browsable (false)]
  619. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  620. public DataGridViewCell CurrentCell {
  621. get { return currentCell; }
  622. set {
  623. /////////////////////////////////////////////////////
  624. /// *** InvalidOperationException ***
  625. /// Changes to the specified cell cannot be committed
  626. /// to the data cache, or the new cell is in a hidden
  627. /// row.
  628. /////////////////////////////////////////////////////
  629. if (value == null)
  630. MoveCurrentCell (-1, -1, true, false, false, true);
  631. else if (value.DataGridView != this)
  632. throw new ArgumentException("The cell is not in this DataGridView.");
  633. else
  634. MoveCurrentCell (value.OwningColumn.Index, value.OwningRow.Index, true, false, false, true);
  635. }
  636. }
  637. [Browsable (false)]
  638. public Point CurrentCellAddress {
  639. get { return currentCellAddress; }
  640. }
  641. [Browsable (false)]
  642. public DataGridViewRow CurrentRow {
  643. get {
  644. if (currentCell != null)
  645. return currentCell.OwningRow;
  646. return null;
  647. }
  648. }
  649. [DefaultValue ("")]
  650. [Editor ("System.Windows.Forms.Design.DataMemberListEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
  651. public string DataMember {
  652. get { return dataMember; }
  653. set {
  654. if (dataMember != value) {
  655. dataMember = value;
  656. if (BindingContext != null)
  657. ReBind ();
  658. OnDataMemberChanged(EventArgs.Empty);
  659. }
  660. }
  661. }
  662. [RefreshProperties (RefreshProperties.Repaint)]
  663. [DefaultValue (null)]
  664. [AttributeProvider (typeof (IListSource))]
  665. public object DataSource {
  666. get { return dataSource; }
  667. set {
  668. /* 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:
  669. - the System.Collections.IList interface, including one-dimensional arrays.
  670. - the System.ComponentModel.IListSource interface, such as the System.Data.DataTable and System.Data.DataSet classes.
  671. - the System.ComponentModel.IBindingList interface, such as the System.ComponentModel.Collections.BindingList<> class.
  672. - the System.ComponentModel.IBindingListView interface, such as the System.Windows.Forms.BindingSource class.
  673. */
  674. if (!(value == null || value is IList || value is IListSource || value is IBindingList || value is IBindingListView))
  675. throw new NotSupportedException ("Type cannot be bound.");
  676. if (value != DataSource) {
  677. if (IsHandleCreated && value != null && BindingContext != null && BindingContext[value] != null)
  678. DataMember = String.Empty;
  679. ClearBinding ();
  680. // Do not set dataSource prior to the BindingContext check because there is some lazy initialization
  681. // code which might result in double call to ReBind here and in OnBindingContextChanged
  682. if (BindingContext != null) {
  683. dataSource = value;
  684. ReBind ();
  685. } else {
  686. dataSource = value;
  687. }
  688. OnDataSourceChanged (EventArgs.Empty);
  689. }
  690. }
  691. }
  692. internal CurrencyManager DataManager {
  693. get {
  694. if (DataSource != null && BindingContext != null) {
  695. string dataMember = DataMember;
  696. if (dataMember == null)
  697. dataMember = String.Empty;
  698. return (CurrencyManager) this.BindingContext[DataSource, dataMember];
  699. }
  700. return null;
  701. }
  702. }
  703. [AmbientValue (null)]
  704. public DataGridViewCellStyle DefaultCellStyle {
  705. get { return defaultCellStyle; }
  706. set {
  707. if (defaultCellStyle != value) {
  708. defaultCellStyle = value;
  709. OnDefaultCellStyleChanged(EventArgs.Empty);
  710. }
  711. }
  712. }
  713. public override Rectangle DisplayRectangle {
  714. get { return base.DisplayRectangle; }
  715. }
  716. [Browsable (false)]
  717. [EditorBrowsable (EditorBrowsableState.Advanced)]
  718. public Control EditingControl {
  719. get {
  720. return editingControl;
  721. }
  722. }
  723. [Browsable (false)]
  724. [EditorBrowsable (EditorBrowsableState.Advanced)]
  725. public Panel EditingPanel {
  726. get { throw new NotImplementedException(); }
  727. }
  728. [DefaultValue (DataGridViewEditMode.EditOnKeystrokeOrF2)]
  729. public DataGridViewEditMode EditMode {
  730. get { return editMode; }
  731. set {
  732. if (editMode != value) {
  733. editMode = value;
  734. OnEditModeChanged(EventArgs.Empty);
  735. }
  736. }
  737. }
  738. [DefaultValue (true)]
  739. public bool EnableHeadersVisualStyles {
  740. get { return enableHeadersVisualStyles; }
  741. set { enableHeadersVisualStyles = value; }
  742. }
  743. internal DataGridViewHeaderCell EnteredHeaderCell {
  744. get { return entered_header_cell; }
  745. set {
  746. if (entered_header_cell == value)
  747. return;
  748. if (ThemeEngine.Current.DataGridViewHeaderCellHasHotStyle (this)) {
  749. Region area_to_invalidate = new Region ();
  750. area_to_invalidate.MakeEmpty ();
  751. if (entered_header_cell != null)
  752. area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell));
  753. entered_header_cell = value;
  754. if (entered_header_cell != null)
  755. area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell));
  756. Invalidate (area_to_invalidate);
  757. area_to_invalidate.Dispose ();
  758. } else
  759. entered_header_cell = value;
  760. }
  761. }
  762. [Browsable (false)]
  763. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  764. public DataGridViewCell FirstDisplayedCell {
  765. get { return firstDisplayedCell; }
  766. set {
  767. if (value.DataGridView != this) {
  768. throw new ArgumentException("The cell is not in this DataGridView.");
  769. }
  770. firstDisplayedCell = value;
  771. }
  772. }
  773. [Browsable (false)]
  774. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  775. [EditorBrowsable (EditorBrowsableState.Advanced)]
  776. public int FirstDisplayedScrollingColumnHiddenWidth {
  777. get { return firstDisplayedScrollingColumnHiddenWidth; }
  778. }
  779. [Browsable (false)]
  780. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  781. public int FirstDisplayedScrollingColumnIndex {
  782. get { return firstDisplayedScrollingColumnIndex; }
  783. set { firstDisplayedScrollingColumnIndex = value; }
  784. }
  785. [Browsable (false)]
  786. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  787. public int FirstDisplayedScrollingRowIndex {
  788. get { return firstDisplayedScrollingRowIndex; }
  789. set { firstDisplayedScrollingRowIndex = value; }
  790. }
  791. [Browsable (false)]
  792. [EditorBrowsable (EditorBrowsableState.Advanced)]
  793. public override Font Font {
  794. get { return base.Font; }
  795. set { base.Font = value; }
  796. }
  797. [Browsable (false)]
  798. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  799. [EditorBrowsable (EditorBrowsableState.Advanced)]
  800. public override Color ForeColor {
  801. get { return base.ForeColor; }
  802. set { base.ForeColor = value; }
  803. }
  804. public Color GridColor {
  805. get { return gridColor; }
  806. set {
  807. if (gridColor != value) {
  808. if (value == Color.Empty) {
  809. throw new ArgumentException("Cant set an Empty color.");
  810. }
  811. gridColor = value;
  812. OnGridColorChanged(EventArgs.Empty);
  813. }
  814. }
  815. }
  816. [Browsable (false)]
  817. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  818. public int HorizontalScrollingOffset {
  819. get { return horizontalScrollingOffset; }
  820. set { horizontalScrollingOffset = value; }
  821. }
  822. [Browsable (false)]
  823. public bool IsCurrentCellDirty {
  824. get { return isCurrentCellDirty; }
  825. }
  826. [Browsable (false)]
  827. public bool IsCurrentCellInEditMode {
  828. get {
  829. if (currentCell == null) {
  830. return false;
  831. }
  832. return currentCell.IsInEditMode;
  833. }
  834. }
  835. [Browsable (false)]
  836. public bool IsCurrentRowDirty {
  837. get {
  838. if (!virtualMode)
  839. return IsCurrentCellDirty;
  840. QuestionEventArgs args = new QuestionEventArgs ();
  841. OnRowDirtyStateNeeded (args);
  842. return args.Response;
  843. }
  844. }
  845. [Browsable (false)]
  846. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  847. public DataGridViewCell this [int columnIndex, int rowIndex] {
  848. get { return rows[rowIndex].Cells[columnIndex]; }
  849. set { rows[rowIndex].Cells[columnIndex] = value; }
  850. }
  851. [Browsable (false)]
  852. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  853. public DataGridViewCell this [string columnName, int rowIndex] {
  854. get {
  855. int columnIndex = -1;
  856. foreach (DataGridViewColumn col in columns) {
  857. if (col.Name == columnName) {
  858. columnIndex = col.Index;
  859. break;
  860. }
  861. }
  862. return this[columnIndex, rowIndex];
  863. }
  864. set {
  865. int columnIndex = -1;
  866. foreach (DataGridViewColumn col in columns) {
  867. if (col.Name == columnName) {
  868. columnIndex = col.Index;
  869. break;
  870. }
  871. }
  872. this[columnIndex, rowIndex] = value;
  873. }
  874. }
  875. [DefaultValue (true)]
  876. public bool MultiSelect {
  877. get { return multiSelect; }
  878. set {
  879. if (multiSelect != value) {
  880. multiSelect = value;
  881. OnMultiSelectChanged(EventArgs.Empty);
  882. }
  883. }
  884. }
  885. [Browsable (false)]
  886. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  887. public int NewRowIndex {
  888. get {
  889. if (!AllowUserToAddRows || ColumnCount == 0) {
  890. return -1;
  891. }
  892. return rows.Count - 1;
  893. }
  894. }
  895. [Browsable (false)]
  896. [EditorBrowsable (EditorBrowsableState.Never)]
  897. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  898. public new Padding Padding {
  899. get { return Padding.Empty; }
  900. set { }
  901. }
  902. internal DataGridViewHeaderCell PressedHeaderCell {
  903. get { return pressed_header_cell; }
  904. }
  905. [Browsable (true)]
  906. [DefaultValue (false)]
  907. public bool ReadOnly {
  908. get { return readOnly; }
  909. set {
  910. if (readOnly != value) {
  911. readOnly = value;
  912. OnReadOnlyChanged(EventArgs.Empty);
  913. }
  914. }
  915. }
  916. [Browsable (false)]
  917. [EditorBrowsable (EditorBrowsableState.Advanced)]
  918. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  919. [DefaultValue (0)]
  920. public int RowCount {
  921. get { return rows.Count; }
  922. set {
  923. if (value < 0) {
  924. throw new ArgumentException("RowCount must be >= 0.");
  925. }
  926. if (value < 1 && AllowUserToAddRows) {
  927. throw new ArgumentException("RowCount must be >= 1 if AllowUserToAddRows is true.");
  928. }
  929. if (dataSource != null) {
  930. throw new InvalidOperationException("Cant change row count if DataSource is set.");
  931. }
  932. if (value < rows.Count) {
  933. int removeRangeEndIndex = rows.Count - 1;
  934. if (AllowUserToAddRows)
  935. removeRangeEndIndex--; // do not remove editing row
  936. int removeRangeStartIndex = value - 1;
  937. if (AllowUserToAddRows)
  938. removeRangeStartIndex--; // remove an extra row before/instead of the editing row
  939. for (int i = removeRangeEndIndex; i > removeRangeStartIndex; i--)
  940. rows.RemoveAt(i);
  941. } else if (value > rows.Count) {
  942. // If we need to add rows and don't have any columns,
  943. // we create one column
  944. if (ColumnCount == 0) {
  945. System.Diagnostics.Debug.Assert (rows.Count == 0);
  946. ColumnCount = 1; // this creates the edit row
  947. if (VirtualMode) {
  948. // update edit row height
  949. UpdateRowHeightInfo (0, false);
  950. }
  951. }
  952. List<DataGridViewRow> newRows = new List<DataGridViewRow> (value - rows.Count);
  953. for (int i = rows.Count; i < value; i++)
  954. newRows.Add ((DataGridViewRow) RowTemplateFull);
  955. rows.AddRange (newRows.ToArray());
  956. }
  957. }
  958. }
  959. [Browsable (true)]
  960. [DefaultValue (DataGridViewHeaderBorderStyle.Raised)]
  961. public DataGridViewHeaderBorderStyle RowHeadersBorderStyle {
  962. get { return rowHeadersBorderStyle; }
  963. set {
  964. if (rowHeadersBorderStyle != value) {
  965. rowHeadersBorderStyle = value;
  966. OnRowHeadersBorderStyleChanged(EventArgs.Empty);
  967. }
  968. }
  969. }
  970. [AmbientValue (null)]
  971. public DataGridViewCellStyle RowHeadersDefaultCellStyle {
  972. get { return rowHeadersDefaultCellStyle; }
  973. set {
  974. if (rowHeadersDefaultCellStyle != value) {
  975. rowHeadersDefaultCellStyle = value;
  976. OnRowHeadersDefaultCellStyleChanged(EventArgs.Empty);
  977. }
  978. }
  979. }
  980. [DefaultValue (true)]
  981. public bool RowHeadersVisible {
  982. get { return rowHeadersVisible; }
  983. set {
  984. if (rowHeadersVisible != value) {
  985. rowHeadersVisible = value;
  986. Invalidate ();
  987. }
  988. }
  989. }
  990. [Localizable (true)]
  991. public int RowHeadersWidth {
  992. get { return rowHeadersWidth; }
  993. set {
  994. if (rowHeadersWidth != value) {
  995. if (value < 4) {
  996. throw new ArgumentOutOfRangeException("RowHeadersWidth",
  997. "Row headers width cant be less than 4.");
  998. }
  999. if (value > 32768 ) {
  1000. throw new ArgumentOutOfRangeException("RowHeadersWidth",
  1001. "Row headers width cannot be more than 32768.");
  1002. }
  1003. rowHeadersWidth = value;
  1004. OnRowHeadersWidthChanged(EventArgs.Empty);
  1005. if (rowHeadersVisible)
  1006. Invalidate ();
  1007. }
  1008. }
  1009. }
  1010. [RefreshProperties (RefreshProperties.All)]
  1011. [DefaultValue (DataGridViewRowHeadersWidthSizeMode.EnableResizing)]
  1012. public DataGridViewRowHeadersWidthSizeMode RowHeadersWidthSizeMode {
  1013. get { return rowHeadersWidthSizeMode; }
  1014. set {
  1015. if (rowHeadersWidthSizeMode != value) {
  1016. if (!Enum.IsDefined(typeof(DataGridViewRowHeadersWidthSizeMode), value)) {
  1017. throw new InvalidEnumArgumentException("Value is not valid DataGridViewRowHeadersWidthSizeMode.");
  1018. }
  1019. rowHeadersWidthSizeMode = value;
  1020. OnRowHeadersWidthSizeModeChanged(new DataGridViewAutoSizeModeEventArgs(false));
  1021. }
  1022. }
  1023. }
  1024. [Browsable (false)]
  1025. public DataGridViewRowCollection Rows {
  1026. get { return rows; }
  1027. }
  1028. public DataGridViewCellStyle RowsDefaultCellStyle {
  1029. get { return rowsDefaultCellStyle; }
  1030. set {
  1031. if (rowsDefaultCellStyle != value) {
  1032. rowsDefaultCellStyle = value;
  1033. OnRowsDefaultCellStyleChanged(EventArgs.Empty);
  1034. }
  1035. }
  1036. }
  1037. // RowTemplate is just the row, it does not contain Cells
  1038. [Browsable (true)]
  1039. [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
  1040. public DataGridViewRow RowTemplate {
  1041. get {
  1042. if (rowTemplate == null)
  1043. rowTemplate = new DataGridViewRow ();
  1044. return rowTemplate;
  1045. }
  1046. set {
  1047. rowTemplate = value;
  1048. }
  1049. }
  1050. // Take the RowTemplate, clone it, and add Cells
  1051. // Note this is not stored, so you don't need to Clone it
  1052. internal DataGridViewRow RowTemplateFull {
  1053. get {
  1054. DataGridViewRow row = (DataGridViewRow) RowTemplate.Clone ();
  1055. for (int i = row.Cells.Count; i < Columns.Count; i++) {
  1056. DataGridViewCell template = columns [i].CellTemplate;
  1057. if (template == null)
  1058. throw new InvalidOperationException ("At least one of the DataGridView control's columns has no cell template.");
  1059. row.Cells.Add ((DataGridViewCell) template.Clone ());
  1060. }
  1061. return row;
  1062. }
  1063. }
  1064. internal override bool ScaleChildrenInternal {
  1065. get { return false; }
  1066. }
  1067. [DefaultValue (ScrollBars.Both)]
  1068. [Localizable (true)]
  1069. public ScrollBars ScrollBars {
  1070. get { return scrollBars; }
  1071. set {
  1072. if (!Enum.IsDefined(typeof(ScrollBars), value)) {
  1073. throw new InvalidEnumArgumentException("Invalid ScrollBars value.");
  1074. }
  1075. ////////////////////////////////////////////////////////////
  1076. /// *** InvalidOperationException ***
  1077. /// The System.Windows.Forms.DataGridView is unable to
  1078. /// scroll due to a cell change that cannot be committed
  1079. /// or canceled.
  1080. ///////////////////////////////////////////////////////////
  1081. scrollBars = value;
  1082. PerformLayout ();
  1083. Invalidate ();
  1084. }
  1085. }
  1086. [Browsable (false)]
  1087. public DataGridViewSelectedCellCollection SelectedCells {
  1088. get {
  1089. DataGridViewSelectedCellCollection selectedCells = new DataGridViewSelectedCellCollection();
  1090. foreach (DataGridViewRow row in rows) {
  1091. foreach (DataGridViewCell cell in row.Cells) {
  1092. if (cell.Selected) {
  1093. selectedCells.InternalAdd(cell);
  1094. }
  1095. }
  1096. }
  1097. return selectedCells;
  1098. }
  1099. }
  1100. [Browsable (false)]
  1101. public DataGridViewSelectedColumnCollection SelectedColumns {
  1102. get
  1103. {
  1104. DataGridViewSelectedColumnCollection result = new DataGridViewSelectedColumnCollection ();
  1105. if (selectionMode != DataGridViewSelectionMode.FullColumnSelect && selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect)
  1106. return result;
  1107. result.InternalAddRange (selected_columns);
  1108. return result;
  1109. }
  1110. }
  1111. [Browsable (false)]
  1112. public DataGridViewSelectedRowCollection SelectedRows {
  1113. get {
  1114. DataGridViewSelectedRowCollection result = new DataGridViewSelectedRowCollection (this);
  1115. if (selectionMode != DataGridViewSelectionMode.FullRowSelect && selectionMode != DataGridViewSelectionMode.RowHeaderSelect)
  1116. return result;
  1117. result.InternalAddRange (selected_rows);
  1118. return result;
  1119. }
  1120. }
  1121. [Browsable (true)]
  1122. [DefaultValue (DataGridViewSelectionMode.RowHeaderSelect)]
  1123. public DataGridViewSelectionMode SelectionMode {
  1124. get { return selectionMode; }
  1125. set {
  1126. if (!Enum.IsDefined (typeof(DataGridViewSelectionMode), value))
  1127. throw new InvalidEnumArgumentException ("Value is not valid DataGridViewSelectionMode.");
  1128. if (value == DataGridViewSelectionMode.ColumnHeaderSelect || value == DataGridViewSelectionMode.FullColumnSelect)
  1129. foreach (DataGridViewColumn col in Columns)
  1130. if (col.SortMode == DataGridViewColumnSortMode.Automatic)
  1131. throw new InvalidOperationException (string.Format ("Cannot set SelectionMode to {0} because there are Automatic sort columns.", value));
  1132. selectionMode = value;
  1133. }
  1134. }
  1135. [DefaultValue (true)]
  1136. public bool ShowCellErrors {
  1137. get { return showCellErrors; }
  1138. set { showCellErrors = value; }
  1139. }
  1140. [DefaultValue (true)]
  1141. public bool ShowCellToolTips {
  1142. get { return showCellToolTips; }
  1143. set { showCellToolTips = value; }
  1144. }
  1145. [DefaultValue (true)]
  1146. public bool ShowEditingIcon {
  1147. get { return showEditingIcon; }
  1148. set { showEditingIcon = value; }
  1149. }
  1150. [DefaultValue (true)]
  1151. public bool ShowRowErrors {
  1152. get { return showRowErrors; }
  1153. set { showRowErrors = value; }
  1154. }
  1155. [Browsable (false)]
  1156. public DataGridViewColumn SortedColumn {
  1157. get { return sortedColumn; }
  1158. }
  1159. [Browsable (false)]
  1160. public SortOrder SortOrder {
  1161. get { return sortOrder; }
  1162. }
  1163. [DefaultValue (false)]
  1164. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1165. public bool StandardTab {
  1166. get { return standardTab; }
  1167. set { standardTab = value; }
  1168. }
  1169. [Bindable (false)]
  1170. [Browsable (false)]
  1171. [EditorBrowsable (EditorBrowsableState.Never)]
  1172. public override string Text {
  1173. get { return base.Text; }
  1174. set { base.Text = value; }
  1175. }
  1176. [Browsable (false)]
  1177. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  1178. public DataGridViewHeaderCell TopLeftHeaderCell {
  1179. get {
  1180. if (topLeftHeaderCell == null) {
  1181. topLeftHeaderCell = new DataGridViewTopLeftHeaderCell ();
  1182. topLeftHeaderCell.SetDataGridView (this);
  1183. }
  1184. return topLeftHeaderCell;
  1185. }
  1186. set {
  1187. if (topLeftHeaderCell == value)
  1188. return;
  1189. if (topLeftHeaderCell != null)
  1190. topLeftHeaderCell.SetDataGridView (null);
  1191. topLeftHeaderCell = value;
  1192. if (topLeftHeaderCell != null)
  1193. topLeftHeaderCell.SetDataGridView (this);
  1194. }
  1195. }
  1196. [Browsable (false)]
  1197. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1198. public Cursor UserSetCursor {
  1199. get { return userSetCursor; }
  1200. }
  1201. [Browsable (false)]
  1202. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  1203. public int VerticalScrollingOffset {
  1204. get { return verticalScrollingOffset; }
  1205. }
  1206. [MonoTODO ("VirtualMode is not supported.")]
  1207. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1208. [DefaultValue (false)]
  1209. public bool VirtualMode {
  1210. get { return virtualMode; }
  1211. set { virtualMode = value; }
  1212. }
  1213. internal Control EditingControlInternal {
  1214. get {
  1215. return editingControl;
  1216. }
  1217. set {
  1218. if (value == editingControl)
  1219. return;
  1220. if (editingControl != null) {
  1221. // Can't use Controls.Remove (editingControls), because that method
  1222. // is overriden to not remove the editing control.
  1223. DataGridView.DataGridViewControlCollection ctrls = Controls as DataGridView.DataGridViewControlCollection;
  1224. if (ctrls != null) {
  1225. ctrls.RemoveInternal (editingControl);
  1226. } else {
  1227. Controls.Remove (editingControl);
  1228. }
  1229. editingControl.Dispose();
  1230. }
  1231. if (value != null) {
  1232. value.Visible = false;
  1233. Controls.Add (value);
  1234. }
  1235. editingControl = value;
  1236. }
  1237. }
  1238. static object AllowUserToAddRowsChangedEvent = new object ();
  1239. static object AllowUserToDeleteRowsChangedEvent = new object ();
  1240. static object AllowUserToOrderColumnsChangedEvent = new object ();
  1241. static object AllowUserToResizeColumnsChangedEvent = new object ();
  1242. static object AllowUserToResizeRowsChangedEvent = new object ();
  1243. static object AlternatingRowsDefaultCellStyleChangedEvent = new object ();
  1244. static object AutoGenerateColumnsChangedEvent = new object ();
  1245. static object AutoSizeColumnModeChangedEvent = new object ();
  1246. static object AutoSizeColumnsModeChangedEvent = new object ();
  1247. static object AutoSizeRowsModeChangedEvent = new object ();
  1248. static object BackgroundColorChangedEvent = new object ();
  1249. static object BorderStyleChangedEvent = new object ();
  1250. static object CancelRowEditEvent = new object ();
  1251. static object CellBeginEditEvent = new object ();
  1252. static object CellBorderStyleChangedEvent = new object ();
  1253. static object CellClickEvent = new object ();
  1254. static object CellContentClickEvent = new object ();
  1255. static object CellContentDoubleClickEvent = new object ();
  1256. static object CellContextMenuStripChangedEvent = new object ();
  1257. static object CellContextMenuStripNeededEvent = new object ();
  1258. static object CellDoubleClickEvent = new object ();
  1259. static object CellEndEditEvent = new object ();
  1260. static object CellEnterEvent = new object ();
  1261. static object CellErrorTextChangedEvent = new object ();
  1262. static object CellErrorTextNeededEvent = new object ();
  1263. static object CellFormattingEvent = new object ();
  1264. static object CellLeaveEvent = new object ();
  1265. static object CellMouseClickEvent = new object ();
  1266. static object CellMouseDoubleClickEvent = new object ();
  1267. static object CellMouseDownEvent = new object ();
  1268. static object CellMouseEnterEvent = new object ();
  1269. static object CellMouseLeaveEvent = new object ();
  1270. static object CellMouseMoveEvent = new object ();
  1271. static object CellMouseUpEvent = new object ();
  1272. static object CellPaintingEvent = new object ();
  1273. static object CellParsingEvent = new object ();
  1274. static object CellStateChangedEvent = new object ();
  1275. static object CellStyleChangedEvent = new object ();
  1276. static object CellStyleContentChangedEvent = new object ();
  1277. static object CellToolTipTextChangedEvent = new object ();
  1278. static object CellToolTipTextNeededEvent = new object ();
  1279. static object CellValidatedEvent = new object ();
  1280. static object CellValidatingEvent = new object ();
  1281. static object CellValueChangedEvent = new object ();
  1282. static object CellValueNeededEvent = new object ();
  1283. static object CellValuePushedEvent = new object ();
  1284. static object ColumnAddedEvent = new object ();
  1285. static object ColumnContextMenuStripChangedEvent = new object ();
  1286. static object ColumnDataPropertyNameChangedEvent = new object ();
  1287. static object ColumnDefaultCellStyleChangedEvent = new object ();
  1288. static object ColumnDisplayIndexChangedEvent = new object ();
  1289. static object ColumnDividerDoubleClickEvent = new object ();
  1290. static object ColumnDividerWidthChangedEvent = new object ();
  1291. static object ColumnHeaderCellChangedEvent = new object ();
  1292. static object ColumnHeaderMouseClickEvent = new object ();
  1293. static object ColumnHeaderMouseDoubleClickEvent = new object ();
  1294. static object ColumnHeadersBorderStyleChangedEvent = new object ();
  1295. static object ColumnHeadersDefaultCellStyleChangedEvent = new object ();
  1296. static object ColumnHeadersHeightChangedEvent = new object ();
  1297. static object ColumnHeadersHeightSizeModeChangedEvent = new object ();
  1298. static object ColumnMinimumWidthChangedEvent = new object ();
  1299. static object ColumnNameChangedEvent = new object ();
  1300. static object ColumnRemovedEvent = new object ();
  1301. static object ColumnSortModeChangedEvent = new object ();
  1302. static object ColumnStateChangedEvent = new object ();
  1303. static object ColumnToolTipTextChangedEvent = new object ();
  1304. static object ColumnWidthChangedEvent = new object ();
  1305. static object CurrentCellChangedEvent = new object ();
  1306. static object CurrentCellDirtyStateChangedEvent = new object ();
  1307. static object DataBindingCompleteEvent = new object ();
  1308. static object DataErrorEvent = new object ();
  1309. static object DataMemberChangedEvent = new object ();
  1310. static object DataSourceChangedEvent = new object ();
  1311. static object DefaultCellStyleChangedEvent = new object ();
  1312. static object DefaultValuesNeededEvent = new object ();
  1313. static object EditingControlShowingEvent = new object ();
  1314. static object EditModeChangedEvent = new object ();
  1315. static object GridColorChangedEvent = new object ();
  1316. static object MultiSelectChangedEvent = new object ();
  1317. static object NewRowNeededEvent = new object ();
  1318. static object ReadOnlyChangedEvent = new object ();
  1319. static object RowContextMenuStripChangedEvent = new object ();
  1320. static object RowContextMenuStripNeededEvent = new object ();
  1321. static object RowDefaultCellStyleChangedEvent = new object ();
  1322. static object RowDirtyStateNeededEvent = new object ();
  1323. static object RowDividerDoubleClickEvent = new object ();
  1324. static object RowDividerHeightChangedEvent = new object ();
  1325. static object RowEnterEvent = new object ();
  1326. static object RowErrorTextChangedEvent = new object ();
  1327. static object RowErrorTextNeededEvent = new object ();
  1328. static object RowHeaderCellChangedEvent = new object ();
  1329. static object RowHeaderMouseClickEvent = new object ();
  1330. static object RowHeaderMouseDoubleClickEvent = new object ();
  1331. static object RowHeadersBorderStyleChangedEvent = new object ();
  1332. static object RowHeadersDefaultCellStyleChangedEvent = new object ();
  1333. static object RowHeadersWidthChangedEvent = new object ();
  1334. static object RowHeadersWidthSizeModeChangedEvent = new object ();
  1335. static object RowHeightChangedEvent = new object ();
  1336. static object RowHeightInfoNeededEvent = new object ();
  1337. static object RowHeightInfoPushedEvent = new object ();
  1338. static object RowLeaveEvent = new object ();
  1339. static object RowMinimumHeightChangedEvent = new object ();
  1340. static object RowPostPaintEvent = new object ();
  1341. static object RowPrePaintEvent = new object ();
  1342. static object RowsAddedEvent = new object ();
  1343. static object RowsDefaultCellStyleChangedEvent = new object ();
  1344. static object RowsRemovedEvent = new object ();
  1345. static object RowStateChangedEvent = new object ();
  1346. static object RowUnsharedEvent = new object ();
  1347. static object RowValidatedEvent = new object ();
  1348. static object RowValidatingEvent = new object ();
  1349. static object ScrollEvent = new object ();
  1350. static object SelectionChangedEvent = new object ();
  1351. static object SortCompareEvent = new object ();
  1352. static object SortedEvent = new object ();
  1353. static object UserAddedRowEvent = new object ();
  1354. static object UserDeletedRowEvent = new object ();
  1355. static object UserDeletingRowEvent = new object ();
  1356. //
  1357. public event EventHandler AllowUserToAddRowsChanged {
  1358. add { Events.AddHandler (AllowUserToAddRowsChangedEvent, value); }
  1359. remove { Events.RemoveHandler (AllowUserToAddRowsChangedEvent, value); }
  1360. }
  1361. public event EventHandler AllowUserToDeleteRowsChanged {
  1362. add { Events.AddHandler (AllowUserToDeleteRowsChangedEvent, value); }
  1363. remove { Events.RemoveHandler (AllowUserToDeleteRowsChangedEvent, value); }
  1364. }
  1365. public event EventHandler AllowUserToOrderColumnsChanged {
  1366. add { Events.AddHandler (AllowUserToOrderColumnsChangedEvent, value); }
  1367. remove { Events.RemoveHandler (AllowUserToOrderColumnsChangedEvent, value); }
  1368. }
  1369. public event EventHandler AllowUserToResizeColumnsChanged {
  1370. add { Events.AddHandler (AllowUserToResizeColumnsChangedEvent, value); }
  1371. remove { Events.RemoveHandler (AllowUserToResizeColumnsChangedEvent, value); }
  1372. }
  1373. public event EventHandler AllowUserToResizeRowsChanged {
  1374. add { Events.AddHandler (AllowUserToResizeRowsChangedEvent, value); }
  1375. remove { Events.RemoveHandler (AllowUserToResizeRowsChangedEvent, value); }
  1376. }
  1377. public event EventHandler AlternatingRowsDefaultCellStyleChanged {
  1378. add { Events.AddHandler (AlternatingRowsDefaultCellStyleChangedEvent, value); }
  1379. remove { Events.RemoveHandler (AlternatingRowsDefaultCellStyleChangedEvent, value); }
  1380. }
  1381. [Browsable (false)]
  1382. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1383. public event EventHandler AutoGenerateColumnsChanged {
  1384. add { Events.AddHandler (AutoGenerateColumnsChangedEvent, value); }
  1385. remove { Events.RemoveHandler (AutoGenerateColumnsChangedEvent, value); }
  1386. }
  1387. public event DataGridViewAutoSizeColumnModeEventHandler AutoSizeColumnModeChanged {
  1388. add { Events.AddHandler (AutoSizeColumnModeChangedEvent, value); }
  1389. remove { Events.RemoveHandler (AutoSizeColumnModeChangedEvent, value); }
  1390. }
  1391. public event DataGridViewAutoSizeColumnsModeEventHandler AutoSizeColumnsModeChanged {
  1392. add { Events.AddHandler (AutoSizeColumnsModeChangedEvent, value); }
  1393. remove { Events.RemoveHandler (AutoSizeColumnsModeChangedEvent, value); }
  1394. }
  1395. public event DataGridViewAutoSizeModeEventHandler AutoSizeRowsModeChanged {
  1396. add { Events.AddHandler (AutoSizeRowsModeChangedEvent, value); }
  1397. remove { Events.RemoveHandler (AutoSizeRowsModeChangedEvent, value); }
  1398. }
  1399. [Browsable (false)]
  1400. [EditorBrowsable (EditorBrowsableState.Never)]
  1401. public new event EventHandler BackColorChanged {
  1402. add { base.BackColorChanged += value; }
  1403. remove { base.BackColorChanged -= value; }
  1404. }
  1405. public event EventHandler BackgroundColorChanged {
  1406. add { Events.AddHandler (BackgroundColorChangedEvent, value); }
  1407. remove { Events.RemoveHandler (BackgroundColorChangedEvent, value); }
  1408. }
  1409. [Browsable (false)]
  1410. [EditorBrowsable (EditorBrowsableState.Never)]
  1411. public new event EventHandler BackgroundImageChanged {
  1412. add { base.BackgroundImageChanged += value; }
  1413. remove { base.BackgroundImageChanged -= value; }
  1414. }
  1415. [Browsable (false)]
  1416. [EditorBrowsable (EditorBrowsableState.Never)]
  1417. public new event EventHandler BackgroundImageLayoutChanged {
  1418. add { base.BackgroundImageLayoutChanged += value; }
  1419. remove { base.BackgroundImageLayoutChanged -= value; }
  1420. }
  1421. public event EventHandler BorderStyleChanged {
  1422. add { Events.AddHandler (BorderStyleChangedEvent, value); }
  1423. remove { Events.RemoveHandler (BorderStyleChangedEvent, value); }
  1424. }
  1425. public event QuestionEventHandler CancelRowEdit {
  1426. add { Events.AddHandler (CancelRowEditEvent, value); }
  1427. remove { Events.RemoveHandler (CancelRowEditEvent, value); }
  1428. }
  1429. public event DataGridViewCellCancelEventHandler CellBeginEdit {
  1430. add { Events.AddHandler (CellBeginEditEvent, value); }
  1431. remove { Events.RemoveHandler (CellBeginEditEvent, value); }
  1432. }
  1433. public event EventHandler CellBorderStyleChanged {
  1434. add { Events.AddHandler (CellBorderStyleChangedEvent, value); }
  1435. remove { Events.RemoveHandler (CellBorderStyleChangedEvent, value); }
  1436. }
  1437. public event DataGridViewCellEventHandler CellClick {
  1438. add { Events.AddHandler (CellClickEvent, value); }
  1439. remove { Events.RemoveHandler (CellClickEvent, value); }
  1440. }
  1441. public event DataGridViewCellEventHandler CellContentClick {
  1442. add { Events.AddHandler (CellContentClickEvent, value); }
  1443. remove { Events.RemoveHandler (CellContentClickEvent, value); }
  1444. }
  1445. public event DataGridViewCellEventHandler CellContentDoubleClick {
  1446. add { Events.AddHandler (CellContentDoubleClickEvent, value); }
  1447. remove { Events.RemoveHandler (CellContentDoubleClickEvent, value); }
  1448. }
  1449. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1450. public event DataGridViewCellEventHandler CellContextMenuStripChanged {
  1451. add { Events.AddHandler (CellContextMenuStripChangedEvent, value); }
  1452. remove { Events.RemoveHandler (CellContextMenuStripChangedEvent, value); }
  1453. }
  1454. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1455. public event DataGridViewCellContextMenuStripNeededEventHandler CellContextMenuStripNeeded {
  1456. add { Events.AddHandler (CellContextMenuStripNeededEvent, value); }
  1457. remove { Events.RemoveHandler (CellContextMenuStripNeededEvent, value); }
  1458. }
  1459. public event DataGridViewCellEventHandler CellDoubleClick {
  1460. add { Events.AddHandler (CellDoubleClickEvent, value); }
  1461. remove { Events.RemoveHandler (CellDoubleClickEvent, value); }
  1462. }
  1463. public event DataGridViewCellEventHandler CellEndEdit {
  1464. add { Events.AddHandler (CellEndEditEvent, value); }
  1465. remove { Events.RemoveHandler (CellEndEditEvent, value); }
  1466. }
  1467. public event DataGridViewCellEventHandler CellEnter {
  1468. add { Events.AddHandler (CellEnterEvent, value); }
  1469. remove { Events.RemoveHandler (CellEnterEvent, value); }
  1470. }
  1471. public event DataGridViewCellEventHandler CellErrorTextChanged {
  1472. add { Events.AddHandler (CellErrorTextChangedEvent, value); }
  1473. remove { Events.RemoveHandler (CellErrorTextChangedEvent, value); }
  1474. }
  1475. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1476. public event DataGridViewCellErrorTextNeededEventHandler CellErrorTextNeeded {
  1477. add { Events.AddHandler (CellErrorTextNeededEvent, value); }
  1478. remove { Events.RemoveHandler (CellErrorTextNeededEvent, value); }
  1479. }
  1480. public event DataGridViewCellFormattingEventHandler CellFormatting {
  1481. add { Events.AddHandler (CellFormattingEvent, value); }
  1482. remove { Events.RemoveHandler (CellFormattingEvent, value); }
  1483. }
  1484. public event DataGridViewCellEventHandler CellLeave {
  1485. add { Events.AddHandler (CellLeaveEvent, value); }
  1486. remove { Events.RemoveHandler (CellLeaveEvent, value); }
  1487. }
  1488. public event DataGridViewCellMouseEventHandler CellMouseClick {
  1489. add { Events.AddHandler (CellMouseClickEvent, value); }
  1490. remove { Events.RemoveHandler (CellMouseClickEvent, value); }
  1491. }
  1492. public event DataGridViewCellMouseEventHandler CellMouseDoubleClick {
  1493. add { Events.AddHandler (CellMouseDoubleClickEvent, value); }
  1494. remove { Events.RemoveHandler (CellMouseDoubleClickEvent, value); }
  1495. }
  1496. public event DataGridViewCellMouseEventHandler CellMouseDown {
  1497. add { Events.AddHandler (CellMouseDownEvent, value); }
  1498. remove { Events.RemoveHandler (CellMouseDownEvent, value); }
  1499. }
  1500. public event DataGridViewCellEventHandler CellMouseEnter {
  1501. add { Events.AddHandler (CellMouseEnterEvent, value); }
  1502. remove { Events.RemoveHandler (CellMouseEnterEvent, value); }
  1503. }
  1504. public event DataGridViewCellEventHandler CellMouseLeave {
  1505. add { Events.AddHandler (CellMouseLeaveEvent, value); }
  1506. remove { Events.RemoveHandler (CellMouseLeaveEvent, value); }
  1507. }
  1508. public event DataGridViewCellMouseEventHandler CellMouseMove {
  1509. add { Events.AddHandler (CellMouseMoveEvent, value); }
  1510. remove { Events.RemoveHandler (CellMouseMoveEvent, value); }
  1511. }
  1512. public event DataGridViewCellMouseEventHandler CellMouseUp {
  1513. add { Events.AddHandler (CellMouseUpEvent, value); }
  1514. remove { Events.RemoveHandler (CellMouseUpEvent, value); }
  1515. }
  1516. public event DataGridViewCellPaintingEventHandler CellPainting {
  1517. add { Events.AddHandler (CellPaintingEvent, value); }
  1518. remove { Events.RemoveHandler (CellPaintingEvent, value); }
  1519. }
  1520. public event DataGridViewCellParsingEventHandler CellParsing {
  1521. add { Events.AddHandler (CellParsingEvent, value); }
  1522. remove { Events.RemoveHandler (CellParsingEvent, value); }
  1523. }
  1524. public event DataGridViewCellStateChangedEventHandler CellStateChanged {
  1525. add { Events.AddHandler (CellStateChangedEvent, value); }
  1526. remove { Events.RemoveHandler (CellStateChangedEvent, value); }
  1527. }
  1528. public event DataGridViewCellEventHandler CellStyleChanged {
  1529. add { Events.AddHandler (CellStyleChangedEvent, value); }
  1530. remove { Events.RemoveHandler (CellStyleChangedEvent, value); }
  1531. }
  1532. public event DataGridViewCellStyleContentChangedEventHandler CellStyleContentChanged {
  1533. add { Events.AddHandler (CellStyleContentChangedEvent, value); }
  1534. remove { Events.RemoveHandler (CellStyleContentChangedEvent, value); }
  1535. }
  1536. public event DataGridViewCellEventHandler CellToolTipTextChanged {
  1537. add { Events.AddHandler (CellToolTipTextChangedEvent, value); }
  1538. remove { Events.RemoveHandler (CellToolTipTextChangedEvent, value); }
  1539. }
  1540. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1541. public event DataGridViewCellToolTipTextNeededEventHandler CellToolTipTextNeeded {
  1542. add { Events.AddHandler (CellToolTipTextNeededEvent, value); }
  1543. remove { Events.RemoveHandler (CellToolTipTextNeededEvent, value); }
  1544. }
  1545. public event DataGridViewCellEventHandler CellValidated {
  1546. add { Events.AddHandler (CellValidatedEvent, value); }
  1547. remove { Events.RemoveHandler (CellValidatedEvent, value); }
  1548. }
  1549. public event DataGridViewCellValidatingEventHandler CellValidating {
  1550. add { Events.AddHandler (CellValidatingEvent, value); }
  1551. remove { Events.RemoveHandler (CellValidatingEvent, value); }
  1552. }
  1553. public event DataGridViewCellEventHandler CellValueChanged {
  1554. add { Events.AddHandler (CellValueChangedEvent, value); }
  1555. remove { Events.RemoveHandler (CellValueChangedEvent, value); }
  1556. }
  1557. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1558. public event DataGridViewCellValueEventHandler CellValueNeeded {
  1559. add { Events.AddHandler (CellValueNeededEvent, value); }
  1560. remove { Events.RemoveHandler (CellValueNeededEvent, value); }
  1561. }
  1562. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1563. public event DataGridViewCellValueEventHandler CellValuePushed {
  1564. add { Events.AddHandler (CellValuePushedEvent, value); }
  1565. remove { Events.RemoveHandler (CellValuePushedEvent, value); }
  1566. }
  1567. public event DataGridViewColumnEventHandler ColumnAdded {
  1568. add { Events.AddHandler (ColumnAddedEvent, value); }
  1569. remove { Events.RemoveHandler (ColumnAddedEvent, value); }
  1570. }
  1571. public event DataGridViewColumnEventHandler ColumnContextMenuStripChanged {
  1572. add { Events.AddHandler (ColumnContextMenuStripChangedEvent, value); }
  1573. remove { Events.RemoveHandler (ColumnContextMenuStripChangedEvent, value); }
  1574. }
  1575. public event DataGridViewColumnEventHandler ColumnDataPropertyNameChanged {
  1576. add { Events.AddHandler (ColumnDataPropertyNameChangedEvent, value); }
  1577. remove { Events.RemoveHandler (ColumnDataPropertyNameChangedEvent, value); }
  1578. }
  1579. public event DataGridViewColumnEventHandler ColumnDefaultCellStyleChanged {
  1580. add { Events.AddHandler (ColumnDefaultCellStyleChangedEvent, value); }
  1581. remove { Events.RemoveHandler (ColumnDefaultCellStyleChangedEvent, value); }
  1582. }
  1583. public event DataGridViewColumnEventHandler ColumnDisplayIndexChanged {
  1584. add { Events.AddHandler (ColumnDisplayIndexChangedEvent, value); }
  1585. remove { Events.RemoveHandler (ColumnDisplayIndexChangedEvent, value); }
  1586. }
  1587. public event DataGridViewColumnDividerDoubleClickEventHandler ColumnDividerDoubleClick {
  1588. add { Events.AddHandler (ColumnDividerDoubleClickEvent, value); }
  1589. remove { Events.RemoveHandler (ColumnDividerDoubleClickEvent, value); }
  1590. }
  1591. public event DataGridViewColumnEventHandler ColumnDividerWidthChanged {
  1592. add { Events.AddHandler (ColumnDividerWidthChangedEvent, value); }
  1593. remove { Events.RemoveHandler (ColumnDividerWidthChangedEvent, value); }
  1594. }
  1595. public event DataGridViewColumnEventHandler ColumnHeaderCellChanged {
  1596. add { Events.AddHandler (ColumnHeaderCellChangedEvent, value); }
  1597. remove { Events.RemoveHandler (ColumnHeaderCellChangedEvent, value); }
  1598. }
  1599. public event DataGridViewCellMouseEventHandler ColumnHeaderMouseClick {
  1600. add { Events.AddHandler (ColumnHeaderMouseClickEvent, value); }
  1601. remove { Events.RemoveHandler (ColumnHeaderMouseClickEvent, value); }
  1602. }
  1603. public event DataGridViewCellMouseEventHandler ColumnHeaderMouseDoubleClick {
  1604. add { Events.AddHandler (ColumnHeaderMouseDoubleClickEvent, value); }
  1605. remove { Events.RemoveHandler (ColumnHeaderMouseDoubleClickEvent, value); }
  1606. }
  1607. public event EventHandler ColumnHeadersBorderStyleChanged {
  1608. add { Events.AddHandler (ColumnHeadersBorderStyleChangedEvent, value); }
  1609. remove { Events.RemoveHandler (ColumnHeadersBorderStyleChangedEvent, value); }
  1610. }
  1611. public event EventHandler ColumnHeadersDefaultCellStyleChanged {
  1612. add { Events.AddHandler (ColumnHeadersDefaultCellStyleChangedEvent, value); }
  1613. remove { Events.RemoveHandler (ColumnHeadersDefaultCellStyleChangedEvent, value); }
  1614. }
  1615. public event EventHandler ColumnHeadersHeightChanged {
  1616. add { Events.AddHandler (ColumnHeadersHeightChangedEvent, value); }
  1617. remove { Events.RemoveHandler (ColumnHeadersHeightChangedEvent, value); }
  1618. }
  1619. public event DataGridViewAutoSizeModeEventHandler ColumnHeadersHeightSizeModeChanged {
  1620. add { Events.AddHandler (ColumnHeadersHeightSizeModeChangedEvent, value); }
  1621. remove { Events.RemoveHandler (ColumnHeadersHeightSizeModeChangedEvent, value); }
  1622. }
  1623. public event DataGridViewColumnEventHandler ColumnMinimumWidthChanged {
  1624. add { Events.AddHandler (ColumnMinimumWidthChangedEvent, value); }
  1625. remove { Events.RemoveHandler (ColumnMinimumWidthChangedEvent, value); }
  1626. }
  1627. public event DataGridViewColumnEventHandler ColumnNameChanged {
  1628. add { Events.AddHandler (ColumnNameChangedEvent, value); }
  1629. remove { Events.RemoveHandler (ColumnNameChangedEvent, value); }
  1630. }
  1631. public event DataGridViewColumnEventHandler ColumnRemoved {
  1632. add { Events.AddHandler (ColumnRemovedEvent, value); }
  1633. remove { Events.RemoveHandler (ColumnRemovedEvent, value); }
  1634. }
  1635. public event DataGridViewColumnEventHandler ColumnSortModeChanged {
  1636. add { Events.AddHandler (ColumnSortModeChangedEvent, value); }
  1637. remove { Events.RemoveHandler (ColumnSortModeChangedEvent, value); }
  1638. }
  1639. public event DataGridViewColumnStateChangedEventHandler ColumnStateChanged {
  1640. add { Events.AddHandler (ColumnStateChangedEvent, value); }
  1641. remove { Events.RemoveHandler (ColumnStateChangedEvent, value); }
  1642. }
  1643. public event DataGridViewColumnEventHandler ColumnToolTipTextChanged {
  1644. add { Events.AddHandler (ColumnToolTipTextChangedEvent, value); }
  1645. remove { Events.RemoveHandler (ColumnToolTipTextChangedEvent, value); }
  1646. }
  1647. public event DataGridViewColumnEventHandler ColumnWidthChanged {
  1648. add { Events.AddHandler (ColumnWidthChangedEvent, value); }
  1649. remove { Events.RemoveHandler (ColumnWidthChangedEvent, value); }
  1650. }
  1651. public event EventHandler CurrentCellChanged {
  1652. add { Events.AddHandler (CurrentCellChangedEvent, value); }
  1653. remove { Events.RemoveHandler (CurrentCellChangedEvent, value); }
  1654. }
  1655. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1656. public event EventHandler CurrentCellDirtyStateChanged {
  1657. add { Events.AddHandler (CurrentCellDirtyStateChangedEvent, value); }
  1658. remove { Events.RemoveHandler (CurrentCellDirtyStateChangedEvent, value); }
  1659. }
  1660. public event DataGridViewBindingCompleteEventHandler DataBindingComplete {
  1661. add { Events.AddHandler (DataBindingCompleteEvent, value); }
  1662. remove { Events.RemoveHandler (DataBindingCompleteEvent, value); }
  1663. }
  1664. public event DataGridViewDataErrorEventHandler DataError {
  1665. add { Events.AddHandler (DataErrorEvent, value); }
  1666. remove { Events.RemoveHandler (DataErrorEvent, value); }
  1667. }
  1668. public event EventHandler DataMemberChanged {
  1669. add { Events.AddHandler (DataMemberChangedEvent, value); }
  1670. remove { Events.RemoveHandler (DataMemberChangedEvent, value); }
  1671. }
  1672. public event EventHandler DataSourceChanged {
  1673. add { Events.AddHandler (DataSourceChangedEvent, value); }
  1674. remove { Events.RemoveHandler (DataSourceChangedEvent, value); }
  1675. }
  1676. public event EventHandler DefaultCellStyleChanged {
  1677. add { Events.AddHandler (DefaultCellStyleChangedEvent, value); }
  1678. remove { Events.RemoveHandler (DefaultCellStyleChangedEvent, value); }
  1679. }
  1680. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1681. public event DataGridViewRowEventHandler DefaultValuesNeeded {
  1682. add { Events.AddHandler (DefaultValuesNeededEvent, value); }
  1683. remove { Events.RemoveHandler (DefaultValuesNeededEvent, value); }
  1684. }
  1685. public event DataGridViewEditingControlShowingEventHandler EditingControlShowing {
  1686. add { Events.AddHandler (EditingControlShowingEvent, value); }
  1687. remove { Events.RemoveHandler (EditingControlShowingEvent, value); }
  1688. }
  1689. public event EventHandler EditModeChanged {
  1690. add { Events.AddHandler (EditModeChangedEvent, value); }
  1691. remove { Events.RemoveHandler (EditModeChangedEvent, value); }
  1692. }
  1693. [Browsable (false)]
  1694. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1695. public new event EventHandler FontChanged {
  1696. add { base.FontChanged += value; }
  1697. remove { base.FontChanged -= value; }
  1698. }
  1699. [Browsable (false)]
  1700. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1701. public new event EventHandler ForeColorChanged {
  1702. add { base.ForeColorChanged += value; }
  1703. remove { base.ForeColorChanged -= value; }
  1704. }
  1705. [Browsable (false)]
  1706. [EditorBrowsable (EditorBrowsableState.Never)]
  1707. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  1708. public new event EventHandler PaddingChanged {
  1709. add { base.PaddingChanged += value; }
  1710. remove { base.PaddingChanged -= value; }
  1711. }
  1712. public event EventHandler GridColorChanged {
  1713. add { Events.AddHandler (GridColorChangedEvent, value); }
  1714. remove { Events.RemoveHandler (GridColorChangedEvent, value); }
  1715. }
  1716. public event EventHandler MultiSelectChanged {
  1717. add { Events.AddHandler (MultiSelectChangedEvent, value); }
  1718. remove { Events.RemoveHandler (MultiSelectChangedEvent, value); }
  1719. }
  1720. public event DataGridViewRowEventHandler NewRowNeeded {
  1721. add { Events.AddHandler (NewRowNeededEvent, value); }
  1722. remove { Events.RemoveHandler (NewRowNeededEvent, value); }
  1723. }
  1724. public event EventHandler ReadOnlyChanged {
  1725. add { Events.AddHandler (ReadOnlyChangedEvent, value); }
  1726. remove { Events.RemoveHandler (ReadOnlyChangedEvent, value); }
  1727. }
  1728. public event DataGridViewRowEventHandler RowContextMenuStripChanged {
  1729. add { Events.AddHandler (RowContextMenuStripChangedEvent, value); }
  1730. remove { Events.RemoveHandler (RowContextMenuStripChangedEvent, value); }
  1731. }
  1732. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1733. public event DataGridViewRowContextMenuStripNeededEventHandler RowContextMenuStripNeeded {
  1734. add { Events.AddHandler (RowContextMenuStripNeededEvent, value); }
  1735. remove { Events.RemoveHandler (RowContextMenuStripNeededEvent, value); }
  1736. }
  1737. public event DataGridViewRowEventHandler RowDefaultCellStyleChanged {
  1738. add { Events.AddHandler (RowDefaultCellStyleChangedEvent, value); }
  1739. remove { Events.RemoveHandler (RowDefaultCellStyleChangedEvent, value); }
  1740. }
  1741. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1742. public event QuestionEventHandler RowDirtyStateNeeded {
  1743. add { Events.AddHandler (RowDirtyStateNeededEvent, value); }
  1744. remove { Events.RemoveHandler (RowDirtyStateNeededEvent, value); }
  1745. }
  1746. public event DataGridViewRowDividerDoubleClickEventHandler RowDividerDoubleClick {
  1747. add { Events.AddHandler (RowDividerDoubleClickEvent, value); }
  1748. remove { Events.RemoveHandler (RowDividerDoubleClickEvent, value); }
  1749. }
  1750. public event DataGridViewRowEventHandler RowDividerHeightChanged {
  1751. add { Events.AddHandler (RowDividerHeightChangedEvent, value); }
  1752. remove { Events.RemoveHandler (RowDividerHeightChangedEvent, value); }
  1753. }
  1754. public event DataGridViewCellEventHandler RowEnter {
  1755. add { Events.AddHandler (RowEnterEvent, value); }
  1756. remove { Events.RemoveHandler (RowEnterEvent, value); }
  1757. }
  1758. public event DataGridViewRowEventHandler RowErrorTextChanged {
  1759. add { Events.AddHandler (RowErrorTextChangedEvent, value); }
  1760. remove { Events.RemoveHandler (RowErrorTextChangedEvent, value); }
  1761. }
  1762. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1763. public event DataGridViewRowErrorTextNeededEventHandler RowErrorTextNeeded {
  1764. add { Events.AddHandler (RowErrorTextNeededEvent, value); }
  1765. remove { Events.RemoveHandler (RowErrorTextNeededEvent, value); }
  1766. }
  1767. public event DataGridViewRowEventHandler RowHeaderCellChanged {
  1768. add { Events.AddHandler (RowHeaderCellChangedEvent, value); }
  1769. remove { Events.RemoveHandler (RowHeaderCellChangedEvent, value); }
  1770. }
  1771. public event DataGridViewCellMouseEventHandler RowHeaderMouseClick {
  1772. add { Events.AddHandler (RowHeaderMouseClickEvent, value); }
  1773. remove { Events.RemoveHandler (RowHeaderMouseClickEvent, value); }
  1774. }
  1775. public event DataGridViewCellMouseEventHandler RowHeaderMouseDoubleClick {
  1776. add { Events.AddHandler (RowHeaderMouseDoubleClickEvent, value); }
  1777. remove { Events.RemoveHandler (RowHeaderMouseDoubleClickEvent, value); }
  1778. }
  1779. public event EventHandler RowHeadersBorderStyleChanged {
  1780. add { Events.AddHandler (RowHeadersBorderStyleChangedEvent, value); }
  1781. remove { Events.RemoveHandler (RowHeadersBorderStyleChangedEvent, value); }
  1782. }
  1783. public event EventHandler RowHeadersDefaultCellStyleChanged {
  1784. add { Events.AddHandler (RowHeadersDefaultCellStyleChangedEvent, value); }
  1785. remove { Events.RemoveHandler (RowHeadersDefaultCellStyleChangedEvent, value); }
  1786. }
  1787. public event EventHandler RowHeadersWidthChanged {
  1788. add { Events.AddHandler (RowHeadersWidthChangedEvent, value); }
  1789. remove { Events.RemoveHandler (RowHeadersWidthChangedEvent, value); }
  1790. }
  1791. public event DataGridViewAutoSizeModeEventHandler RowHeadersWidthSizeModeChanged {
  1792. add { Events.AddHandler (RowHeadersWidthSizeModeChangedEvent, value); }
  1793. remove { Events.RemoveHandler (RowHeadersWidthSizeModeChangedEvent, value); }
  1794. }
  1795. public event DataGridViewRowEventHandler RowHeightChanged {
  1796. add { Events.AddHandler (RowHeightChangedEvent, value); }
  1797. remove { Events.RemoveHandler (RowHeightChangedEvent, value); }
  1798. }
  1799. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1800. public event DataGridViewRowHeightInfoNeededEventHandler RowHeightInfoNeeded {
  1801. add { Events.AddHandler (RowHeightInfoNeededEvent, value); }
  1802. remove { Events.RemoveHandler (RowHeightInfoNeededEvent, value); }
  1803. }
  1804. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1805. public event DataGridViewRowHeightInfoPushedEventHandler RowHeightInfoPushed {
  1806. add { Events.AddHandler (RowHeightInfoPushedEvent, value); }
  1807. remove { Events.RemoveHandler (RowHeightInfoPushedEvent, value); }
  1808. }
  1809. public event DataGridViewCellEventHandler RowLeave {
  1810. add { Events.AddHandler (RowLeaveEvent, value); }
  1811. remove { Events.RemoveHandler (RowLeaveEvent, value); }
  1812. }
  1813. public event DataGridViewRowEventHandler RowMinimumHeightChanged {
  1814. add { Events.AddHandler (RowMinimumHeightChangedEvent, value); }
  1815. remove { Events.RemoveHandler (RowMinimumHeightChangedEvent, value); }
  1816. }
  1817. public event DataGridViewRowPostPaintEventHandler RowPostPaint {
  1818. add { Events.AddHandler (RowPostPaintEvent, value); }
  1819. remove { Events.RemoveHandler (RowPostPaintEvent, value); }
  1820. }
  1821. public event DataGridViewRowPrePaintEventHandler RowPrePaint {
  1822. add { Events.AddHandler (RowPrePaintEvent, value); }
  1823. remove { Events.RemoveHandler (RowPrePaintEvent, value); }
  1824. }
  1825. public event DataGridViewRowsAddedEventHandler RowsAdded {
  1826. add { Events.AddHandler (RowsAddedEvent, value); }
  1827. remove { Events.RemoveHandler (RowsAddedEvent, value); }
  1828. }
  1829. public event EventHandler RowsDefaultCellStyleChanged {
  1830. add { Events.AddHandler (RowsDefaultCellStyleChangedEvent, value); }
  1831. remove { Events.RemoveHandler (RowsDefaultCellStyleChangedEvent, value); }
  1832. }
  1833. public event DataGridViewRowsRemovedEventHandler RowsRemoved {
  1834. add { Events.AddHandler (RowsRemovedEvent, value); }
  1835. remove { Events.RemoveHandler (RowsRemovedEvent, value); }
  1836. }
  1837. public event DataGridViewRowStateChangedEventHandler RowStateChanged {
  1838. add { Events.AddHandler (RowStateChangedEvent, value); }
  1839. remove { Events.RemoveHandler (RowStateChangedEvent, value); }
  1840. }
  1841. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1842. public event DataGridViewRowEventHandler RowUnshared {
  1843. add { Events.AddHandler (RowUnsharedEvent, value); }
  1844. remove { Events.RemoveHandler (RowUnsharedEvent, value); }
  1845. }
  1846. public event DataGridViewCellEventHandler RowValidated {
  1847. add { Events.AddHandler (RowValidatedEvent, value); }
  1848. remove { Events.RemoveHandler (RowValidatedEvent, value); }
  1849. }
  1850. public event DataGridViewCellCancelEventHandler RowValidating {
  1851. add { Events.AddHandler (RowValidatingEvent, value); }
  1852. remove { Events.RemoveHandler (RowValidatingEvent, value); }
  1853. }
  1854. public event ScrollEventHandler Scroll {
  1855. add { Events.AddHandler (ScrollEvent, value); }
  1856. remove { Events.RemoveHandler (ScrollEvent, value); }
  1857. }
  1858. public event EventHandler SelectionChanged {
  1859. add { Events.AddHandler (SelectionChangedEvent, value); }
  1860. remove { Events.RemoveHandler (SelectionChangedEvent, value); }
  1861. }
  1862. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1863. public event DataGridViewSortCompareEventHandler SortCompare {
  1864. add { Events.AddHandler (SortCompareEvent, value); }
  1865. remove { Events.RemoveHandler (SortCompareEvent, value); }
  1866. }
  1867. public event EventHandler Sorted {
  1868. add { Events.AddHandler (SortedEvent, value); }
  1869. remove { Events.RemoveHandler (SortedEvent, value); }
  1870. }
  1871. public event DataGridViewRowEventHandler UserAddedRow {
  1872. add { Events.AddHandler (UserAddedRowEvent, value); }
  1873. remove { Events.RemoveHandler (UserAddedRowEvent, value); }
  1874. }
  1875. public event DataGridViewRowEventHandler UserDeletedRow {
  1876. add { Events.AddHandler (UserDeletedRowEvent, value); }
  1877. remove { Events.RemoveHandler (UserDeletedRowEvent, value); }
  1878. }
  1879. public event DataGridViewRowCancelEventHandler UserDeletingRow {
  1880. add { Events.AddHandler (UserDeletingRowEvent, value); }
  1881. remove { Events.RemoveHandler (UserDeletingRowEvent, value); }
  1882. }
  1883. [Browsable (false)]
  1884. [EditorBrowsable (EditorBrowsableState.Never)]
  1885. public new event EventHandler StyleChanged {
  1886. add { base.StyleChanged += value; }
  1887. remove { base.StyleChanged -= value; }
  1888. }
  1889. [Browsable (false)]
  1890. [EditorBrowsable (EditorBrowsableState.Never)]
  1891. public new event EventHandler TextChanged {
  1892. add { base.TextChanged += value; }
  1893. remove { base.TextChanged -= value; }
  1894. }
  1895. [EditorBrowsable (EditorBrowsableState.Advanced)]
  1896. public virtual DataGridViewAdvancedBorderStyle AdjustColumnHeaderBorderStyle (DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStyleInput, DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStylePlaceholder, bool isFirstDisplayedColumn, bool isLastVisibleColumn) {
  1897. return (DataGridViewAdvancedBorderStyle) ((ICloneable)dataGridViewAdvancedBorderStyleInput).Clone();
  1898. }
  1899. public bool AreAllCellsSelected (bool includeInvisibleCells) {
  1900. foreach (DataGridViewRow row in rows) {
  1901. foreach (DataGridViewCell cell in row.Cells) {
  1902. if (includeInvisibleCells == false && cell.Visible == false) {
  1903. continue;
  1904. }
  1905. if (!cell.Selected) {
  1906. return false;
  1907. }
  1908. }
  1909. }
  1910. return true;
  1911. }
  1912. public void AutoResizeColumn (int columnIndex) {
  1913. AutoResizeColumn (columnIndex, DataGridViewAutoSizeColumnMode.AllCells);
  1914. }
  1915. public void AutoResizeColumn (int columnIndex, DataGridViewAutoSizeColumnMode autoSizeColumnMode)
  1916. {
  1917. AutoResizeColumnInternal (columnIndex, autoSizeColumnMode);
  1918. }
  1919. public void AutoResizeColumnHeadersHeight ()
  1920. {
  1921. int new_height = 0;
  1922. foreach (DataGridViewColumn col in Columns)
  1923. new_height = Math.Max (new_height, col.HeaderCell.PreferredSize.Height);
  1924. if (ColumnHeadersHeight != new_height)
  1925. ColumnHeadersHeight = new_height;
  1926. }
  1927. [MonoTODO ("columnIndex parameter is not used")]
  1928. public void AutoResizeColumnHeadersHeight (int columnIndex)
  1929. {
  1930. AutoResizeColumnHeadersHeight ();
  1931. }
  1932. public void AutoResizeColumns () {
  1933. AutoResizeColumns (DataGridViewAutoSizeColumnsMode.AllCells);
  1934. }
  1935. public void AutoResizeColumns (DataGridViewAutoSizeColumnsMode autoSizeColumnsMode) {
  1936. AutoResizeColumns (autoSizeColumnsMode, true);
  1937. }
  1938. public void AutoResizeRow (int rowIndex)
  1939. {
  1940. AutoResizeRow (rowIndex, DataGridViewAutoSizeRowMode.AllCells, true);
  1941. }
  1942. public void AutoResizeRow (int rowIndex, DataGridViewAutoSizeRowMode autoSizeRowMode)
  1943. {
  1944. AutoResizeRow (rowIndex, autoSizeRowMode, true);
  1945. }
  1946. public void AutoResizeRowHeadersWidth (DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode)
  1947. {
  1948. if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToFirstHeader) {
  1949. RowHeadersWidth = GetRowInternal (0).HeaderCell.PreferredSize.Width;
  1950. return;
  1951. }
  1952. int new_width = 0;
  1953. if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders) {
  1954. bool anyRowsDisplayed = false;
  1955. foreach(DataGridViewRow row in Rows)
  1956. if(row.Displayed) {
  1957. anyRowsDisplayed = true;
  1958. new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
  1959. }
  1960. // if there are no rows which are displayed, we still have to set new_width
  1961. // to a value >= 4 as RowHeadersWidth will throw an exception otherwise
  1962. if(!anyRowsDisplayed) {
  1963. foreach (DataGridViewRow row in Rows)
  1964. new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
  1965. }
  1966. if (RowHeadersWidth != new_width)
  1967. RowHeadersWidth = new_width;
  1968. return;
  1969. }
  1970. if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders) {
  1971. foreach (DataGridViewRow row in Rows)
  1972. new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
  1973. if (RowHeadersWidth != new_width)
  1974. RowHeadersWidth = new_width;
  1975. return;
  1976. }
  1977. }
  1978. [MonoTODO ("Does not use rowIndex parameter.")]
  1979. public void AutoResizeRowHeadersWidth (int rowIndex, DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode)
  1980. {
  1981. AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
  1982. }
  1983. public void AutoResizeRows ()
  1984. {
  1985. AutoResizeRows (0, Rows.Count, DataGridViewAutoSizeRowMode.AllCells, false);
  1986. }
  1987. public void AutoResizeRows (DataGridViewAutoSizeRowsMode autoSizeRowsMode)
  1988. {
  1989. if (!Enum.IsDefined(typeof(DataGridViewAutoSizeRowsMode), autoSizeRowsMode))
  1990. throw new InvalidEnumArgumentException ("Parameter autoSizeRowsMode is not a valid DataGridViewRowsMode.");
  1991. if ((autoSizeRowsMode == DataGridViewAutoSizeRowsMode.AllHeaders || autoSizeRowsMode == DataGridViewAutoSizeRowsMode.DisplayedHeaders) && rowHeadersVisible == false)
  1992. throw new InvalidOperationException ("Parameter autoSizeRowsMode cannot be AllHeaders or DisplayedHeaders in this DataGridView.");
  1993. if (autoSizeRowsMode == DataGridViewAutoSizeRowsMode.None)
  1994. throw new ArgumentException ("Parameter autoSizeRowsMode cannot be None.");
  1995. AutoResizeRows (autoSizeRowsMode, false);
  1996. }
  1997. public virtual bool BeginEdit (bool selectAll) {
  1998. if (currentCell == null || currentCell.IsInEditMode)
  1999. return false;
  2000. if (currentCell.RowIndex >= 0) {
  2001. if ((currentCell.InheritedState & DataGridViewElementStates.ReadOnly) == DataGridViewElementStates.ReadOnly) {
  2002. return false;
  2003. }
  2004. }
  2005. DataGridViewCell cell = currentCell;
  2006. Type editType = cell.EditType;
  2007. if (editType == null && !(cell is IDataGridViewEditingCell))
  2008. return false;
  2009. // Give user a chance to cancel the edit
  2010. DataGridViewCellCancelEventArgs e = new DataGridViewCellCancelEventArgs (cell.ColumnIndex, cell.RowIndex);
  2011. OnCellBeginEdit (e);
  2012. if (e.Cancel)
  2013. return false;
  2014. cell.SetIsInEditMode (true);
  2015. // The cell has an editing control we need to setup
  2016. if (editType != null) {
  2017. Control ctrl = EditingControlInternal;
  2018. // Check if we can reuse the one we already have
  2019. bool isCorrectType = ctrl != null && ctrl.GetType () == editType;
  2020. if (!isCorrectType)
  2021. ctrl = null;
  2022. // We couldn't use the existing one, create a new one
  2023. if (ctrl == null) {
  2024. ctrl = (Control) Activator.CreateInstance (editType);
  2025. EditingControlInternal = ctrl;
  2026. }
  2027. // Call some functions that allows the editing control to get setup
  2028. DataGridViewCellStyle style = cell.RowIndex == -1 ? DefaultCellStyle : cell.InheritedStyle;
  2029. cell.InitializeEditingControl (cell.RowIndex, cell.FormattedValue, style);
  2030. OnEditingControlShowing (new DataGridViewEditingControlShowingEventArgs (EditingControlInternal, style));
  2031. cell.PositionEditingControl (true, true, this.GetCellDisplayRectangle (cell.ColumnIndex, cell.RowIndex, false), bounds, style, false, false, (columns [cell.ColumnIndex].DisplayIndex == 0), (cell.RowIndex == 0));
  2032. // Show the editing control
  2033. if (EditingControlInternal != null)
  2034. EditingControlInternal.Visible = true;
  2035. IDataGridViewEditingControl dgvEditingControl = (IDataGridViewEditingControl) EditingControlInternal;
  2036. if (dgvEditingControl != null) {
  2037. dgvEditingControl.EditingControlDataGridView = this;
  2038. dgvEditingControl.EditingControlRowIndex = currentCell.OwningRow.Index;
  2039. dgvEditingControl.ApplyCellStyleToEditingControl (style);
  2040. dgvEditingControl.PrepareEditingControlForEdit (selectAll);
  2041. dgvEditingControl.EditingControlFormattedValue = currentCell.EditedFormattedValue;
  2042. }
  2043. return true;
  2044. }
  2045. // If we are here, it means we have a cell that does not have an editing control
  2046. // and simply implements IDataGridViewEditingCell itself.
  2047. (cell as IDataGridViewEditingCell).PrepareEditingCellForEdit (selectAll);
  2048. return true;
  2049. }
  2050. public bool CancelEdit ()
  2051. {
  2052. if (currentCell != null) {
  2053. if (currentCell.IsInEditMode) {
  2054. currentCell.SetIsInEditMode (false);
  2055. currentCell.DetachEditingControl ();
  2056. }
  2057. if (currentCell.RowIndex == NewRowIndex) {
  2058. if (DataManager != null)
  2059. DataManager.CancelCurrentEdit ();
  2060. new_row_editing = false;
  2061. PrepareEditingRow (false, false);
  2062. MoveCurrentCell (currentCell.ColumnIndex, NewRowIndex, true, false, false, true);
  2063. OnUserDeletedRow (new DataGridViewRowEventArgs (EditingRow));
  2064. }
  2065. }
  2066. return true;
  2067. }
  2068. public void ClearSelection ()
  2069. {
  2070. foreach (DataGridViewColumn col in SelectedColumns)
  2071. col.Selected = false;
  2072. foreach (DataGridViewRow row in SelectedRows)
  2073. row.Selected = false;
  2074. foreach (DataGridViewCell cell in SelectedCells)
  2075. cell.Selected = false;
  2076. }
  2077. public bool CommitEdit (DataGridViewDataErrorContexts context)
  2078. {
  2079. if (currentCell == null)
  2080. return true;
  2081. try {
  2082. // convert
  2083. object newValue = currentCell.ParseFormattedValue (currentCell.EditedFormattedValue,
  2084. currentCell.InheritedStyle, null, null);
  2085. DataGridViewCellValidatingEventArgs validateArgs = new DataGridViewCellValidatingEventArgs (currentCell.ColumnIndex,
  2086. currentCell.RowIndex,
  2087. newValue);
  2088. // validate
  2089. OnCellValidating (validateArgs);
  2090. if (validateArgs.Cancel)
  2091. return false;
  2092. OnCellValidated (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
  2093. // commit
  2094. currentCell.Value = newValue;
  2095. } catch (Exception e) {
  2096. DataGridViewDataErrorEventArgs args = new DataGridViewDataErrorEventArgs (e, currentCell.ColumnIndex, currentCell.RowIndex,
  2097. DataGridViewDataErrorContexts.Commit);
  2098. OnDataError (false, args);
  2099. if (args.ThrowException)
  2100. throw e;
  2101. return false;
  2102. }
  2103. return true;
  2104. }
  2105. public int DisplayedColumnCount (bool includePartialColumns)
  2106. {
  2107. int result = 0;
  2108. int columnLeft = 0;
  2109. if (RowHeadersVisible)
  2110. columnLeft += RowHeadersWidth;
  2111. Size visibleClientArea = ClientSize;
  2112. if (verticalScrollBar.Visible)
  2113. visibleClientArea.Width -= verticalScrollBar.Width;
  2114. if (horizontalScrollBar.Visible)
  2115. visibleClientArea.Height -= horizontalScrollBar.Height;
  2116. for (int index = first_col_index; index < Columns.Count; index++) {
  2117. DataGridViewColumn column = Columns[ColumnDisplayIndexToIndex (index)];
  2118. if (columnLeft + column.Width <= visibleClientArea.Width) {
  2119. result++;
  2120. columnLeft += column.Width;
  2121. } else {
  2122. if (includePartialColumns)
  2123. result++;
  2124. break;
  2125. }
  2126. }
  2127. return result;
  2128. }
  2129. public int DisplayedRowCount (bool includePartialRow)
  2130. {
  2131. int result = 0;
  2132. int rowTop = 0;
  2133. if (ColumnHeadersVisible)
  2134. rowTop += ColumnHeadersHeight;
  2135. Size visibleClientArea = ClientSize;
  2136. if (verticalScrollBar.Visible)
  2137. visibleClientArea.Width -= verticalScrollBar.Width;
  2138. if (horizontalScrollBar.Visible)
  2139. visibleClientArea.Height -= horizontalScrollBar.Height;
  2140. for (int index = first_row_index; index < Rows.Count; index++) {
  2141. DataGridViewRow row = GetRowInternal (index);
  2142. if (rowTop + row.Height <= visibleClientArea.Height) {
  2143. result++;
  2144. rowTop += row.Height;
  2145. } else {
  2146. if (includePartialRow)
  2147. result++;
  2148. break;
  2149. }
  2150. }
  2151. return result;
  2152. }
  2153. public bool EndEdit ()
  2154. {
  2155. return EndEdit (DataGridViewDataErrorContexts.Commit);
  2156. }
  2157. [MonoTODO ("Does not use context parameter")]
  2158. public bool EndEdit (DataGridViewDataErrorContexts context)
  2159. {
  2160. if (currentCell == null || !currentCell.IsInEditMode)
  2161. return true;
  2162. if (!CommitEdit (context)) {
  2163. if (DataManager != null)
  2164. DataManager.EndCurrentEdit ();
  2165. if (EditingControl != null)
  2166. EditingControl.Focus ();
  2167. return false;
  2168. }
  2169. currentCell.SetIsInEditMode (false);
  2170. currentCell.DetachEditingControl ();
  2171. OnCellEndEdit (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
  2172. if (context != DataGridViewDataErrorContexts.LeaveControl)
  2173. Focus ();
  2174. if (currentCell.RowIndex == NewRowIndex) {
  2175. new_row_editing = false;
  2176. editing_row = null; // editing row becomes a real row
  2177. PrepareEditingRow (true, false); // add a new editing row
  2178. MoveCurrentCell (currentCell.ColumnIndex, NewRowIndex, true, false, false, true);
  2179. }
  2180. return true;
  2181. }
  2182. public int GetCellCount (DataGridViewElementStates includeFilter) {
  2183. int result = 0;
  2184. foreach (DataGridViewRow row in rows) {
  2185. foreach (DataGridViewCell cell in row.Cells) {
  2186. if ((cell.State & includeFilter) != 0) {
  2187. result++;
  2188. }
  2189. }
  2190. }
  2191. return result;
  2192. }
  2193. internal DataGridViewRow GetRowInternal (int rowIndex)
  2194. {
  2195. return Rows.SharedRow (rowIndex);
  2196. }
  2197. internal DataGridViewCell GetCellInternal (int colIndex, int rowIndex)
  2198. {
  2199. return GetRowInternal (rowIndex).Cells.GetCellInternal (colIndex);
  2200. }
  2201. public Rectangle GetCellDisplayRectangle (int columnIndex, int rowIndex, bool cutOverflow) {
  2202. // Allow the column and row headers (index == -1).
  2203. if (columnIndex < -1 || columnIndex >= columns.Count) {
  2204. throw new ArgumentOutOfRangeException ("Column index is out of range.");
  2205. }
  2206. if (rowIndex < -1 || (rowIndex > 0 && rowIndex >= rows.Count)) {
  2207. throw new ArgumentOutOfRangeException ("Row index is out of range.");
  2208. }
  2209. int x = 0, y = 0, w = 0, h = 0;
  2210. x = BorderWidth;
  2211. y = BorderWidth;
  2212. if (ColumnHeadersVisible)
  2213. y += ColumnHeadersHeight;
  2214. if (RowHeadersVisible)
  2215. x += RowHeadersWidth;
  2216. // Handle the top left cell when both column and row headers are showing.
  2217. if (columnIndex == -1 && rowIndex == -1)
  2218. return new Rectangle (BorderWidth, BorderWidth, RowHeadersWidth, ColumnHeadersHeight);
  2219. if (columnIndex >= 0)
  2220. {
  2221. List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
  2222. for (int i = first_col_index; i < cols.Count; i++) {
  2223. if (!cols[i].Visible)
  2224. continue;
  2225. if (cols[i].Index == columnIndex) {
  2226. w = cols[i].Width;
  2227. break;
  2228. }
  2229. x += cols[i].Width;
  2230. }
  2231. }
  2232. // Handle a cell in the header row.
  2233. if (rowIndex == -1)
  2234. return new Rectangle (x, BorderWidth, w, ColumnHeadersHeight);
  2235. for (int i = first_row_index; i < Rows.Count; i++) {
  2236. if (!rows[i].Visible)
  2237. continue;
  2238. if (rows[i].Index == rowIndex) {
  2239. h = rows [i].Height;
  2240. break;
  2241. }
  2242. y += rows [i].Height;
  2243. }
  2244. // Handle a cell in the header column.
  2245. if (columnIndex == -1)
  2246. return new Rectangle (BorderWidth, y, RowHeadersWidth, h);
  2247. return new Rectangle (x, y, w, h);
  2248. }
  2249. public virtual DataObject GetClipboardContent () {
  2250. if (clipboardCopyMode == DataGridViewClipboardCopyMode.Disable)
  2251. throw new InvalidOperationException ("Generating Clipboard content is not supported when the ClipboardCopyMode property is Disable.");
  2252. int start_row = int.MaxValue, end_row = int.MinValue;
  2253. int start_col = int.MaxValue, end_col = int.MinValue;
  2254. bool include_row_headers = false;
  2255. bool include_col_headers = false;
  2256. bool only_included_headers = false;
  2257. bool headers_includable = false;
  2258. switch (ClipboardCopyMode) {
  2259. case DataGridViewClipboardCopyMode.EnableWithoutHeaderText:
  2260. break;
  2261. case DataGridViewClipboardCopyMode.EnableWithAutoHeaderText:
  2262. // Headers are included if not selection mode is CellSelect, and any header is selected.
  2263. headers_includable = selectionMode != DataGridViewSelectionMode.CellSelect;
  2264. break;
  2265. case DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText:
  2266. include_col_headers = include_row_headers = true;
  2267. break;
  2268. }
  2269. BitArray included_rows = new BitArray (RowCount);
  2270. BitArray included_cols = new BitArray (ColumnCount);
  2271. // If there are any selected columns,
  2272. // include the column headers (if headers are to be shown).
  2273. if (headers_includable && !include_col_headers) {
  2274. for (int c = 0; c < ColumnCount; c++) {
  2275. if (Columns [c].Selected) {
  2276. include_col_headers = true;
  2277. break;
  2278. }
  2279. }
  2280. }
  2281. // Find the smallest rectangle that encompasses all selected cells.
  2282. for (int r = 0; r < RowCount; r++) {
  2283. DataGridViewRow row = Rows [r];
  2284. if (headers_includable && !include_row_headers && row.Selected) {
  2285. include_row_headers = true;
  2286. }
  2287. for (int c = 0; c < ColumnCount; c++) {
  2288. DataGridViewCell cell = row.Cells [c];
  2289. if (cell == null || !cell.Selected)
  2290. continue;
  2291. included_cols [c] = true;
  2292. included_rows [r] = true;
  2293. start_row = Math.Min (start_row, r);
  2294. start_col = Math.Min (start_col, c);
  2295. end_row = Math.Max (end_row, r);
  2296. end_col = Math.Max (end_col, c);
  2297. }
  2298. }
  2299. // Mark rows/columns in between selected cells as included if the selection mode isn't FullHeaderSelect.
  2300. switch (selectionMode){
  2301. case DataGridViewSelectionMode.CellSelect:
  2302. case DataGridViewSelectionMode.ColumnHeaderSelect:
  2303. case DataGridViewSelectionMode.RowHeaderSelect:
  2304. if (selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect) {
  2305. for (int r = start_row; r <= end_row; r++) {
  2306. included_rows.Set (r, true);
  2307. }
  2308. } else if (start_row <= end_row) {
  2309. included_rows.SetAll (true);
  2310. }
  2311. if (selectionMode != DataGridViewSelectionMode.RowHeaderSelect) {
  2312. for (int c = start_col; c <= end_col; c++) {
  2313. included_cols.Set (c, true);
  2314. }
  2315. }
  2316. break;
  2317. case DataGridViewSelectionMode.FullColumnSelect:
  2318. case DataGridViewSelectionMode.FullRowSelect:
  2319. only_included_headers = true;
  2320. break;
  2321. }
  2322. if (start_row > end_row)
  2323. return null;
  2324. if (start_col > end_col)
  2325. return null;
  2326. DataObject result = new DataObject ();
  2327. StringBuilder text_builder = new StringBuilder ();
  2328. StringBuilder utext_builder = new StringBuilder ();
  2329. StringBuilder html_builder = new StringBuilder ();
  2330. StringBuilder csv_builder = new StringBuilder ();
  2331. // Loop through all rows and columns to create the content.
  2332. // -1 is the header row/column.
  2333. int first_row = start_row;
  2334. int first_col = start_col;
  2335. if (include_col_headers) {
  2336. first_row = -1;
  2337. }
  2338. for (int r = first_row; r <= end_row; r++) {
  2339. DataGridViewRow row = null;
  2340. if (r >= 0) {
  2341. if (!included_rows [r])
  2342. continue;
  2343. row = Rows [r];
  2344. }
  2345. if (include_row_headers) {
  2346. first_col = -1;
  2347. }
  2348. for (int c = first_col; c <= end_col; c++) {
  2349. DataGridViewCell cell = null;
  2350. if (c >= 0 && only_included_headers && !included_cols [c])
  2351. continue;
  2352. if (row == null) {
  2353. if (c == -1) {
  2354. cell = TopLeftHeaderCell;
  2355. } else {
  2356. cell = Columns [c].HeaderCell;
  2357. }
  2358. } else {
  2359. if (c == -1) {
  2360. cell = row.HeaderCell;
  2361. } else {
  2362. cell = row.Cells [c];
  2363. }
  2364. }
  2365. string text, utext, html, csv;
  2366. bool is_first_cell = (c == first_col);
  2367. bool is_last_cell = (c == end_col);
  2368. bool is_first_row = (r == first_row);
  2369. bool is_last_row = (r == end_row);
  2370. if (cell == null) {
  2371. text = string.Empty;
  2372. utext = string.Empty;
  2373. html = string.Empty;
  2374. csv = string.Empty;
  2375. } else {
  2376. text = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.Text) as string;
  2377. utext = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.UnicodeText) as string;
  2378. html = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.Html) as string;
  2379. csv = cell.GetClipboardContentInternal (r, is_first_cell, is_last_cell, is_first_row, is_last_row, DataFormats.CommaSeparatedValue) as string;
  2380. }
  2381. text_builder.Append (text);
  2382. utext_builder.Append (utext);
  2383. html_builder.Append (html);
  2384. csv_builder.Append (csv);
  2385. if (c == -1) { // If we just did the row header, jump to the first column.
  2386. c = start_col - 1;
  2387. }
  2388. }
  2389. if (r == -1) {// If we just did the column header, jump to the first row.
  2390. r = start_row - 1;
  2391. }
  2392. }
  2393. //
  2394. // Html content always get the \r\n newline
  2395. // It's valid html anyway, and it eases testing quite a bit
  2396. // (since otherwise we'd have to change the start indices
  2397. // in the added prologue/epilogue text)
  2398. //
  2399. int fragment_end = 135 + html_builder.Length;
  2400. int html_end = fragment_end + 36;
  2401. string html_start =
  2402. "Version:1.0{0}" +
  2403. "StartHTML:00000097{0}" +
  2404. "EndHTML:{1:00000000}{0}" +
  2405. "StartFragment:00000133{0}" +
  2406. "EndFragment:{2:00000000}{0}" +
  2407. "<HTML>{0}" +
  2408. "<BODY>{0}" +
  2409. "<!--StartFragment-->";
  2410. html_start = string.Format (html_start, "\r\n", html_end, fragment_end);
  2411. html_builder.Insert (0, html_start);
  2412. html_builder.AppendFormat ("{0}<!--EndFragment-->{0}</BODY>{0}</HTML>", "\r\n");
  2413. result.SetData (DataFormats.CommaSeparatedValue, false, csv_builder.ToString ());
  2414. result.SetData (DataFormats.Html, false, html_builder.ToString ());
  2415. result.SetData (DataFormats.UnicodeText, false, utext_builder.ToString ());
  2416. result.SetData (DataFormats.Text, false, text_builder.ToString ());
  2417. return result;
  2418. }
  2419. [MonoTODO ("Does not use cutOverflow parameter")]
  2420. public Rectangle GetColumnDisplayRectangle (int columnIndex, bool cutOverflow)
  2421. {
  2422. if (columnIndex < 0 || columnIndex > Columns.Count - 1)
  2423. throw new ArgumentOutOfRangeException ("columnIndex");
  2424. int x = 0;
  2425. int w = 0;
  2426. x = BorderWidth;
  2427. if (RowHeadersVisible)
  2428. x += RowHeadersWidth;
  2429. List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
  2430. for (int i = first_col_index; i < cols.Count; i++) {
  2431. if (!cols[i].Visible)
  2432. continue;
  2433. if (cols[i].Index == columnIndex) {
  2434. w = cols[i].Width;
  2435. break;
  2436. }
  2437. x += cols[i].Width;
  2438. }
  2439. return new Rectangle (x, 0, w, Height);
  2440. }
  2441. [MonoTODO ("Does not use cutOverflow parameter")]
  2442. public Rectangle GetRowDisplayRectangle (int rowIndex, bool cutOverflow)
  2443. {
  2444. if (rowIndex < 0 || rowIndex > Rows.Count - 1)
  2445. throw new ArgumentOutOfRangeException ("rowIndex");
  2446. int y = 0;
  2447. int h = 0;
  2448. y = BorderWidth;
  2449. if (ColumnHeadersVisible)
  2450. y += ColumnHeadersHeight;
  2451. for (int i = first_row_index; i < Rows.Count; i++) {
  2452. if (!rows[i].Visible)
  2453. continue;
  2454. if (rows[i].Index == rowIndex) {
  2455. h = rows [i].Height;
  2456. break;
  2457. }
  2458. y += rows [i].Height;
  2459. }
  2460. return new Rectangle (0, y, Width, h);
  2461. }
  2462. public HitTestInfo HitTest (int x, int y) {
  2463. ///////////////////////////////////////////////////////
  2464. //Console.WriteLine ("HitTest ({0}, {1})", x, y);
  2465. bool isInColHeader = columnHeadersVisible && y >= 0 && y <= ColumnHeadersHeight;
  2466. bool isInRowHeader = rowHeadersVisible && x >= 0 && x <= RowHeadersWidth;
  2467. // TopLeftHeader
  2468. if (isInColHeader && isInRowHeader)
  2469. return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.TopLeftHeader);
  2470. // HorizontalScrollBar
  2471. if (horizontalScrollBar.Visible && horizontalScrollBar.Bounds.Contains (x, y))
  2472. return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.HorizontalScrollBar);
  2473. // VerticalScrollBar
  2474. if (verticalScrollBar.Visible && verticalScrollBar.Bounds.Contains (x, y))
  2475. return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.VerticalScrollBar);
  2476. // The little box in the bottom right if both scrollbars are shown is None
  2477. if (verticalScrollBar.Visible && horizontalScrollBar.Visible)
  2478. if (new Rectangle (verticalScrollBar.Left, horizontalScrollBar.Top, verticalScrollBar.Width, horizontalScrollBar.Height).Contains (x, y))
  2479. return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.None);
  2480. int rowindex = -1;
  2481. int colindex = -1;
  2482. int top = columnHeadersVisible ? columnHeadersHeight : 0;
  2483. for (int i = first_row_index; i < Rows.Count; i++) {
  2484. DataGridViewRow row = Rows[i];
  2485. if (!row.Visible)
  2486. continue;
  2487. if (y > top && y <= (top + row.Height)) {
  2488. rowindex = i;
  2489. break;
  2490. }
  2491. top += row.Height;
  2492. }
  2493. int left = rowHeadersVisible ? RowHeadersWidth : 0;
  2494. List<DataGridViewColumn> cols = columns.ColumnDisplayIndexSortedArrayList;
  2495. for (int i = first_col_index; i < cols.Count; i++) {
  2496. if (!cols[i].Visible)
  2497. continue;
  2498. if (x > left && x <= (left + cols[i].Width)) {
  2499. colindex = cols[i].Index;
  2500. break;
  2501. }
  2502. left += cols[i].Width;
  2503. }
  2504. if (colindex >= 0 && rowindex >= 0)
  2505. return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.Cell);
  2506. if (isInColHeader && colindex > -1)
  2507. return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.ColumnHeader);
  2508. if (isInRowHeader && rowindex > -1)
  2509. return new HitTestInfo (colindex, x, rowindex, y, DataGridViewHitTestType.RowHeader);
  2510. return new HitTestInfo (-1, x, -1, y, DataGridViewHitTestType.None);
  2511. }
  2512. public void InvalidateCell (DataGridViewCell dataGridViewCell)
  2513. {
  2514. if (dataGridViewCell == null)
  2515. throw new ArgumentNullException ("Cell is null");
  2516. if (dataGridViewCell.DataGridView != this)
  2517. throw new ArgumentException ("The specified cell does not belong to this DataGridView.");
  2518. InvalidateCell (dataGridViewCell.ColumnIndex, dataGridViewCell.RowIndex);
  2519. }
  2520. public void InvalidateCell (int columnIndex, int rowIndex)
  2521. {
  2522. // Allow the header column (columnIndex == -1).
  2523. if (columnIndex < -1 || columnIndex >= columns.Count)
  2524. throw new ArgumentOutOfRangeException ("Column index is out of range.");
  2525. // Allow the header row (rowIndex == -1).
  2526. if (rowIndex < -1 || rowIndex >= rows.Count)
  2527. throw new ArgumentOutOfRangeException ("Row index is out of range.");
  2528. if (!is_binding)
  2529. Invalidate (GetCellDisplayRectangle (columnIndex, rowIndex, true));
  2530. }
  2531. public void InvalidateColumn (int columnIndex)
  2532. {
  2533. if (columnIndex < 0 || columnIndex >= columns.Count)
  2534. throw new ArgumentOutOfRangeException ("Column index is out of range.");
  2535. if (!is_binding)
  2536. Invalidate (GetColumnDisplayRectangle (columnIndex, true));
  2537. }
  2538. public void InvalidateRow (int rowIndex)
  2539. {
  2540. if (rowIndex < 0 || rowIndex >= rows.Count)
  2541. throw new ArgumentOutOfRangeException ("Row index is out of range.");
  2542. if (!is_binding)
  2543. Invalidate (GetRowDisplayRectangle (rowIndex, true));
  2544. }
  2545. public virtual void NotifyCurrentCellDirty (bool dirty) {
  2546. if (currentCell != null)
  2547. InvalidateCell (currentCell);
  2548. }
  2549. public bool RefreshEdit ()
  2550. {
  2551. if (IsCurrentCellInEditMode) {
  2552. currentCell.InitializeEditingControl (currentCell.RowIndex, currentCell.FormattedValue, currentCell.InheritedStyle);
  2553. return true;
  2554. }
  2555. return false;
  2556. }
  2557. [EditorBrowsable (EditorBrowsableState.Never)]
  2558. public override void ResetText ()
  2559. {
  2560. Text = string.Empty;
  2561. }
  2562. public void SelectAll () {
  2563. switch (selectionMode) {
  2564. case DataGridViewSelectionMode.FullRowSelect:
  2565. foreach (DataGridViewRow row in rows) {
  2566. (row as DataGridViewBand).Selected = true;
  2567. }
  2568. break;
  2569. case DataGridViewSelectionMode.FullColumnSelect:
  2570. foreach (DataGridViewColumn col in columns) {
  2571. (col as DataGridViewBand).Selected = true;
  2572. }
  2573. break;
  2574. default:
  2575. foreach (DataGridViewRow row in rows) {
  2576. foreach (DataGridViewCell cell in row.Cells) {
  2577. cell.Selected = true;
  2578. }
  2579. }
  2580. break;
  2581. }
  2582. Invalidate ();
  2583. }
  2584. public virtual void Sort (IComparer comparer)
  2585. {
  2586. if (comparer == null)
  2587. throw new ArgumentNullException ("comparer");
  2588. if (VirtualMode || DataSource != null)
  2589. throw new InvalidOperationException ();
  2590. if (SortedColumn != null)
  2591. SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
  2592. EndEdit ();
  2593. Rows.Sort (comparer);
  2594. sortedColumn = null;
  2595. sortOrder = SortOrder.None;
  2596. currentCell = null;
  2597. Invalidate ();
  2598. OnSorted (EventArgs.Empty);
  2599. }
  2600. public virtual void Sort (DataGridViewColumn dataGridViewColumn, ListSortDirection direction)
  2601. {
  2602. if (dataGridViewColumn == null)
  2603. throw new ArgumentNullException ("dataGridViewColumn");
  2604. if (dataGridViewColumn.DataGridView != this)
  2605. throw new ArgumentException ("dataGridViewColumn");
  2606. if (!EndEdit ())
  2607. return;
  2608. if (SortedColumn != null)
  2609. SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
  2610. sortedColumn = dataGridViewColumn;
  2611. sortOrder = direction == ListSortDirection.Ascending ? SortOrder.Ascending : SortOrder.Descending;
  2612. if (Rows.Count == 0)
  2613. return;
  2614. if (dataGridViewColumn.IsDataBound) {
  2615. IBindingList bindingList = DataManager.List as IBindingList;
  2616. if (bindingList != null && bindingList.SupportsSorting) {
  2617. bindingList.ApplySort (DataManager.GetItemProperties()[dataGridViewColumn.DataPropertyName], direction);
  2618. dataGridViewColumn.HeaderCell.SortGlyphDirection = sortOrder;
  2619. }
  2620. } else {
  2621. // Figure out if this is a numeric sort or text sort
  2622. bool is_numeric = true;
  2623. double n;
  2624. foreach (DataGridViewRow row in Rows) {
  2625. object val = row.Cells[dataGridViewColumn.Index].Value;
  2626. if (val != null && !double.TryParse (val.ToString (), out n)) {
  2627. is_numeric = false;
  2628. break;
  2629. }
  2630. }
  2631. ColumnSorter sorter = new ColumnSorter (dataGridViewColumn, direction, is_numeric);
  2632. Rows.Sort (sorter);
  2633. dataGridViewColumn.HeaderCell.SortGlyphDirection = sortOrder;
  2634. }
  2635. Invalidate ();
  2636. OnSorted (EventArgs.Empty);
  2637. }
  2638. public void UpdateCellErrorText (int columnIndex, int rowIndex)
  2639. {
  2640. if (columnIndex < 0 || columnIndex > Columns.Count - 1)
  2641. throw new ArgumentOutOfRangeException ("columnIndex");
  2642. if (rowIndex < 0 || rowIndex > Rows.Count - 1)
  2643. throw new ArgumentOutOfRangeException ("rowIndex");
  2644. InvalidateCell (columnIndex, rowIndex);
  2645. }
  2646. public void UpdateCellValue (int columnIndex, int rowIndex)
  2647. {
  2648. if (columnIndex < 0 || columnIndex > Columns.Count - 1)
  2649. throw new ArgumentOutOfRangeException ("columnIndex");
  2650. if (rowIndex < 0 || rowIndex > Rows.Count - 1)
  2651. throw new ArgumentOutOfRangeException ("rowIndex");
  2652. InvalidateCell (columnIndex, rowIndex);
  2653. }
  2654. public void UpdateRowErrorText (int rowIndex)
  2655. {
  2656. if (rowIndex < 0 || rowIndex > Rows.Count - 1)
  2657. throw new ArgumentOutOfRangeException ("rowIndex");
  2658. InvalidateRow (rowIndex);
  2659. }
  2660. public void UpdateRowErrorText (int rowIndexStart, int rowIndexEnd)
  2661. {
  2662. if (rowIndexStart < 0 || rowIndexStart > Rows.Count - 1)
  2663. throw new ArgumentOutOfRangeException ("rowIndexStart");
  2664. if (rowIndexEnd < 0 || rowIndexEnd > Rows.Count - 1)
  2665. throw new ArgumentOutOfRangeException ("rowIndexEnd");
  2666. if (rowIndexEnd < rowIndexStart)
  2667. throw new ArgumentOutOfRangeException ("rowIndexEnd", "rowIndexEnd must be greater than rowIndexStart");
  2668. for (int i = rowIndexStart; i <= rowIndexEnd; i++)
  2669. InvalidateRow (i);
  2670. }
  2671. public void UpdateRowHeightInfo (int rowIndex, bool updateToEnd)
  2672. {
  2673. if (rowIndex < 0 && updateToEnd)
  2674. throw new ArgumentOutOfRangeException ("rowIndex");
  2675. if (rowIndex < -1 && !updateToEnd)
  2676. throw new ArgumentOutOfRangeException ("rowIndex");
  2677. if (rowIndex >= Rows.Count)
  2678. throw new ArgumentOutOfRangeException ("rowIndex");
  2679. if (!VirtualMode && DataManager == null)
  2680. return;
  2681. if (rowIndex == -1) {
  2682. updateToEnd = true;
  2683. rowIndex = 0;
  2684. }
  2685. if (updateToEnd) {
  2686. for (int i = rowIndex; i < Rows.Count; i++) {
  2687. DataGridViewRow row = Rows[i];
  2688. if (!row.Visible)
  2689. continue;
  2690. DataGridViewRowHeightInfoNeededEventArgs rowInfo =
  2691. new DataGridViewRowHeightInfoNeededEventArgs (row.Index, row.Height, row.MinimumHeight);
  2692. OnRowHeightInfoNeeded (rowInfo);
  2693. if (row.Height != rowInfo.Height || row.MinimumHeight != rowInfo.MinimumHeight) {
  2694. row.Height = rowInfo.Height;
  2695. row.MinimumHeight = rowInfo.MinimumHeight;
  2696. OnRowHeightInfoPushed (new DataGridViewRowHeightInfoPushedEventArgs (row.Index, rowInfo.Height,
  2697. rowInfo.MinimumHeight));
  2698. }
  2699. }
  2700. } else {
  2701. DataGridViewRow row = Rows[rowIndex];
  2702. DataGridViewRowHeightInfoNeededEventArgs rowInfo =
  2703. new DataGridViewRowHeightInfoNeededEventArgs (row.Index, row.Height, row.MinimumHeight);
  2704. OnRowHeightInfoNeeded (rowInfo);
  2705. if (row.Height != rowInfo.Height || row.MinimumHeight != rowInfo.MinimumHeight) {
  2706. row.Height = rowInfo.Height;
  2707. row.MinimumHeight = rowInfo.MinimumHeight;
  2708. OnRowHeightInfoPushed (new DataGridViewRowHeightInfoPushedEventArgs (row.Index, rowInfo.Height,
  2709. rowInfo.MinimumHeight));
  2710. }
  2711. }
  2712. }
  2713. protected override bool CanEnableIme {
  2714. get {
  2715. if (CurrentCell != null && CurrentCell.EditType != null)
  2716. return true;
  2717. return false;
  2718. }
  2719. }
  2720. protected override Size DefaultSize {
  2721. get { return new Size (240, 150); }
  2722. }
  2723. protected ScrollBar HorizontalScrollBar {
  2724. get { return horizontalScrollBar; }
  2725. }
  2726. protected ScrollBar VerticalScrollBar {
  2727. get { return verticalScrollBar; }
  2728. }
  2729. protected virtual void AccessibilityNotifyCurrentCellChanged (Point cellAddress)
  2730. {
  2731. throw new NotImplementedException ();
  2732. }
  2733. [MonoTODO ("Does not use fixedHeight parameter")]
  2734. protected void AutoResizeColumn (int columnIndex, DataGridViewAutoSizeColumnMode autoSizeColumnMode, bool fixedHeight)
  2735. {
  2736. AutoResizeColumn (columnIndex, autoSizeColumnMode);
  2737. }
  2738. [MonoTODO ("Does not use fixedRowHeadersWidth or fixedColumnsWidth parameters")]
  2739. protected void AutoResizeColumnHeadersHeight (bool fixedRowHeadersWidth, bool fixedColumnsWidth)
  2740. {
  2741. AutoResizeColumnHeadersHeight ();
  2742. }
  2743. [MonoTODO ("Does not use columnIndex or fixedRowHeadersWidth or fixedColumnsWidth parameters")]
  2744. protected void AutoResizeColumnHeadersHeight (int columnIndex, bool fixedRowHeadersWidth, bool fixedColumnWidth)
  2745. {
  2746. AutoResizeColumnHeadersHeight (columnIndex);
  2747. }
  2748. protected void AutoResizeColumns (DataGridViewAutoSizeColumnsMode autoSizeColumnsMode, bool fixedHeight) {
  2749. for (int i = 0; i < Columns.Count; i++) {
  2750. AutoResizeColumn (i, (DataGridViewAutoSizeColumnMode) autoSizeColumnsMode, fixedHeight);
  2751. }
  2752. }
  2753. [MonoTODO ("Does not use fixedWidth parameter")]
  2754. protected void AutoResizeRow (int rowIndex, DataGridViewAutoSizeRowMode autoSizeRowMode, bool fixedWidth)
  2755. {
  2756. if (autoSizeRowMode == DataGridViewAutoSizeRowMode.RowHeader && !rowHeadersVisible)
  2757. throw new InvalidOperationException ("row headers are not visible");
  2758. if (rowIndex < 0 || rowIndex > Rows.Count - 1)
  2759. throw new ArgumentOutOfRangeException ("rowIndex");
  2760. DataGridViewRow row = GetRowInternal (rowIndex);
  2761. int new_height = row.GetPreferredHeight (rowIndex, autoSizeRowMode, true);
  2762. if (row.Height != new_height)
  2763. row.SetAutoSizeHeight (new_height);
  2764. }
  2765. [MonoTODO ("Does not use fixedColumnHeadersHeight or fixedRowsHeight parameter")]
  2766. protected void AutoResizeRowHeadersWidth (DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode, bool fixedColumnHeadersHeight, bool fixedRowsHeight)
  2767. {
  2768. AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
  2769. }
  2770. [MonoTODO ("Does not use rowIndex or fixedColumnHeadersHeight or fixedRowsHeight parameter")]
  2771. protected void AutoResizeRowHeadersWidth (int rowIndex, DataGridViewRowHeadersWidthSizeMode rowHeadersWidthSizeMode, bool fixedColumnHeadersHeight, bool fixedRowHeight)
  2772. {
  2773. AutoResizeRowHeadersWidth (rowHeadersWidthSizeMode);
  2774. }
  2775. [MonoTODO ("Does not use fixedWidth parameter")]
  2776. protected void AutoResizeRows (DataGridViewAutoSizeRowsMode autoSizeRowsMode, bool fixedWidth)
  2777. {
  2778. if (autoSizeRowsMode == DataGridViewAutoSizeRowsMode.None)
  2779. return;
  2780. bool displayed_only = false;
  2781. DataGridViewAutoSizeRowMode mode = DataGridViewAutoSizeRowMode.AllCells;
  2782. switch (autoSizeRowsMode) {
  2783. case DataGridViewAutoSizeRowsMode.AllHeaders:
  2784. mode = DataGridViewAutoSizeRowMode.RowHeader;
  2785. break;
  2786. case DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders:
  2787. mode = DataGridViewAutoSizeRowMode.AllCellsExceptHeader;
  2788. break;
  2789. case DataGridViewAutoSizeRowsMode.AllCells:
  2790. mode = DataGridViewAutoSizeRowMode.AllCells;
  2791. break;
  2792. case DataGridViewAutoSizeRowsMode.DisplayedHeaders:
  2793. mode = DataGridViewAutoSizeRowMode.RowHeader;
  2794. displayed_only = true;
  2795. break;
  2796. case DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders:
  2797. mode = DataGridViewAutoSizeRowMode.AllCellsExceptHeader;
  2798. displayed_only = true;
  2799. break;
  2800. case DataGridViewAutoSizeRowsMode.DisplayedCells:
  2801. mode = DataGridViewAutoSizeRowMode.AllCells;
  2802. displayed_only = true;
  2803. break;
  2804. }
  2805. foreach (DataGridViewRow row in Rows) {
  2806. if (!row.Visible)
  2807. continue;
  2808. if (!displayed_only || row.Displayed) {
  2809. int new_height = row.GetPreferredHeight (row.Index, mode, fixedWidth);
  2810. if (row.Height != new_height)
  2811. row.SetAutoSizeHeight (new_height);
  2812. }
  2813. }
  2814. }
  2815. [MonoTODO ("Does not use fixedMode parameter")]
  2816. protected void AutoResizeRows (int rowIndexStart, int rowsCount, DataGridViewAutoSizeRowMode autoSizeRowMode, bool fixedWidth)
  2817. {
  2818. for (int i = rowIndexStart; i < rowIndexStart + rowsCount; i++)
  2819. AutoResizeRow (i, autoSizeRowMode, fixedWidth);
  2820. }
  2821. protected void ClearSelection (int columnIndexException, int rowIndexException, bool selectExceptionElement) {
  2822. if (columnIndexException >= columns.Count) {
  2823. throw new ArgumentOutOfRangeException("ColumnIndexException is greater than the highest column index.");
  2824. }
  2825. if (selectionMode == DataGridViewSelectionMode.FullRowSelect) {
  2826. if (columnIndexException < -1) {
  2827. throw new ArgumentOutOfRangeException("ColumnIndexException is less than -1.");
  2828. }
  2829. }
  2830. else {
  2831. if (columnIndexException < 0) {
  2832. throw new ArgumentOutOfRangeException("ColumnIndexException is less than 0.");
  2833. }
  2834. }
  2835. if (rowIndexException >= rows.Count) {
  2836. throw new ArgumentOutOfRangeException("RowIndexException is greater than the highest row index.");
  2837. }
  2838. if (selectionMode == DataGridViewSelectionMode.FullColumnSelect) {
  2839. if (rowIndexException < -1) {
  2840. throw new ArgumentOutOfRangeException("RowIndexException is less than -1.");
  2841. }
  2842. }
  2843. else {
  2844. if (rowIndexException < 0) {
  2845. throw new ArgumentOutOfRangeException("RowIndexException is less than 0.");
  2846. }
  2847. }
  2848. switch (selectionMode) {
  2849. case DataGridViewSelectionMode.FullRowSelect:
  2850. foreach (DataGridViewRow row in rows) {
  2851. if (selectExceptionElement && row.Index == rowIndexException) {
  2852. continue;
  2853. }
  2854. SetSelectedRowCore (row.Index, false);
  2855. }
  2856. break;
  2857. case DataGridViewSelectionMode.FullColumnSelect:
  2858. foreach (DataGridViewColumn col in columns) {
  2859. if (selectExceptionElement && col.Index == columnIndexException) {
  2860. continue;
  2861. }
  2862. SetSelectedColumnCore (col.Index, false);
  2863. }
  2864. break;
  2865. default:
  2866. foreach (DataGridViewCell cell in SelectedCells) {
  2867. if (selectExceptionElement && cell.RowIndex == rowIndexException && cell.ColumnIndex == columnIndexException) {
  2868. continue;
  2869. }
  2870. SetSelectedCellCore (cell.ColumnIndex, cell.RowIndex, false);
  2871. }
  2872. break;
  2873. }
  2874. }
  2875. protected override AccessibleObject CreateAccessibilityInstance ()
  2876. {
  2877. return new DataGridViewAccessibleObject(this);
  2878. }
  2879. [EditorBrowsable (EditorBrowsableState.Advanced)]
  2880. protected virtual DataGridViewColumnCollection CreateColumnsInstance ()
  2881. {
  2882. return new DataGridViewColumnCollection(this);
  2883. }
  2884. protected override Control.ControlCollection CreateControlsInstance ()
  2885. {
  2886. return new DataGridViewControlCollection (this);
  2887. }
  2888. [EditorBrowsable (EditorBrowsableState.Advanced)]
  2889. protected virtual DataGridViewRowCollection CreateRowsInstance ()
  2890. {
  2891. return new DataGridViewRowCollection(this);
  2892. }
  2893. protected override void Dispose (bool disposing) {
  2894. if (disposing) {
  2895. ClearSelection();
  2896. foreach (DataGridViewColumn column in Columns)
  2897. column.Dispose();
  2898. Columns.Clear();
  2899. foreach (DataGridViewRow row in Rows)
  2900. row.Dispose();
  2901. Rows.Clear();
  2902. }
  2903. editingControl = null;
  2904. base.Dispose(disposing);
  2905. }
  2906. protected override AccessibleObject GetAccessibilityObjectById (int objectId)
  2907. {
  2908. throw new NotImplementedException();
  2909. }
  2910. protected override bool IsInputChar (char charCode)
  2911. {
  2912. return true;
  2913. }
  2914. protected override bool IsInputKey (Keys keyData)
  2915. {
  2916. // Don't look at the modifiers
  2917. keyData = keyData & ~Keys.Modifiers;
  2918. switch (keyData) {
  2919. case Keys.Return:
  2920. case Keys.PageUp:
  2921. case Keys.Next:
  2922. case Keys.End:
  2923. case Keys.Home:
  2924. case Keys.Left:
  2925. case Keys.Up:
  2926. case Keys.Right:
  2927. case Keys.Down:
  2928. case Keys.Delete:
  2929. case Keys.D0:
  2930. case Keys.NumPad0:
  2931. case Keys.F2:
  2932. return true;
  2933. }
  2934. return false;
  2935. }
  2936. protected virtual void OnAllowUserToAddRowsChanged (EventArgs e)
  2937. {
  2938. EventHandler eh = (EventHandler)(Events [AllowUserToAddRowsChangedEvent]);
  2939. if (eh != null)
  2940. eh (this, e);
  2941. }
  2942. protected virtual void OnAllowUserToDeleteRowsChanged (EventArgs e)
  2943. {
  2944. EventHandler eh = (EventHandler)(Events [AllowUserToDeleteRowsChangedEvent]);
  2945. if (eh != null)
  2946. eh (this, e);
  2947. }
  2948. protected virtual void OnAllowUserToOrderColumnsChanged (EventArgs e)
  2949. {
  2950. EventHandler eh = (EventHandler)(Events [AllowUserToOrderColumnsChangedEvent]);
  2951. if (eh != null)
  2952. eh (this, e);
  2953. }
  2954. protected virtual void OnAllowUserToResizeColumnsChanged (EventArgs e)
  2955. {
  2956. EventHandler eh = (EventHandler)(Events [AllowUserToResizeColumnsChangedEvent]);
  2957. if (eh != null)
  2958. eh (this, e);
  2959. }
  2960. protected virtual void OnAllowUserToResizeRowsChanged (EventArgs e)
  2961. {
  2962. EventHandler eh = (EventHandler)(Events [AllowUserToResizeRowsChangedEvent]);
  2963. if (eh != null)
  2964. eh (this, e);
  2965. }
  2966. protected virtual void OnAlternatingRowsDefaultCellStyleChanged (EventArgs e)
  2967. {
  2968. EventHandler eh = (EventHandler)(Events [AlternatingRowsDefaultCellStyleChangedEvent]);
  2969. if (eh != null)
  2970. eh (this, e);
  2971. }
  2972. protected virtual void OnAutoGenerateColumnsChanged (EventArgs e)
  2973. {
  2974. EventHandler eh = (EventHandler)(Events [AutoGenerateColumnsChangedEvent]);
  2975. if (eh != null)
  2976. eh (this, e);
  2977. }
  2978. protected internal virtual void OnAutoSizeColumnModeChanged (DataGridViewAutoSizeColumnModeEventArgs e)
  2979. {
  2980. DataGridViewAutoSizeColumnModeEventHandler eh = (DataGridViewAutoSizeColumnModeEventHandler)(Events [AutoSizeColumnModeChangedEvent]);
  2981. if (eh != null)
  2982. eh (this, e);
  2983. }
  2984. protected virtual void OnAutoSizeColumnsModeChanged (DataGridViewAutoSizeColumnsModeEventArgs e)
  2985. {
  2986. DataGridViewAutoSizeColumnsModeEventHandler eh = (DataGridViewAutoSizeColumnsModeEventHandler)(Events [AutoSizeColumnsModeChangedEvent]);
  2987. if (eh != null)
  2988. eh (this, e);
  2989. }
  2990. protected virtual void OnAutoSizeRowsModeChanged (DataGridViewAutoSizeModeEventArgs e)
  2991. {
  2992. DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [AutoSizeRowsModeChangedEvent]);
  2993. if (eh != null)
  2994. eh (this, e);
  2995. }
  2996. protected virtual void OnBackgroundColorChanged (EventArgs e)
  2997. {
  2998. EventHandler eh = (EventHandler)(Events [BackgroundColorChangedEvent]);
  2999. if (eh != null)
  3000. eh (this, e);
  3001. }
  3002. protected override void OnBindingContextChanged (EventArgs e)
  3003. {
  3004. base.OnBindingContextChanged(e);
  3005. ReBind();
  3006. }
  3007. protected virtual void OnBorderStyleChanged (EventArgs e)
  3008. {
  3009. EventHandler eh = (EventHandler)(Events [BorderStyleChangedEvent]);
  3010. if (eh != null)
  3011. eh (this, e);
  3012. }
  3013. protected virtual void OnCancelRowEdit (QuestionEventArgs e) {
  3014. QuestionEventHandler eh = (QuestionEventHandler)(Events [CancelRowEditEvent]);
  3015. if (eh != null)
  3016. eh (this, e);
  3017. }
  3018. protected virtual void OnCellBeginEdit (DataGridViewCellCancelEventArgs e)
  3019. {
  3020. DataGridViewCellCancelEventHandler eh = (DataGridViewCellCancelEventHandler)(Events [CellBeginEditEvent]);
  3021. if (eh != null)
  3022. eh (this, e);
  3023. }
  3024. protected virtual void OnCellBorderStyleChanged (EventArgs e)
  3025. {
  3026. EventHandler eh = (EventHandler)(Events [CellBorderStyleChangedEvent]);
  3027. if (eh != null)
  3028. eh (this, e);
  3029. }
  3030. protected virtual void OnCellClick (DataGridViewCellEventArgs e)
  3031. {
  3032. DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
  3033. cell.OnClickInternal (e);
  3034. DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellClickEvent]);
  3035. if (eh != null)
  3036. eh (this, e);
  3037. }
  3038. protected virtual void OnCellContentClick (DataGridViewCellEventArgs e)
  3039. {
  3040. DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
  3041. cell.OnContentClickInternal (e);
  3042. DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContentClickEvent]);
  3043. if (eh != null)
  3044. eh (this, e);
  3045. }
  3046. protected virtual void OnCellContentDoubleClick (DataGridViewCellEventArgs e)
  3047. {
  3048. DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
  3049. cell.OnContentDoubleClickInternal (e);
  3050. DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContentDoubleClickEvent]);
  3051. if (eh != null)
  3052. eh (this, e);
  3053. }
  3054. protected virtual void OnCellContextMenuStripChanged (DataGridViewCellEventArgs e)
  3055. {
  3056. DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellContextMenuStripChangedEvent]);
  3057. if (eh != null)
  3058. eh (this, e);
  3059. }
  3060. protected virtual void OnCellContextMenuStripNeeded (DataGridViewCellContextMenuStripNeededEventArgs e)
  3061. {
  3062. DataGridViewCellContextMenuStripNeededEventHandler eh = (DataGridViewCellContextMenuStripNeededEventHandler)(Events [CellContextMenuStripNeededEvent]);
  3063. if (eh != null)
  3064. eh (this, e);
  3065. }
  3066. protected virtual void OnCellDoubleClick (DataGridViewCellEventArgs e)
  3067. {
  3068. DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
  3069. cell.OnDoubleClickInternal (e);
  3070. DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellDoubleClickEvent]);
  3071. if (eh != null)
  3072. eh (this, e);
  3073. }
  3074. protected virtual void OnCellEndEdit (DataGridViewCellEventArgs e)
  3075. {
  3076. DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellEndEditEvent]);
  3077. if (eh != null)
  3078. eh (this, e);
  3079. }
  3080. protected virtual void OnCellEnter (DataGridViewCellEventArgs e)
  3081. {
  3082. DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
  3083. cell.OnEnterInternal (e.RowIndex, true);
  3084. DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellEnterEvent]);
  3085. if (eh != null)
  3086. eh (this, e);
  3087. }
  3088. protected internal virtual void OnCellErrorTextChanged (DataGridViewCellEventArgs e)
  3089. {
  3090. DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellErrorTextChangedEvent]);
  3091. if (eh != null)
  3092. eh (this, e);
  3093. }
  3094. protected virtual void OnCellErrorTextNeeded (DataGridViewCellErrorTextNeededEventArgs e)
  3095. {
  3096. DataGridViewCellErrorTextNeededEventHandler eh = (DataGridViewCellErrorTextNeededEventHandler)(Events [CellErrorTextNeededEvent]);
  3097. if (eh != null)
  3098. eh (this, e);
  3099. }
  3100. internal void OnCellFormattingInternal (DataGridViewCellFormattingEventArgs e)
  3101. {
  3102. OnCellFormatting (e);
  3103. }
  3104. protected virtual void OnCellFormatting (DataGridViewCellFormattingEventArgs e)
  3105. {
  3106. DataGridViewCellFormattingEventHandler eh = (DataGridViewCellFormattingEventHandler)(Events [CellFormattingEvent]);
  3107. if (eh != null)
  3108. eh (this, e);
  3109. }
  3110. protected virtual void OnCellLeave (DataGridViewCellEventArgs e)
  3111. {
  3112. DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
  3113. cell.OnLeaveInternal (e.RowIndex, true);
  3114. DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellLeaveEvent]);
  3115. if (eh != null)
  3116. eh (this, e);
  3117. }
  3118. protected virtual void OnCellMouseClick (DataGridViewCellMouseEventArgs e)
  3119. {
  3120. DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
  3121. cell.OnMouseClickInternal (e);
  3122. DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseClickEvent]);
  3123. if (eh != null)
  3124. eh (this, e);
  3125. }
  3126. protected virtual void OnCellMouseDoubleClick (DataGridViewCellMouseEventArgs e)
  3127. {
  3128. DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
  3129. cell.OnMouseDoubleClickInternal (e);
  3130. DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseDoubleClickEvent]);
  3131. if (eh != null)
  3132. eh (this, e);
  3133. }
  3134. protected virtual void OnCellMouseDown (DataGridViewCellMouseEventArgs e)
  3135. {
  3136. DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
  3137. cell.OnMouseDownInternal (e);
  3138. DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseDownEvent]);
  3139. if (eh != null)
  3140. eh (this, e);
  3141. }
  3142. protected virtual void OnCellMouseEnter (DataGridViewCellEventArgs e)
  3143. {
  3144. DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
  3145. cell.OnMouseEnterInternal (e.RowIndex);
  3146. DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellMouseEnterEvent]);
  3147. if (eh != null)
  3148. eh (this, e);
  3149. }
  3150. protected virtual void OnCellMouseLeave (DataGridViewCellEventArgs e)
  3151. {
  3152. DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
  3153. cell.OnMouseLeaveInternal (e.RowIndex);
  3154. DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellMouseLeaveEvent]);
  3155. if (eh != null)
  3156. eh (this, e);
  3157. }
  3158. protected virtual void OnCellMouseMove (DataGridViewCellMouseEventArgs e)
  3159. {
  3160. DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
  3161. cell.OnMouseMoveInternal (e);
  3162. DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseMoveEvent]);
  3163. if (eh != null)
  3164. eh (this, e);
  3165. }
  3166. protected virtual void OnCellMouseUp (DataGridViewCellMouseEventArgs e)
  3167. {
  3168. DataGridViewCell cell = GetCellInternal (e.ColumnIndex, e.RowIndex);
  3169. cell.OnMouseUpInternal (e);
  3170. DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [CellMouseUpEvent]);
  3171. if (eh != null)
  3172. eh (this, e);
  3173. }
  3174. internal void OnCellPaintingInternal (DataGridViewCellPaintingEventArgs e)
  3175. {
  3176. OnCellPainting (e);
  3177. }
  3178. protected virtual void OnCellPainting (DataGridViewCellPaintingEventArgs e)
  3179. {
  3180. DataGridViewCellPaintingEventHandler eh = (DataGridViewCellPaintingEventHandler)(Events [CellPaintingEvent]);
  3181. if (eh != null)
  3182. eh (this, e);
  3183. }
  3184. protected internal virtual void OnCellParsing (DataGridViewCellParsingEventArgs e)
  3185. {
  3186. DataGridViewCellParsingEventHandler eh = (DataGridViewCellParsingEventHandler)(Events [CellParsingEvent]);
  3187. if (eh != null)
  3188. eh (this, e);
  3189. }
  3190. internal void OnCellStateChangedInternal (DataGridViewCellStateChangedEventArgs e) {
  3191. this.OnCellStateChanged (e);
  3192. }
  3193. protected virtual void OnCellStateChanged (DataGridViewCellStateChangedEventArgs e)
  3194. {
  3195. DataGridViewCellStateChangedEventHandler eh = (DataGridViewCellStateChangedEventHandler)(Events [CellStateChangedEvent]);
  3196. if (eh != null)
  3197. eh (this, e);
  3198. }
  3199. protected virtual void OnCellStyleChanged (DataGridViewCellEventArgs e)
  3200. {
  3201. DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellStyleChangedEvent]);
  3202. if (eh != null)
  3203. eh (this, e);
  3204. }
  3205. protected virtual void OnCellStyleContentChanged (DataGridViewCellStyleContentChangedEventArgs e) {
  3206. DataGridViewCellStyleContentChangedEventHandler eh = (DataGridViewCellStyleContentChangedEventHandler)(Events [CellStyleContentChangedEvent]);
  3207. if (eh != null)
  3208. eh (this, e);
  3209. }
  3210. protected virtual void OnCellToolTipTextChanged (DataGridViewCellEventArgs e) {
  3211. DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellToolTipTextChangedEvent]);
  3212. if (eh != null)
  3213. eh (this, e);
  3214. }
  3215. protected virtual void OnCellToolTipTextNeeded (DataGridViewCellToolTipTextNeededEventArgs e)
  3216. {
  3217. DataGridViewCellToolTipTextNeededEventHandler eh = (DataGridViewCellToolTipTextNeededEventHandler)(Events [CellToolTipTextNeededEvent]);
  3218. if (eh != null)
  3219. eh (this, e);
  3220. }
  3221. protected virtual void OnCellValidated (DataGridViewCellEventArgs e)
  3222. {
  3223. DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellValidatedEvent]);
  3224. if (eh != null)
  3225. eh (this, e);
  3226. }
  3227. protected virtual void OnCellValidating (DataGridViewCellValidatingEventArgs e)
  3228. {
  3229. DataGridViewCellValidatingEventHandler eh = (DataGridViewCellValidatingEventHandler)(Events [CellValidatingEvent]);
  3230. if (eh != null)
  3231. eh (this, e);
  3232. }
  3233. protected virtual void OnCellValueChanged (DataGridViewCellEventArgs e)
  3234. {
  3235. DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [CellValueChangedEvent]);
  3236. if (eh != null)
  3237. eh (this, e);
  3238. }
  3239. protected internal virtual void OnCellValueNeeded (DataGridViewCellValueEventArgs e)
  3240. {
  3241. DataGridViewCellValueEventHandler eh = (DataGridViewCellValueEventHandler)(Events [CellValueNeededEvent]);
  3242. if (eh != null)
  3243. eh (this, e);
  3244. }
  3245. protected internal virtual void OnCellValuePushed (DataGridViewCellValueEventArgs e)
  3246. {
  3247. DataGridViewCellValueEventHandler eh = (DataGridViewCellValueEventHandler)(Events [CellValuePushedEvent]);
  3248. if (eh != null)
  3249. eh (this, e);
  3250. }
  3251. internal void OnColumnAddedInternal (DataGridViewColumnEventArgs e)
  3252. {
  3253. e.Column.DataColumnIndex = FindDataColumnIndex (e.Column);
  3254. if (e.Column.CellTemplate != null) {
  3255. // The first column has just been added programatically instead of
  3256. // autogenerated so we need to create the rows for the first time.
  3257. //
  3258. if (!is_autogenerating_columns && columns.Count == 1)
  3259. ReBind ();
  3260. // Add/Remove/Update the cells in the existing rows
  3261. foreach (DataGridViewRow row in Rows) {
  3262. if (row.Index == NewRowIndex)
  3263. continue;
  3264. DataGridViewCell newCell = (DataGridViewCell)e.Column.CellTemplate.Clone ();
  3265. if (row.Cells.Count == columns.Count) {
  3266. DataGridViewCell oldCell = row.Cells[e.Column.Index];
  3267. if (currentCell != null && oldCell == currentCell)
  3268. currentCell = newCell;
  3269. // copy the value only if the cell is not-databound
  3270. if (!e.Column.IsDataBound && oldCell.OwningRow.DataBoundItem == null)
  3271. newCell.Value = oldCell.Value;
  3272. row.Cells.Replace (e.Column.Index, newCell);
  3273. } else if (e.Column.Index >= row.Cells.Count)
  3274. row.Cells.Add (newCell);
  3275. else
  3276. row.Cells.Insert (e.Column.Index, newCell);
  3277. }
  3278. }
  3279. AutoResizeColumnsInternal ();
  3280. OnColumnAdded (e);
  3281. PrepareEditingRow (false, true);
  3282. }
  3283. private int FindDataColumnIndex (DataGridViewColumn column)
  3284. {
  3285. if (column != null && DataManager != null) {
  3286. PropertyDescriptorCollection properties = DataManager.GetItemProperties();
  3287. for (int i = 0; i < properties.Count; i++) {
  3288. if (String.Compare (column.DataPropertyName, properties[i].Name, true) == 0)
  3289. return i;
  3290. }
  3291. }
  3292. return -1;
  3293. }
  3294. protected virtual void OnColumnAdded (DataGridViewColumnEventArgs e)
  3295. {
  3296. DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnAddedEvent]);
  3297. if (eh != null)
  3298. eh (this, e);
  3299. }
  3300. protected internal virtual void OnColumnContextMenuStripChanged (DataGridViewColumnEventArgs e)
  3301. {
  3302. DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnContextMenuStripChangedEvent]);
  3303. if (eh != null)
  3304. eh (this, e);
  3305. }
  3306. protected internal virtual void OnColumnDataPropertyNameChanged (DataGridViewColumnEventArgs e)
  3307. {
  3308. DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDataPropertyNameChangedEvent]);
  3309. if (eh != null)
  3310. eh (this, e);
  3311. }
  3312. protected internal virtual void OnColumnDefaultCellStyleChanged (DataGridViewColumnEventArgs e)
  3313. {
  3314. DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDefaultCellStyleChangedEvent]);
  3315. if (eh != null)
  3316. eh (this, e);
  3317. }
  3318. protected internal virtual void OnColumnDisplayIndexChanged (DataGridViewColumnEventArgs e)
  3319. {
  3320. DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDisplayIndexChangedEvent]);
  3321. if (eh != null)
  3322. eh (this, e);
  3323. }
  3324. protected virtual void OnColumnDividerDoubleClick (DataGridViewColumnDividerDoubleClickEventArgs e)
  3325. {
  3326. DataGridViewColumnDividerDoubleClickEventHandler eh = (DataGridViewColumnDividerDoubleClickEventHandler)(Events [ColumnDividerDoubleClickEvent]);
  3327. if (eh != null)
  3328. eh (this, e);
  3329. }
  3330. protected internal virtual void OnColumnDividerWidthChanged (DataGridViewColumnEventArgs e)
  3331. {
  3332. DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnDividerWidthChangedEvent]);
  3333. if (eh != null)
  3334. eh (this, e);
  3335. }
  3336. protected internal virtual void OnColumnHeaderCellChanged (DataGridViewColumnEventArgs e)
  3337. {
  3338. DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnHeaderCellChangedEvent]);
  3339. if (eh != null)
  3340. eh (this, e);
  3341. }
  3342. protected virtual void OnColumnHeaderMouseClick (DataGridViewCellMouseEventArgs e)
  3343. {
  3344. DataGridViewColumn col = Columns[e.ColumnIndex];
  3345. if (col.SortMode == DataGridViewColumnSortMode.Automatic) {
  3346. ListSortDirection new_order;
  3347. // Always use ascending unless we are clicking on a
  3348. // column that is already sorted ascending.
  3349. if (SortedColumn != col || sortOrder != SortOrder.Ascending)
  3350. new_order = ListSortDirection.Ascending;
  3351. else
  3352. new_order = ListSortDirection.Descending;
  3353. Sort (col, new_order);
  3354. }
  3355. DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [ColumnHeaderMouseClickEvent]);
  3356. if (eh != null)
  3357. eh (this, e);
  3358. }
  3359. protected virtual void OnColumnHeaderMouseDoubleClick (DataGridViewCellMouseEventArgs e)
  3360. {
  3361. DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [ColumnHeaderMouseDoubleClickEvent]);
  3362. if (eh != null)
  3363. eh (this, e);
  3364. }
  3365. protected virtual void OnColumnHeadersBorderStyleChanged (EventArgs e)
  3366. {
  3367. EventHandler eh = (EventHandler)(Events [ColumnHeadersBorderStyleChangedEvent]);
  3368. if (eh != null)
  3369. eh (this, e);
  3370. }
  3371. protected virtual void OnColumnHeadersDefaultCellStyleChanged (EventArgs e)
  3372. {
  3373. EventHandler eh = (EventHandler)(Events [ColumnHeadersDefaultCellStyleChangedEvent]);
  3374. if (eh != null)
  3375. eh (this, e);
  3376. }
  3377. protected virtual void OnColumnHeadersHeightChanged (EventArgs e)
  3378. {
  3379. EventHandler eh = (EventHandler)(Events [ColumnHeadersHeightChangedEvent]);
  3380. if (eh != null)
  3381. eh (this, e);
  3382. }
  3383. protected virtual void OnColumnHeadersHeightSizeModeChanged (DataGridViewAutoSizeModeEventArgs e)
  3384. {
  3385. DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [ColumnHeadersHeightSizeModeChangedEvent]);
  3386. if (eh != null)
  3387. eh (this, e);
  3388. }
  3389. protected internal virtual void OnColumnMinimumWidthChanged (DataGridViewColumnEventArgs e)
  3390. {
  3391. DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnMinimumWidthChangedEvent]);
  3392. if (eh != null)
  3393. eh (this, e);
  3394. }
  3395. protected internal virtual void OnColumnNameChanged (DataGridViewColumnEventArgs e)
  3396. {
  3397. DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnNameChangedEvent]);
  3398. if (eh != null)
  3399. eh (this, e);
  3400. }
  3401. internal void OnColumnPreRemovedInternal (DataGridViewColumnEventArgs e)
  3402. {
  3403. // The removed column should be removed from the selection too.
  3404. if (selected_columns != null)
  3405. SetSelectedColumnCore (e.Column.Index, false);
  3406. if (Columns.Count - 1 == 0) {
  3407. MoveCurrentCell (-1, -1, true, false, false, true);
  3408. rows.ClearInternal ();
  3409. } else if (currentCell != null && CurrentCell.ColumnIndex == e.Column.Index) {
  3410. int nextColumnIndex = e.Column.Index;
  3411. if (nextColumnIndex >= Columns.Count - 1)
  3412. nextColumnIndex = Columns.Count - 1 - 1;
  3413. MoveCurrentCell (nextColumnIndex, currentCell.RowIndex, true, false, false, true);
  3414. if (hover_cell != null && hover_cell.ColumnIndex >= e.Column.Index)
  3415. hover_cell = null;
  3416. }
  3417. }
  3418. private void OnColumnPostRemovedInternal (DataGridViewColumnEventArgs e)
  3419. {
  3420. if (e.Column.CellTemplate != null) {
  3421. int index = e.Column.Index;
  3422. foreach (DataGridViewRow row in Rows)
  3423. row.Cells.RemoveAt (index);
  3424. }
  3425. AutoResizeColumnsInternal ();
  3426. PrepareEditingRow (false, true);
  3427. OnColumnRemoved (e);
  3428. }
  3429. protected virtual void OnColumnRemoved (DataGridViewColumnEventArgs e)
  3430. {
  3431. DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnRemovedEvent]);
  3432. if (eh != null)
  3433. eh (this, e);
  3434. }
  3435. protected internal virtual void OnColumnSortModeChanged (DataGridViewColumnEventArgs e)
  3436. {
  3437. DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnSortModeChangedEvent]);
  3438. if (eh != null)
  3439. eh (this, e);
  3440. }
  3441. protected internal virtual void OnColumnStateChanged (DataGridViewColumnStateChangedEventArgs e)
  3442. {
  3443. DataGridViewColumnStateChangedEventHandler eh = (DataGridViewColumnStateChangedEventHandler)(Events [ColumnStateChangedEvent]);
  3444. if (eh != null)
  3445. eh (this, e);
  3446. }
  3447. protected internal virtual void OnColumnToolTipTextChanged (DataGridViewColumnEventArgs e)
  3448. {
  3449. DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnToolTipTextChangedEvent]);
  3450. if (eh != null)
  3451. eh (this, e);
  3452. }
  3453. protected internal virtual void OnColumnWidthChanged (DataGridViewColumnEventArgs e)
  3454. {
  3455. DataGridViewColumnEventHandler eh = (DataGridViewColumnEventHandler)(Events [ColumnWidthChangedEvent]);
  3456. if (eh != null)
  3457. eh (this, e);
  3458. }
  3459. protected virtual void OnCurrentCellChanged (EventArgs e)
  3460. {
  3461. EventHandler eh = (EventHandler)(Events [CurrentCellChangedEvent]);
  3462. if (eh != null)
  3463. eh (this, e);
  3464. }
  3465. protected virtual void OnCurrentCellDirtyStateChanged (EventArgs e)
  3466. {
  3467. EventHandler eh = (EventHandler)(Events [CurrentCellDirtyStateChangedEvent]);
  3468. if (eh != null)
  3469. eh (this, e);
  3470. }
  3471. protected override void OnCursorChanged (EventArgs e)
  3472. {
  3473. base.OnCursorChanged (e);
  3474. }
  3475. protected virtual void OnDataBindingComplete (DataGridViewBindingCompleteEventArgs e)
  3476. {
  3477. DataGridViewBindingCompleteEventHandler eh = (DataGridViewBindingCompleteEventHandler)(Events [DataBindingCompleteEvent]);
  3478. if (eh != null)
  3479. eh (this, e);
  3480. }
  3481. protected virtual void OnDataError (bool displayErrorDialogIfNoHandler, DataGridViewDataErrorEventArgs e)
  3482. {
  3483. DataGridViewDataErrorEventHandler eh = (DataGridViewDataErrorEventHandler)(Events [DataErrorEvent]);
  3484. if (eh != null)
  3485. eh (this, e);
  3486. else if (displayErrorDialogIfNoHandler)
  3487. MessageBox.Show (e.ToString ());
  3488. }
  3489. protected virtual void OnDataMemberChanged (EventArgs e) {
  3490. EventHandler eh = (EventHandler)(Events [DataMemberChangedEvent]);
  3491. if (eh != null)
  3492. eh (this, e);
  3493. }
  3494. protected virtual void OnDataSourceChanged (EventArgs e) {
  3495. EventHandler eh = (EventHandler)(Events [DataSourceChangedEvent]);
  3496. if (eh != null)
  3497. eh (this, e);
  3498. }
  3499. protected virtual void OnDefaultCellStyleChanged (EventArgs e) {
  3500. EventHandler eh = (EventHandler)(Events [DefaultCellStyleChangedEvent]);
  3501. if (eh != null)
  3502. eh (this, e);
  3503. }
  3504. protected virtual void OnDefaultValuesNeeded (DataGridViewRowEventArgs e) {
  3505. DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [DefaultValuesNeededEvent]);
  3506. if (eh != null)
  3507. eh (this, e);
  3508. }
  3509. protected override void OnDoubleClick (EventArgs e) {
  3510. base.OnDoubleClick(e);
  3511. Point mouseLocation = this.PointToClient (Control.MousePosition);
  3512. HitTestInfo hitInfo = HitTest (mouseLocation.X, mouseLocation.Y);
  3513. if (hitInfo.Type == DataGridViewHitTestType.Cell)
  3514. OnCellDoubleClick (new DataGridViewCellEventArgs (hitInfo.ColumnIndex, hitInfo.RowIndex));
  3515. }
  3516. protected virtual void OnEditingControlShowing (DataGridViewEditingControlShowingEventArgs e) {
  3517. DataGridViewEditingControlShowingEventHandler eh = (DataGridViewEditingControlShowingEventHandler)(Events [EditingControlShowingEvent]);
  3518. if (eh != null)
  3519. eh (this, e);
  3520. }
  3521. protected virtual void OnEditModeChanged (EventArgs e)
  3522. {
  3523. EventHandler eh = (EventHandler)(Events [EditModeChangedEvent]);
  3524. if (eh != null)
  3525. eh (this, e);
  3526. }
  3527. protected override void OnEnabledChanged (EventArgs e)
  3528. {
  3529. base.OnEnabledChanged(e);
  3530. }
  3531. protected override void OnEnter (EventArgs e )
  3532. {
  3533. base.OnEnter(e);
  3534. }
  3535. protected override void OnGotFocus(EventArgs e)
  3536. {
  3537. base.OnGotFocus (e);
  3538. // To add focus rectangle if needed
  3539. if (currentCell != null && ShowFocusCues)
  3540. InvalidateCell (currentCell);
  3541. }
  3542. protected override void OnFontChanged (EventArgs e)
  3543. {
  3544. base.OnFontChanged(e);
  3545. }
  3546. protected override void OnForeColorChanged (EventArgs e)
  3547. {
  3548. base.OnForeColorChanged(e);
  3549. }
  3550. protected virtual void OnGridColorChanged (EventArgs e)
  3551. {
  3552. EventHandler eh = (EventHandler)(Events [GridColorChangedEvent]);
  3553. if (eh != null)
  3554. eh (this, e);
  3555. }
  3556. protected override void OnHandleCreated (EventArgs e)
  3557. {
  3558. base.OnHandleCreated(e);
  3559. ReBind ();
  3560. if (DataManager == null && CurrentCell == null && Rows.Count > 0 && Columns.Count > 0)
  3561. MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, false, false, false);
  3562. }
  3563. protected override void OnHandleDestroyed(EventArgs e)
  3564. {
  3565. base.OnHandleDestroyed (e);
  3566. }
  3567. [EditorBrowsable (EditorBrowsableState.Advanced)]
  3568. protected override void OnKeyDown (KeyEventArgs e)
  3569. {
  3570. base.OnKeyDown (e);
  3571. e.Handled = ProcessDataGridViewKey (e);
  3572. }
  3573. [EditorBrowsable (EditorBrowsableState.Advanced)]
  3574. protected override void OnKeyPress (KeyPressEventArgs e)
  3575. {
  3576. base.OnKeyPress(e);
  3577. }
  3578. [EditorBrowsable (EditorBrowsableState.Advanced)]
  3579. protected override void OnKeyUp (KeyEventArgs e)
  3580. {
  3581. base.OnKeyUp(e);
  3582. }
  3583. protected override void OnLayout (LayoutEventArgs e)
  3584. {
  3585. if (horizontalScrollBar.Visible && verticalScrollBar.Visible) {
  3586. horizontalScrollBar.Bounds = new Rectangle (BorderWidth, Height - BorderWidth - horizontalScrollBar.Height, Width - (2 * BorderWidth) - verticalScrollBar.Width, horizontalScrollBar.Height);
  3587. verticalScrollBar.Bounds = new Rectangle (Width - BorderWidth - verticalScrollBar.Width, BorderWidth, verticalScrollBar.Width, Height - (2 * BorderWidth) - horizontalScrollBar.Height);
  3588. } else if (horizontalScrollBar.Visible)
  3589. horizontalScrollBar.Bounds = new Rectangle (BorderWidth, Height - BorderWidth - horizontalScrollBar.Height, Width - (2 * BorderWidth), horizontalScrollBar.Height);
  3590. else if (verticalScrollBar.Visible)
  3591. verticalScrollBar.Bounds = new Rectangle (Width - BorderWidth - verticalScrollBar.Width, BorderWidth, verticalScrollBar.Width, Height - (2 * BorderWidth));
  3592. AutoResizeColumnsInternal ();
  3593. Invalidate ();
  3594. }
  3595. protected override void OnLeave (EventArgs e)
  3596. {
  3597. EndEdit (DataGridViewDataErrorContexts.LeaveControl);
  3598. base.OnLeave(e);
  3599. }
  3600. protected override void OnLostFocus(EventArgs e)
  3601. {
  3602. base.OnLostFocus (e);
  3603. // To remove focus rectangle if needed
  3604. if (currentCell != null && ShowFocusCues)
  3605. InvalidateCell (currentCell);
  3606. }
  3607. protected override void OnMouseClick (MouseEventArgs e)
  3608. {
  3609. base.OnMouseClick(e);
  3610. if (column_resize_active || row_resize_active)
  3611. return;
  3612. //Console.WriteLine("Mouse: Clicks: {0}; Delta: {1}; X: {2}; Y: {3};", e.Clicks, e.Delta, e.X, e.Y);
  3613. HitTestInfo hit = HitTest (e.X, e.Y);
  3614. switch (hit.Type) {
  3615. case DataGridViewHitTestType.Cell:
  3616. Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
  3617. Point cellpoint = new Point (e.X - display.X, e.Y - display.Y);
  3618. OnCellMouseClick (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, cellpoint.X, cellpoint.Y, e));
  3619. DataGridViewCell cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex);
  3620. if (cell.GetContentBounds (hit.RowIndex).Contains (cellpoint)) {
  3621. DataGridViewCellEventArgs dgvcea = new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex);
  3622. OnCellContentClick (dgvcea);
  3623. }
  3624. break;
  3625. case DataGridViewHitTestType.ColumnHeader:
  3626. Rectangle display2 = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
  3627. Point cellpoint2 = new Point (e.X - display2.X, e.Y - display2.Y);
  3628. OnColumnHeaderMouseClick (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, cellpoint2.X, cellpoint2.Y, e));
  3629. break;
  3630. }
  3631. }
  3632. protected override void OnMouseDoubleClick (MouseEventArgs e)
  3633. {
  3634. base.OnMouseDoubleClick(e);
  3635. HitTestInfo hitInfo = HitTest (e.X, e.Y);
  3636. if (hitInfo.Type == DataGridViewHitTestType.Cell)
  3637. OnCellMouseDoubleClick (new DataGridViewCellMouseEventArgs (hitInfo.ColumnIndex, hitInfo.RowIndex,
  3638. hitInfo.ColumnX, hitInfo.RowY, e));
  3639. }
  3640. private void DoSelectionOnMouseDown (HitTestInfo hitTest)
  3641. {
  3642. Keys modifiers = Control.ModifierKeys;
  3643. bool isControl = (modifiers & Keys.Control) != 0;
  3644. bool isShift = (modifiers & Keys.Shift) != 0;
  3645. //bool isRowHeader = hitTest.Type == DataGridViewHitTestType.RowHeader;
  3646. //bool isColHeader = hitTest.Type == DataGridViewHitTestType.ColumnHeader;
  3647. DataGridViewSelectionMode mode;
  3648. switch (hitTest.Type) {
  3649. case DataGridViewHitTestType.Cell:
  3650. mode = selectionMode;
  3651. break;
  3652. case DataGridViewHitTestType.ColumnHeader:
  3653. mode = selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect ? DataGridViewSelectionMode.FullColumnSelect : selectionMode;
  3654. if (mode != DataGridViewSelectionMode.FullColumnSelect)
  3655. return;
  3656. break;
  3657. case DataGridViewHitTestType.RowHeader:
  3658. mode = selectionMode == DataGridViewSelectionMode.RowHeaderSelect ? DataGridViewSelectionMode.FullRowSelect : selectionMode;
  3659. if (mode != DataGridViewSelectionMode.FullRowSelect)
  3660. return;
  3661. break; // Handled below
  3662. default:
  3663. return;
  3664. }
  3665. if (!isControl) {
  3666. // If SHIFT is pressed:
  3667. // Select all from selected_row/column/cell to current row/column/cell, unselect everything else
  3668. // otherwise:
  3669. // Unselect all rows/columns/cells, select the clicked one
  3670. int min_row, max_row;
  3671. int min_col, max_col;
  3672. if (!isShift) {
  3673. selected_row = hitTest.RowIndex;
  3674. selected_column = hitTest.ColumnIndex;
  3675. }
  3676. if (!isShift) {
  3677. if (selected_row != -1)
  3678. selected_row = hitTest.RowIndex;
  3679. if (selected_column != -1)
  3680. selected_column = hitTest.ColumnIndex;
  3681. }
  3682. if (selected_row >= hitTest.RowIndex) {
  3683. min_row = hitTest.RowIndex;
  3684. max_row = isShift ? selected_row : min_row;
  3685. } else {
  3686. max_row = hitTest.RowIndex;
  3687. min_row = isShift ? selected_row : max_row;
  3688. }
  3689. if (selected_column >= hitTest.ColumnIndex) {
  3690. min_col = hitTest.ColumnIndex;
  3691. max_col = isShift ? selected_column : min_col;
  3692. } else {
  3693. max_col = hitTest.ColumnIndex;
  3694. min_col = isShift ? selected_column : max_col;
  3695. }
  3696. switch (mode) {
  3697. case DataGridViewSelectionMode.FullRowSelect:
  3698. for (int i = 0; i < RowCount; i++) {
  3699. bool select = i >= min_row && i <= max_row;
  3700. if (!select) {
  3701. for (int c = 0; c < ColumnCount; c++) {
  3702. if (Rows [i].Cells [c].Selected) {
  3703. SetSelectedCellCore (c, i, false);
  3704. }
  3705. }
  3706. }
  3707. if (select != Rows [i].Selected) {
  3708. SetSelectedRowCore (i, select);
  3709. }
  3710. }
  3711. break;
  3712. case DataGridViewSelectionMode.FullColumnSelect:
  3713. for (int i = 0; i < ColumnCount; i++) {
  3714. bool select = i >= min_col && i <= max_col;
  3715. if (!select) {
  3716. for (int r = 0; r < RowCount; r++) {
  3717. if (Rows [r].Cells [i].Selected) {
  3718. SetSelectedCellCore (i, r, false);
  3719. }
  3720. }
  3721. }
  3722. if (select != Columns [i].Selected) {
  3723. SetSelectedColumnCore (i, select);
  3724. }
  3725. }
  3726. break;
  3727. case DataGridViewSelectionMode.ColumnHeaderSelect:
  3728. case DataGridViewSelectionMode.RowHeaderSelect:
  3729. //break;
  3730. case DataGridViewSelectionMode.CellSelect:
  3731. if (!isShift) {
  3732. for (int c = 0; c < ColumnCount; c++) {
  3733. if (columns [c].Selected)
  3734. SetSelectedColumnCore (c, false);
  3735. }
  3736. for (int r = 0; r < RowCount; r++) {
  3737. if (rows [r].Selected)
  3738. SetSelectedRowCore (r, false);
  3739. }
  3740. }
  3741. for (int r = 0; r < RowCount; r++) {
  3742. for (int c = 0; c < ColumnCount; c++) {
  3743. bool select = (r >= min_row && r <= max_row) && (c >= min_col && c <= max_col);
  3744. if (select != Rows [r].Cells [c].Selected)
  3745. SetSelectedCellCore (c, r, select);
  3746. }
  3747. }
  3748. break;
  3749. }
  3750. } else if (isControl) {
  3751. // Switch the selected state of the row.
  3752. switch (mode) {
  3753. case DataGridViewSelectionMode.FullRowSelect:
  3754. SetSelectedRowCore (hitTest.RowIndex, !rows [hitTest.RowIndex].Selected);
  3755. break;
  3756. case DataGridViewSelectionMode.FullColumnSelect:
  3757. SetSelectedColumnCore (hitTest.ColumnIndex, !columns [hitTest.ColumnIndex].Selected);
  3758. break;
  3759. case DataGridViewSelectionMode.ColumnHeaderSelect:
  3760. case DataGridViewSelectionMode.RowHeaderSelect:
  3761. //break;
  3762. case DataGridViewSelectionMode.CellSelect:
  3763. if (hitTest.ColumnIndex >= 0 && hitTest.RowIndex >= 0) {
  3764. SetSelectedCellCore (hitTest.ColumnIndex, hitTest.RowIndex, !Rows [hitTest.RowIndex].Cells [hitTest.ColumnIndex].Selected);
  3765. }
  3766. break;
  3767. }
  3768. }
  3769. }
  3770. protected override void OnMouseDown (MouseEventArgs e)
  3771. {
  3772. base.OnMouseDown(e);
  3773. if (!EndEdit ())
  3774. return;
  3775. HitTestInfo hitTest = HitTest(e.X, e.Y);
  3776. DataGridViewCell cell = null;
  3777. DataGridViewRow row = null;
  3778. Rectangle cellBounds;
  3779. if ((hitTest.Type == DataGridViewHitTestType.ColumnHeader ||
  3780. (hitTest.Type == DataGridViewHitTestType.Cell && !ColumnHeadersVisible))
  3781. && MouseOverColumnResize (hitTest.ColumnIndex, e.X)) {
  3782. if (e.Clicks == 2) {
  3783. AutoResizeColumn (hitTest.ColumnIndex);
  3784. return;
  3785. }
  3786. resize_band = hitTest.ColumnIndex;
  3787. column_resize_active = true;
  3788. resize_band_start = e.X;
  3789. resize_band_delta = 0;
  3790. DrawVerticalResizeLine (resize_band_start);
  3791. return;
  3792. }
  3793. if ((hitTest.Type == DataGridViewHitTestType.RowHeader ||
  3794. (hitTest.Type == DataGridViewHitTestType.Cell && !RowHeadersVisible))
  3795. && MouseOverRowResize (hitTest.RowIndex, e.Y)) {
  3796. if (e.Clicks == 2) {
  3797. AutoResizeRow (hitTest.RowIndex);
  3798. return;
  3799. }
  3800. resize_band = hitTest.RowIndex;
  3801. row_resize_active = true;
  3802. resize_band_start = e.Y;
  3803. resize_band_delta = 0;
  3804. DrawHorizontalResizeLine (resize_band_start);
  3805. return;
  3806. }
  3807. if (hitTest.Type == DataGridViewHitTestType.Cell) {
  3808. row = rows [hitTest.RowIndex];
  3809. cell = row.Cells [hitTest.ColumnIndex];
  3810. SetCurrentCellAddressCore (cell.ColumnIndex, cell.RowIndex, false, true, true);
  3811. cellBounds = GetCellDisplayRectangle (hitTest.ColumnIndex, hitTest.RowIndex, false);
  3812. OnCellMouseDown (new DataGridViewCellMouseEventArgs (hitTest.ColumnIndex, hitTest.RowIndex, e.X - cellBounds.X, e.Y - cellBounds.Y, e));
  3813. OnCellClick (new DataGridViewCellEventArgs (hitTest.ColumnIndex, hitTest.RowIndex));
  3814. }
  3815. DoSelectionOnMouseDown (hitTest);
  3816. if (hitTest.Type != DataGridViewHitTestType.Cell) {
  3817. if (hitTest.Type == DataGridViewHitTestType.ColumnHeader)
  3818. pressed_header_cell = columns [hitTest.ColumnIndex].HeaderCell;
  3819. else if (hitTest.Type == DataGridViewHitTestType.RowHeader)
  3820. pressed_header_cell = rows [hitTest.RowIndex].HeaderCell;
  3821. Invalidate ();
  3822. return;
  3823. }
  3824. Invalidate();
  3825. return;
  3826. }
  3827. private void UpdateBindingPosition (int position)
  3828. {
  3829. if (DataManager != null)
  3830. DataManager.Position = position;
  3831. }
  3832. protected override void OnMouseEnter (EventArgs e)
  3833. {
  3834. base.OnMouseEnter(e);
  3835. }
  3836. protected override void OnMouseLeave (EventArgs e)
  3837. {
  3838. base.OnMouseLeave (e);
  3839. if (hover_cell != null) {
  3840. OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
  3841. hover_cell = null;
  3842. }
  3843. EnteredHeaderCell = null;
  3844. }
  3845. protected override void OnMouseMove (MouseEventArgs e)
  3846. {
  3847. base.OnMouseMove (e);
  3848. if (column_resize_active) {
  3849. // Erase the old line
  3850. DrawVerticalResizeLine (resize_band_start + resize_band_delta);
  3851. resize_band_delta = e.X - resize_band_start;
  3852. // Draw the new line
  3853. DrawVerticalResizeLine (resize_band_start + resize_band_delta);
  3854. return;
  3855. }
  3856. if (row_resize_active) {
  3857. // Erase the old line
  3858. DrawHorizontalResizeLine (resize_band_start + resize_band_delta);
  3859. resize_band_delta = e.Y - resize_band_start;
  3860. // Draw the new line
  3861. DrawHorizontalResizeLine (resize_band_start + resize_band_delta);
  3862. return;
  3863. }
  3864. Cursor new_cursor = Cursors.Default;
  3865. HitTestInfo hit = this.HitTest (e.X, e.Y);
  3866. if (hit.Type == DataGridViewHitTestType.ColumnHeader ||
  3867. (!ColumnHeadersVisible && hit.Type == DataGridViewHitTestType.Cell && MouseOverColumnResize (hit.ColumnIndex, e.X))) {
  3868. EnteredHeaderCell = Columns [hit.ColumnIndex].HeaderCell;
  3869. if (MouseOverColumnResize (hit.ColumnIndex, e.X))
  3870. new_cursor = Cursors.VSplit;
  3871. } else if (!RowHeadersVisible && hit.Type == DataGridViewHitTestType.Cell && MouseOverRowResize (hit.RowIndex, e.Y)) {
  3872. EnteredHeaderCell = Rows[hit.RowIndex].HeaderCell;
  3873. new_cursor = Cursors.HSplit;
  3874. } else if (hit.Type == DataGridViewHitTestType.Cell) {
  3875. EnteredHeaderCell = null;
  3876. DataGridViewCell new_cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex);
  3877. // Check if we have moved into an error icon area
  3878. Rectangle icon = new_cell.ErrorIconBounds;
  3879. if (!icon.IsEmpty) {
  3880. Point loc = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false).Location;
  3881. icon.X += loc.X;
  3882. icon.Y += loc.Y;
  3883. if (icon.Contains (e.X, e.Y)) {
  3884. if (tooltip_currently_showing != new_cell)
  3885. MouseEnteredErrorIcon (new_cell);
  3886. } else
  3887. MouseLeftErrorIcon (new_cell);
  3888. }
  3889. Cursor = new_cursor;
  3890. // We have never been in a cell before
  3891. if (hover_cell == null) {
  3892. hover_cell = new_cell;
  3893. OnCellMouseEnter (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex));
  3894. Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
  3895. OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
  3896. return;
  3897. }
  3898. // Were we already in this cell?
  3899. if (hover_cell.RowIndex == hit.RowIndex && hover_cell.ColumnIndex == hit.ColumnIndex) {
  3900. Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
  3901. OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
  3902. return;
  3903. }
  3904. // We are changing cells
  3905. OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
  3906. hover_cell = new_cell;
  3907. OnCellMouseEnter (new DataGridViewCellEventArgs (hit.ColumnIndex, hit.RowIndex));
  3908. Rectangle display2 = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
  3909. OnCellMouseMove (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display2.X, e.Y - display2.Y, e));
  3910. return;
  3911. } else if (hit.Type == DataGridViewHitTestType.RowHeader) {
  3912. DataGridViewRowHeaderCell new_cell = Rows[hit.RowIndex].HeaderCell;
  3913. EnteredHeaderCell = new_cell;
  3914. if (MouseOverRowResize (hit.RowIndex, e.Y))
  3915. new_cursor = Cursors.HSplit;
  3916. // Check if we have moved into an error icon area
  3917. Rectangle icon = new_cell.InternalErrorIconsBounds;
  3918. if (!icon.IsEmpty) {
  3919. Point loc = GetCellDisplayRectangle (0, hit.RowIndex, false).Location;
  3920. icon.X += BorderWidth;
  3921. icon.Y += loc.Y;
  3922. if (icon.Contains (e.X, e.Y)) {
  3923. if (tooltip_currently_showing != new_cell)
  3924. MouseEnteredErrorIcon (new_cell);
  3925. } else
  3926. MouseLeftErrorIcon (new_cell);
  3927. }
  3928. } else if (hit.Type == DataGridViewHitTestType.TopLeftHeader) {
  3929. EnteredHeaderCell = null;
  3930. DataGridViewTopLeftHeaderCell new_cell = (DataGridViewTopLeftHeaderCell)TopLeftHeaderCell;
  3931. // Check if we have moved into an error icon area
  3932. Rectangle icon = new_cell.InternalErrorIconsBounds;
  3933. if (!icon.IsEmpty) {
  3934. Point loc = Point.Empty;
  3935. icon.X += BorderWidth;
  3936. icon.Y += loc.Y;
  3937. if (icon.Contains (e.X, e.Y)) {
  3938. if (tooltip_currently_showing != new_cell)
  3939. MouseEnteredErrorIcon (new_cell);
  3940. } else
  3941. MouseLeftErrorIcon (new_cell);
  3942. }
  3943. } else {
  3944. EnteredHeaderCell = null;
  3945. // We have left the cell area
  3946. if (hover_cell != null) {
  3947. OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
  3948. hover_cell = null;
  3949. }
  3950. }
  3951. Cursor = new_cursor;
  3952. }
  3953. protected override void OnMouseUp (MouseEventArgs e)
  3954. {
  3955. base.OnMouseUp(e);
  3956. if (column_resize_active) {
  3957. column_resize_active = false;
  3958. if (resize_band_delta + Columns[resize_band].Width < 0)
  3959. resize_band_delta = -Columns[resize_band].Width;
  3960. Columns[resize_band].Width = Math.Max (resize_band_delta + Columns[resize_band].Width, Columns[resize_band].MinimumWidth);
  3961. Invalidate ();
  3962. return;
  3963. }
  3964. if (row_resize_active) {
  3965. row_resize_active = false;
  3966. if (resize_band_delta + Rows[resize_band].Height < 0)
  3967. resize_band_delta = -Rows[resize_band].Height;
  3968. Rows[resize_band].Height = Math.Max (resize_band_delta + Rows[resize_band].Height, Rows[resize_band].MinimumHeight);
  3969. Invalidate ();
  3970. return;
  3971. }
  3972. HitTestInfo hit = this.HitTest (e.X, e.Y);
  3973. if (hit.Type == DataGridViewHitTestType.Cell) {
  3974. Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
  3975. OnCellMouseUp (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
  3976. }
  3977. if (pressed_header_cell != null) {
  3978. DataGridViewHeaderCell cell = pressed_header_cell;
  3979. pressed_header_cell = null;
  3980. if (ThemeEngine.Current.DataGridViewHeaderCellHasPressedStyle (this))
  3981. Invalidate (GetHeaderCellBounds (cell));
  3982. }
  3983. }
  3984. protected override void OnMouseWheel (MouseEventArgs e)
  3985. {
  3986. base.OnMouseWheel(e);
  3987. int delta = SystemInformation.MouseWheelScrollLines * verticalScrollBar.SmallChange;
  3988. if (e.Delta < 0)
  3989. verticalScrollBar.SafeValueSet (verticalScrollBar.Value + delta);
  3990. else
  3991. verticalScrollBar.SafeValueSet (verticalScrollBar.Value - delta);
  3992. OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
  3993. }
  3994. protected virtual void OnMultiSelectChanged (EventArgs e)
  3995. {
  3996. EventHandler eh = (EventHandler)(Events [MultiSelectChangedEvent]);
  3997. if (eh != null) eh (this, e);
  3998. }
  3999. protected virtual void OnNewRowNeeded (DataGridViewRowEventArgs e) {
  4000. DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [NewRowNeededEvent]);
  4001. if (eh != null) eh (this, e);
  4002. }
  4003. int first_row_index = 0;
  4004. internal int first_col_index = 0;
  4005. protected override void OnPaint (PaintEventArgs e)
  4006. {
  4007. Graphics g = e.Graphics;
  4008. Rectangle bounds = ClientRectangle;
  4009. // Paint the background
  4010. PaintBackground (g, e.ClipRectangle, bounds);
  4011. List<DataGridViewColumn> sortedColumns = columns.ColumnDisplayIndexSortedArrayList;
  4012. // Take borders into account
  4013. bounds.Inflate (-BorderWidth, -BorderWidth);
  4014. // Paint the top left cell
  4015. if (rowHeadersVisible && columnHeadersVisible && ColumnCount > 0) {
  4016. Rectangle topleftbounds = new Rectangle (bounds.X, bounds.Y, rowHeadersWidth, columnHeadersHeight);
  4017. TopLeftHeaderCell.PaintWork (g, e.ClipRectangle, topleftbounds, -1, TopLeftHeaderCell.State, ColumnHeadersDefaultCellStyle, AdvancedColumnHeadersBorderStyle, DataGridViewPaintParts.All);
  4018. }
  4019. // Paint the column headers
  4020. if (columnHeadersVisible) {
  4021. Rectangle headerBounds = bounds;
  4022. headerBounds.Height = columnHeadersHeight;
  4023. if (rowHeadersVisible)
  4024. headerBounds.X += rowHeadersWidth;
  4025. for (int index = first_col_index; index < sortedColumns.Count; index++) {
  4026. DataGridViewColumn col = sortedColumns[index];
  4027. if (!col.Visible)
  4028. continue;
  4029. headerBounds.Width = col.Width;
  4030. DataGridViewCell cell = col.HeaderCell;
  4031. DataGridViewAdvancedBorderStyle intermediateBorderStyle = (DataGridViewAdvancedBorderStyle)((ICloneable)this.AdvancedColumnHeadersBorderStyle).Clone ();
  4032. DataGridViewAdvancedBorderStyle borderStyle = AdjustColumnHeaderBorderStyle (this.AdvancedColumnHeadersBorderStyle, intermediateBorderStyle, cell.ColumnIndex == 0, cell.ColumnIndex == columns.Count - 1);
  4033. cell.PaintWork (g, e.ClipRectangle, headerBounds, -1, cell.State, cell.InheritedStyle, borderStyle, DataGridViewPaintParts.All);
  4034. headerBounds.X += col.Width;
  4035. }
  4036. bounds.Y += columnHeadersHeight;
  4037. }
  4038. // Reset not displayed columns to !Displayed
  4039. for (int i = 0; i < first_col_index; i++)
  4040. Columns[i].DisplayedInternal = false;
  4041. int gridWidth = rowHeadersVisible ? rowHeadersWidth : 0;
  4042. // Set Displayed columns
  4043. for (int i = first_col_index; i < Columns.Count; i++) {
  4044. DataGridViewColumn col = Columns.ColumnDisplayIndexSortedArrayList[i];
  4045. if (!col.Visible)
  4046. continue;
  4047. col.DisplayedInternal = true;
  4048. gridWidth += col.Width;
  4049. if (gridWidth >= Width)
  4050. break;
  4051. }
  4052. // Reset all not displayed rows to !Displayed
  4053. for (int i = 0; i < first_row_index; i++)
  4054. GetRowInternal (i).DisplayedInternal = false;
  4055. // Draw rows
  4056. for (int index = first_row_index; index < Rows.Count; index++) {
  4057. DataGridViewRow row = Rows[index];
  4058. if (!row.Visible)
  4059. continue;
  4060. GetRowInternal (index).DisplayedInternal = true;
  4061. bounds.Height = row.Height;
  4062. bool is_first = row.Index == 0;
  4063. bool is_last = row.Index == rows.Count - 1;
  4064. row.Paint (g, e.ClipRectangle, bounds, row.Index, row.GetState (row.Index), is_first, is_last);
  4065. bounds.Y += bounds.Height;
  4066. bounds.X = BorderWidth;
  4067. if (bounds.Y >= ClientSize.Height - (horizontalScrollBar.Visible ? horizontalScrollBar.Height : 0))
  4068. break;
  4069. }
  4070. RefreshScrollBars ();
  4071. // Paint the bottom right square if both scrollbars are displayed
  4072. if (horizontalScrollBar.Visible && verticalScrollBar.Visible)
  4073. g.FillRectangle (SystemBrushes.Control, new Rectangle (horizontalScrollBar.Right, verticalScrollBar.Bottom, verticalScrollBar.Width, horizontalScrollBar.Height));
  4074. // Paint the border
  4075. bounds = ClientRectangle;
  4076. switch (BorderStyle) {
  4077. case BorderStyle.FixedSingle:
  4078. g.DrawRectangle (Pens.Black, new Rectangle (bounds.Left, bounds.Top, bounds.Width - 1, bounds.Height - 1));
  4079. break;
  4080. case BorderStyle.Fixed3D:
  4081. ControlPaint.DrawBorder3D (g, bounds, Border3DStyle.Sunken);
  4082. break;
  4083. }
  4084. // Call the base impl at the end.
  4085. base.OnPaint(e);
  4086. }
  4087. private void RefreshScrollBars ()
  4088. {
  4089. int gridWidth = 0;
  4090. int gridHeight = 0;
  4091. foreach (DataGridViewColumn col in columns.ColumnDisplayIndexSortedArrayList)
  4092. if (col.Visible)
  4093. gridWidth += col.Width;
  4094. foreach (DataGridViewRow row in Rows)
  4095. if (row.Visible)
  4096. gridHeight += row.Height;
  4097. if (rowHeadersVisible)
  4098. gridWidth += rowHeadersWidth;
  4099. if (columnHeadersVisible)
  4100. gridHeight += columnHeadersHeight;
  4101. bool horizontalVisible = false;
  4102. bool verticalVisible = false;
  4103. if (AutoSize) {
  4104. if (gridWidth > Size.Width || gridHeight > Size.Height)
  4105. Size = new Size(gridWidth, gridHeight);
  4106. }
  4107. else {
  4108. if (gridWidth > Size.Width)
  4109. horizontalVisible = true;
  4110. if (gridHeight > Size.Height)
  4111. verticalVisible = true;
  4112. if (horizontalScrollBar.Visible && (gridHeight + horizontalScrollBar.Height) > Size.Height)
  4113. verticalVisible = true;
  4114. if (verticalScrollBar.Visible && (gridWidth + verticalScrollBar.Width) > Size.Width)
  4115. horizontalVisible = true;
  4116. if (horizontalVisible) {
  4117. horizontalScrollBar.Minimum = 0;
  4118. horizontalScrollBar.Maximum = gridWidth;
  4119. horizontalScrollBar.SmallChange = Columns[first_col_index].Width;
  4120. int largeChange = ClientSize.Width - rowHeadersWidth - horizontalScrollBar.Height;
  4121. if (largeChange <= 0)
  4122. largeChange = ClientSize.Width;
  4123. horizontalScrollBar.LargeChange = largeChange;
  4124. }
  4125. if (verticalVisible) {
  4126. verticalScrollBar.Minimum = 0;
  4127. verticalScrollBar.Maximum = gridHeight;
  4128. int first_row_height = Rows.Count > 0 ? Rows[Math.Min (Rows.Count - 1, first_row_index)].Height : 0;
  4129. verticalScrollBar.SmallChange = first_row_height + 1;
  4130. int largeChange = ClientSize.Height - columnHeadersHeight - verticalScrollBar.Width;
  4131. if (largeChange <= 0)
  4132. largeChange = ClientSize.Height;
  4133. verticalScrollBar.LargeChange = largeChange;
  4134. }
  4135. // Force the visibility of the scrollbars *after* computing the scrolling values,
  4136. // as we need them *always* for navigation purposes.
  4137. if (scrollBars != ScrollBars.Vertical && scrollBars != ScrollBars.Both)
  4138. verticalVisible = false;
  4139. if (scrollBars != ScrollBars.Horizontal && scrollBars != ScrollBars.Both)
  4140. horizontalVisible = false;
  4141. // MSNET compatibility here
  4142. if (RowCount <= 1)
  4143. verticalVisible = false;
  4144. }
  4145. horizontalScrollBar.Visible = horizontalVisible;
  4146. verticalScrollBar.Visible = verticalVisible;
  4147. }
  4148. protected virtual void OnReadOnlyChanged (EventArgs e) {
  4149. EventHandler eh = (EventHandler)(Events [ReadOnlyChangedEvent]);
  4150. if (eh != null)
  4151. eh (this, e);
  4152. }
  4153. protected override void OnResize (EventArgs e) {
  4154. base.OnResize(e);
  4155. AutoResizeColumnsInternal ();
  4156. OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
  4157. OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
  4158. }
  4159. protected override void OnRightToLeftChanged (EventArgs e) {
  4160. base.OnRightToLeftChanged(e);
  4161. }
  4162. // In MSDN2 documentation there's no internal here
  4163. protected internal virtual void OnRowContextMenuStripChanged (DataGridViewRowEventArgs e)
  4164. {
  4165. DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowContextMenuStripChangedEvent]);
  4166. if (eh != null) eh (this, e);
  4167. }
  4168. protected virtual void OnRowContextMenuStripNeeded (DataGridViewRowContextMenuStripNeededEventArgs e)
  4169. {
  4170. DataGridViewRowContextMenuStripNeededEventHandler eh = (DataGridViewRowContextMenuStripNeededEventHandler)(Events [RowContextMenuStripNeededEvent]);
  4171. if (eh != null) eh (this, e);
  4172. }
  4173. protected internal virtual void OnRowDefaultCellStyleChanged (DataGridViewRowEventArgs e)
  4174. {
  4175. DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowDefaultCellStyleChangedEvent]);
  4176. if (eh != null) eh (this, e);
  4177. }
  4178. protected virtual void OnRowDirtyStateNeeded (QuestionEventArgs e)
  4179. {
  4180. QuestionEventHandler eh = (QuestionEventHandler)(Events [RowDirtyStateNeededEvent]);
  4181. if (eh != null) eh (this, e);
  4182. }
  4183. protected virtual void OnRowDividerDoubleClick (DataGridViewRowDividerDoubleClickEventArgs e)
  4184. {
  4185. DataGridViewRowDividerDoubleClickEventHandler eh = (DataGridViewRowDividerDoubleClickEventHandler)(Events [RowDividerDoubleClickEvent]);
  4186. if (eh != null) eh (this, e);
  4187. }
  4188. protected virtual void OnRowDividerHeightChanged (DataGridViewRowEventArgs e)
  4189. {
  4190. DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowDividerHeightChangedEvent]);
  4191. if (eh != null) eh (this, e);
  4192. }
  4193. protected virtual void OnRowEnter (DataGridViewCellEventArgs e)
  4194. {
  4195. DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowEnterEvent]);
  4196. if (eh != null) eh (this, e);
  4197. }
  4198. protected internal virtual void OnRowErrorTextChanged (DataGridViewRowEventArgs e)
  4199. {
  4200. DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowErrorTextChangedEvent]);
  4201. if (eh != null) eh (this, e);
  4202. }
  4203. protected virtual void OnRowErrorTextNeeded (DataGridViewRowErrorTextNeededEventArgs e)
  4204. {
  4205. DataGridViewRowErrorTextNeededEventHandler eh = (DataGridViewRowErrorTextNeededEventHandler)(Events [RowErrorTextNeededEvent]);
  4206. if (eh != null) eh (this, e);
  4207. }
  4208. protected internal virtual void OnRowHeaderCellChanged (DataGridViewRowEventArgs e)
  4209. {
  4210. DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowHeaderCellChangedEvent]);
  4211. if (eh != null) eh (this, e);
  4212. }
  4213. protected virtual void OnRowHeaderMouseClick (DataGridViewCellMouseEventArgs e)
  4214. {
  4215. DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [RowHeaderMouseClickEvent]);
  4216. if (eh != null) eh (this, e);
  4217. }
  4218. protected virtual void OnRowHeaderMouseDoubleClick (DataGridViewCellMouseEventArgs e)
  4219. {
  4220. DataGridViewCellMouseEventHandler eh = (DataGridViewCellMouseEventHandler)(Events [RowHeaderMouseDoubleClickEvent]);
  4221. if (eh != null) eh (this, e);
  4222. }
  4223. protected virtual void OnRowHeadersBorderStyleChanged (EventArgs e)
  4224. {
  4225. EventHandler eh = (EventHandler)(Events [RowHeadersBorderStyleChangedEvent]);
  4226. if (eh != null) eh (this, e);
  4227. }
  4228. protected virtual void OnRowHeadersDefaultCellStyleChanged (EventArgs e)
  4229. {
  4230. EventHandler eh = (EventHandler)(Events [RowHeadersDefaultCellStyleChangedEvent]);
  4231. if (eh != null) eh (this, e);
  4232. }
  4233. protected virtual void OnRowHeadersWidthChanged (EventArgs e)
  4234. {
  4235. EventHandler eh = (EventHandler)(Events [RowHeadersWidthChangedEvent]);
  4236. if (eh != null) eh (this, e);
  4237. }
  4238. protected virtual void OnRowHeadersWidthSizeModeChanged (DataGridViewAutoSizeModeEventArgs e)
  4239. {
  4240. DataGridViewAutoSizeModeEventHandler eh = (DataGridViewAutoSizeModeEventHandler)(Events [RowHeadersWidthSizeModeChangedEvent]);
  4241. if (eh != null) eh (this, e);
  4242. }
  4243. protected internal virtual void OnRowHeightChanged (DataGridViewRowEventArgs e)
  4244. {
  4245. UpdateRowHeightInfo (e.Row.Index, false);
  4246. DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowHeightChangedEvent]);
  4247. if (eh != null) eh (this, e);
  4248. }
  4249. protected virtual void OnRowHeightInfoNeeded (DataGridViewRowHeightInfoNeededEventArgs e)
  4250. {
  4251. DataGridViewRowHeightInfoNeededEventHandler eh = (DataGridViewRowHeightInfoNeededEventHandler)(Events [RowHeightInfoNeededEvent]);
  4252. if (eh != null) eh (this, e);
  4253. }
  4254. protected virtual void OnRowHeightInfoPushed (DataGridViewRowHeightInfoPushedEventArgs e)
  4255. {
  4256. DataGridViewRowHeightInfoPushedEventHandler eh = (DataGridViewRowHeightInfoPushedEventHandler)(Events [RowHeightInfoPushedEvent]);
  4257. if (eh != null) eh (this, e);
  4258. }
  4259. protected virtual void OnRowLeave (DataGridViewCellEventArgs e)
  4260. {
  4261. DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowLeaveEvent]);
  4262. if (eh != null) eh (this, e);
  4263. }
  4264. protected internal virtual void OnRowMinimumHeightChanged (DataGridViewRowEventArgs e)
  4265. {
  4266. DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowMinimumHeightChangedEvent]);
  4267. if (eh != null) eh (this, e);
  4268. }
  4269. protected internal virtual void OnRowPostPaint (DataGridViewRowPostPaintEventArgs e)
  4270. {
  4271. DataGridViewRowPostPaintEventHandler eh = (DataGridViewRowPostPaintEventHandler)(Events [RowPostPaintEvent]);
  4272. if (eh != null) eh (this, e);
  4273. }
  4274. protected internal virtual void OnRowPrePaint (DataGridViewRowPrePaintEventArgs e)
  4275. {
  4276. DataGridViewRowPrePaintEventHandler eh = (DataGridViewRowPrePaintEventHandler)(Events [RowPrePaintEvent]);
  4277. if (eh != null) eh (this, e);
  4278. }
  4279. internal void OnRowsAddedInternal (DataGridViewRowsAddedEventArgs e)
  4280. {
  4281. if (hover_cell != null && hover_cell.RowIndex >= e.RowIndex)
  4282. hover_cell = null;
  4283. // Select the first row if we are not databound.
  4284. // If we are databound selection is managed by the data manager.
  4285. if (IsHandleCreated && DataManager == null && CurrentCell == null && Rows.Count > 0 && Columns.Count > 0)
  4286. MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, false, false, true);
  4287. AutoResizeColumnsInternal ();
  4288. if (VirtualMode) {
  4289. for (int i = 0; i < e.RowCount; i++)
  4290. UpdateRowHeightInfo (e.RowIndex + i, false);
  4291. }
  4292. Invalidate ();
  4293. OnRowsAdded (e);
  4294. }
  4295. protected virtual void OnRowsAdded (DataGridViewRowsAddedEventArgs e)
  4296. {
  4297. DataGridViewRowsAddedEventHandler eh = (DataGridViewRowsAddedEventHandler)(Events [RowsAddedEvent]);
  4298. if (eh != null) eh (this, e);
  4299. }
  4300. protected virtual void OnRowsDefaultCellStyleChanged (EventArgs e)
  4301. {
  4302. EventHandler eh = (EventHandler)(Events [RowsDefaultCellStyleChangedEvent]);
  4303. if (eh != null) eh (this, e);
  4304. }
  4305. internal void OnRowsPreRemovedInternal (DataGridViewRowsRemovedEventArgs e)
  4306. {
  4307. // All removed rows should be removed from the selection too.
  4308. if (selected_rows != null)
  4309. {
  4310. int lastRowIndex = e.RowIndex + e.RowCount;
  4311. for (int rowIndex = e.RowIndex; rowIndex < lastRowIndex; ++rowIndex)
  4312. SetSelectedRowCore (rowIndex, false);
  4313. }
  4314. if (Rows.Count - e.RowCount <= 0) {
  4315. MoveCurrentCell (-1, -1, true, false, false, true);
  4316. hover_cell = null;
  4317. } else if (Columns.Count == 0) {
  4318. MoveCurrentCell (-1, -1, true, false, false, true);
  4319. hover_cell = null;
  4320. } else if (currentCell != null && currentCell.RowIndex == e.RowIndex) {
  4321. int nextRowIndex = e.RowIndex;
  4322. if (nextRowIndex >= Rows.Count - e.RowCount)
  4323. nextRowIndex = Rows.Count - 1 - e.RowCount;
  4324. MoveCurrentCell (currentCell != null ? currentCell.ColumnIndex : 0, nextRowIndex,
  4325. true, false, false, true);
  4326. if (hover_cell != null && hover_cell.RowIndex >= e.RowIndex)
  4327. hover_cell = null;
  4328. }
  4329. }
  4330. internal void OnRowsPostRemovedInternal (DataGridViewRowsRemovedEventArgs e)
  4331. {
  4332. Invalidate ();
  4333. OnRowsRemoved (e);
  4334. }
  4335. protected virtual void OnRowsRemoved (DataGridViewRowsRemovedEventArgs e)
  4336. {
  4337. DataGridViewRowsRemovedEventHandler eh = (DataGridViewRowsRemovedEventHandler)(Events [RowsRemovedEvent]);
  4338. if (eh != null) eh (this, e);
  4339. }
  4340. protected internal virtual void OnRowStateChanged (int rowIndex, DataGridViewRowStateChangedEventArgs e)
  4341. {
  4342. DataGridViewRowStateChangedEventHandler eh = (DataGridViewRowStateChangedEventHandler)(Events [RowStateChangedEvent]);
  4343. if (eh != null) eh (this, e);
  4344. }
  4345. protected virtual void OnRowUnshared (DataGridViewRowEventArgs e)
  4346. {
  4347. DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [RowUnsharedEvent]);
  4348. if (eh != null) eh (this, e);
  4349. }
  4350. protected virtual void OnRowValidated (DataGridViewCellEventArgs e)
  4351. {
  4352. DataGridViewCellEventHandler eh = (DataGridViewCellEventHandler)(Events [RowValidatedEvent]);
  4353. if (eh != null) eh (this, e);
  4354. }
  4355. protected virtual void OnRowValidating (DataGridViewCellCancelEventArgs e)
  4356. {
  4357. DataGridViewCellCancelEventHandler eh = (DataGridViewCellCancelEventHandler)(Events [RowValidatingEvent]);
  4358. if (eh != null) eh (this, e);
  4359. }
  4360. protected virtual void OnScroll (ScrollEventArgs e)
  4361. {
  4362. ScrollEventHandler eh = (ScrollEventHandler)(Events [ScrollEvent]);
  4363. if (eh != null) eh (this, e);
  4364. }
  4365. protected virtual void OnSelectionChanged (EventArgs e)
  4366. {
  4367. EventHandler eh = (EventHandler)(Events [SelectionChangedEvent]);
  4368. if (eh != null) eh (this, e);
  4369. }
  4370. protected virtual void OnSortCompare (DataGridViewSortCompareEventArgs e) {
  4371. DataGridViewSortCompareEventHandler eh = (DataGridViewSortCompareEventHandler)(Events [SortCompareEvent]);
  4372. if (eh != null) eh (this, e);
  4373. }
  4374. protected virtual void OnSorted (EventArgs e)
  4375. {
  4376. EventHandler eh = (EventHandler)(Events [SortedEvent]);
  4377. if (eh != null) eh (this, e);
  4378. }
  4379. protected virtual void OnUserAddedRow (DataGridViewRowEventArgs e)
  4380. {
  4381. PrepareEditingRow (false, false);
  4382. new_row_editing = true;
  4383. if (DataManager != null) {
  4384. // Switch the current editing row with a real one
  4385. if (editing_row != null) {
  4386. Rows.RemoveInternal (editing_row);
  4387. editing_row = null;
  4388. }
  4389. DataManager.AddNew (); // will raise OnListPositionChanged
  4390. }
  4391. e = new DataGridViewRowEventArgs (Rows[NewRowIndex]);
  4392. DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [UserAddedRowEvent]);
  4393. if (eh != null) eh (this, e);
  4394. }
  4395. protected virtual void OnUserDeletedRow (DataGridViewRowEventArgs e)
  4396. {
  4397. DataGridViewRowEventHandler eh = (DataGridViewRowEventHandler)(Events [UserDeletedRowEvent]);
  4398. if (eh != null) eh (this, e);
  4399. }
  4400. protected virtual void OnUserDeletingRow (DataGridViewRowCancelEventArgs e)
  4401. {
  4402. DataGridViewRowCancelEventHandler eh = (DataGridViewRowCancelEventHandler)(Events [UserDeletingRowEvent]);
  4403. if (eh != null) eh (this, e);
  4404. }
  4405. protected override void OnValidating (CancelEventArgs e)
  4406. {
  4407. base.OnValidating(e);
  4408. }
  4409. protected override void OnVisibleChanged (EventArgs e)
  4410. {
  4411. base.OnVisibleChanged(e);
  4412. }
  4413. protected virtual void PaintBackground (Graphics graphics, Rectangle clipBounds, Rectangle gridBounds)
  4414. {
  4415. graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (backgroundColor), gridBounds);
  4416. }
  4417. protected bool ProcessAKey (Keys keyData)
  4418. {
  4419. if (!MultiSelect)
  4420. return false;
  4421. if ((keyData & Keys.Control) == Keys.Control) {
  4422. SelectAll ();
  4423. return true;
  4424. }
  4425. return false;
  4426. }
  4427. protected virtual bool ProcessDataGridViewKey (KeyEventArgs e)
  4428. {
  4429. switch (e.KeyData & ~Keys.Modifiers) {
  4430. case Keys.A:
  4431. return ProcessAKey (e.KeyData);
  4432. case Keys.Delete:
  4433. return ProcessDeleteKey (e.KeyData);
  4434. case Keys.Down:
  4435. return ProcessDownKey (e.KeyData);
  4436. case Keys.Escape:
  4437. return ProcessEscapeKey (e.KeyData);
  4438. case Keys.End:
  4439. return ProcessEndKey (e.KeyData);
  4440. case Keys.Enter:
  4441. return ProcessEnterKey (e.KeyData);
  4442. case Keys.F2:
  4443. return ProcessF2Key (e.KeyData);
  4444. case Keys.Home:
  4445. return ProcessHomeKey (e.KeyData);
  4446. case Keys.Left:
  4447. return ProcessLeftKey (e.KeyData);
  4448. case Keys.Next:
  4449. return ProcessNextKey (e.KeyData);
  4450. case Keys.Prior:
  4451. return ProcessPriorKey (e.KeyData);
  4452. case Keys.Right:
  4453. return ProcessRightKey (e.KeyData);
  4454. case Keys.Space:
  4455. return ProcessSpaceKey (e.KeyData);
  4456. case Keys.Tab:
  4457. return ProcessTabKey (e.KeyData);
  4458. case Keys.Up:
  4459. return ProcessUpKey (e.KeyData);
  4460. case Keys.D0:
  4461. case Keys.NumPad0:
  4462. return ProcessZeroKey (e.KeyData);
  4463. }
  4464. return false;
  4465. }
  4466. protected bool ProcessDeleteKey (Keys keyData)
  4467. {
  4468. if (!AllowUserToDeleteRows || SelectedRows.Count == 0)
  4469. return false;
  4470. for (int i = SelectedRows.Count - 1; i >= 0; i--) {
  4471. DataGridViewRow row = SelectedRows[i];
  4472. if (row.IsNewRow)
  4473. continue;
  4474. if (hover_cell != null && hover_cell.OwningRow == row)
  4475. hover_cell = null;
  4476. if (DataManager != null)
  4477. DataManager.RemoveAt (row.Index);
  4478. else
  4479. Rows.RemoveAt (row.Index);
  4480. }
  4481. return true;
  4482. }
  4483. protected override bool ProcessDialogKey (Keys keyData)
  4484. {
  4485. switch (keyData) {
  4486. case Keys.Tab:
  4487. case Keys.Shift | Keys.Tab:
  4488. if (standardTab)
  4489. return base.ProcessDialogKey (keyData & ~Keys.Control);
  4490. if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
  4491. return true;
  4492. break;
  4493. case Keys.Control | Keys.Tab:
  4494. case Keys.Control | Keys.Shift | Keys.Tab:
  4495. if (!standardTab)
  4496. return base.ProcessDialogKey (keyData & ~Keys.Control);
  4497. if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
  4498. return true;
  4499. break;
  4500. case Keys.Enter:
  4501. case Keys.Escape:
  4502. if (ProcessDataGridViewKey (new KeyEventArgs (keyData)))
  4503. return true;
  4504. break;
  4505. }
  4506. return base.ProcessDialogKey(keyData);
  4507. }
  4508. protected bool ProcessDownKey (Keys keyData)
  4509. {
  4510. int current_row = CurrentCellAddress.Y;
  4511. if (current_row < Rows.Count - 1) {
  4512. // Move to the last cell in the column
  4513. if ((keyData & Keys.Control) == Keys.Control)
  4514. MoveCurrentCell (CurrentCellAddress.X, Rows.Count - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
  4515. // Move one cell down
  4516. else
  4517. MoveCurrentCell (CurrentCellAddress.X, current_row + 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
  4518. return true;
  4519. }
  4520. return false;
  4521. }
  4522. protected bool ProcessEndKey (Keys keyData)
  4523. {
  4524. int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
  4525. // Move to the last cell in the control
  4526. if ((keyData & Keys.Control) == Keys.Control) {
  4527. MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), Rows.Count - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
  4528. return true;
  4529. }
  4530. // Move to the last cell in the row
  4531. if (disp_index < Columns.Count - 1) {
  4532. MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
  4533. return true;
  4534. }
  4535. return false;
  4536. }
  4537. protected bool ProcessEnterKey (Keys keyData)
  4538. {
  4539. if (ProcessDownKey (keyData))
  4540. return true;
  4541. // ProcessDown may fail if we are on the last row,
  4542. // but Enter should still EndEdit if this is the last row
  4543. EndEdit ();
  4544. return true;
  4545. }
  4546. protected bool ProcessEscapeKey (Keys keyData)
  4547. {
  4548. if (!IsCurrentCellInEditMode)
  4549. return false;
  4550. CancelEdit ();
  4551. return true;
  4552. }
  4553. protected bool ProcessF2Key (Keys keyData)
  4554. {
  4555. if (editMode == DataGridViewEditMode.EditOnF2 || editMode == DataGridViewEditMode.EditOnKeystrokeOrF2) {
  4556. BeginEdit (true);
  4557. return true;
  4558. }
  4559. return false;
  4560. }
  4561. protected bool ProcessHomeKey (Keys keyData)
  4562. {
  4563. int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
  4564. // Move to the first cell in the control
  4565. if ((keyData & Keys.Control) == Keys.Control) {
  4566. MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
  4567. return true;
  4568. }
  4569. // Move to the first cell in the row
  4570. if (disp_index > 0) {
  4571. MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
  4572. return true;
  4573. }
  4574. return false;
  4575. }
  4576. [MonoInternalNote ("What does insert do?")]
  4577. protected bool ProcessInsertKey (Keys keyData)
  4578. {
  4579. return false;
  4580. }
  4581. protected override bool ProcessKeyEventArgs (ref Message m)
  4582. {
  4583. DataGridViewCell cell = CurrentCell;
  4584. if (cell != null) {
  4585. if (cell.KeyEntersEditMode (new KeyEventArgs (((Keys)m.WParam.ToInt32 ()) | XplatUI.State.ModifierKeys)))
  4586. BeginEdit (true);
  4587. if (EditingControl != null && ((Msg)m.Msg == Msg.WM_KEYDOWN || (Msg)m.Msg == Msg.WM_CHAR))
  4588. XplatUI.SendMessage (EditingControl.Handle, (Msg)m.Msg, m.WParam, m.LParam);
  4589. }
  4590. return base.ProcessKeyEventArgs (ref m);
  4591. }
  4592. protected override bool ProcessKeyPreview (ref Message m)
  4593. {
  4594. if ((Msg)m.Msg == Msg.WM_KEYDOWN && (IsCurrentCellInEditMode || m.HWnd == horizontalScrollBar.Handle || m.HWnd == verticalScrollBar.Handle)) {
  4595. KeyEventArgs e = new KeyEventArgs (((Keys)m.WParam.ToInt32 ()) | XplatUI.State.ModifierKeys);
  4596. IDataGridViewEditingControl ctrl = (IDataGridViewEditingControl)EditingControlInternal;
  4597. if (ctrl != null)
  4598. if (ctrl.EditingControlWantsInputKey (e.KeyData, false))
  4599. return false;
  4600. switch (e.KeyData) {
  4601. case Keys.Escape:
  4602. case Keys.Down:
  4603. case Keys.Up:
  4604. case Keys.Left:
  4605. case Keys.Right:
  4606. case Keys.Tab:
  4607. case Keys.Prior:
  4608. case Keys.Next:
  4609. return ProcessDataGridViewKey (e);
  4610. }
  4611. }
  4612. return base.ProcessKeyPreview (ref m);
  4613. }
  4614. protected bool ProcessLeftKey (Keys keyData)
  4615. {
  4616. int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
  4617. if (disp_index > 0) {
  4618. // Move to the first cell in the row
  4619. if ((keyData & Keys.Control) == Keys.Control)
  4620. MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
  4621. // Move one cell to the left
  4622. else
  4623. MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
  4624. return true;
  4625. }
  4626. return false;
  4627. }
  4628. // Page Down
  4629. protected bool ProcessNextKey (Keys keyData)
  4630. {
  4631. int current_row = CurrentCellAddress.Y;
  4632. if (current_row < Rows.Count - 1) {
  4633. // Move one "page" of cells down
  4634. int new_row = Math.Min (Rows.Count - 1, current_row + DisplayedRowCount (false));
  4635. MoveCurrentCell (CurrentCellAddress.X, new_row, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
  4636. return true;
  4637. }
  4638. return false;
  4639. }
  4640. // Page Up
  4641. protected bool ProcessPriorKey (Keys keyData)
  4642. {
  4643. int current_row = CurrentCellAddress.Y;
  4644. if (current_row > 0) {
  4645. // Move one "page" of cells up
  4646. int new_row = Math.Max (0, current_row - DisplayedRowCount (false));
  4647. MoveCurrentCell (CurrentCellAddress.X, new_row, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
  4648. return true;
  4649. }
  4650. return false;
  4651. }
  4652. protected bool ProcessRightKey (Keys keyData)
  4653. {
  4654. int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
  4655. if (disp_index < Columns.Count - 1) {
  4656. // Move to the last cell in the row
  4657. if ((keyData & Keys.Control) == Keys.Control)
  4658. MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
  4659. // Move one cell to the right
  4660. else
  4661. MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index + 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
  4662. return true;
  4663. }
  4664. return false;
  4665. }
  4666. protected bool ProcessSpaceKey (Keys keyData)
  4667. {
  4668. if ((keyData & Keys.Shift) == Keys.Shift) {
  4669. if (selectionMode == DataGridViewSelectionMode.RowHeaderSelect) {
  4670. SetSelectedRowCore (CurrentCellAddress.Y, true);
  4671. InvalidateRow (CurrentCellAddress.Y);
  4672. return true;
  4673. }
  4674. if (selectionMode == DataGridViewSelectionMode.ColumnHeaderSelect) {
  4675. SetSelectedColumnCore (CurrentCellAddress.X, true);
  4676. InvalidateColumn (CurrentCellAddress.X);
  4677. return true;
  4678. }
  4679. }
  4680. if (CurrentCell is DataGridViewButtonCell || CurrentCell is DataGridViewLinkCell || CurrentCell is DataGridViewCheckBoxCell) {
  4681. DataGridViewCellEventArgs e = new DataGridViewCellEventArgs (CurrentCell.ColumnIndex, CurrentCell.RowIndex);
  4682. OnCellClick (e);
  4683. OnCellContentClick (e);
  4684. if (CurrentCell is DataGridViewButtonCell)
  4685. (CurrentCell as DataGridViewButtonCell).OnClickInternal (e);
  4686. if (CurrentCell is DataGridViewCheckBoxCell)
  4687. (CurrentCell as DataGridViewCheckBoxCell).OnClickInternal (e);
  4688. return true;
  4689. }
  4690. return false;
  4691. }
  4692. protected bool ProcessTabKey (Keys keyData)
  4693. {
  4694. Form f = FindForm ();
  4695. if (f != null)
  4696. f.ActivateFocusCues ();
  4697. int disp_index = ColumnIndexToDisplayIndex (currentCellAddress.X);
  4698. // Tab goes forward
  4699. // Shift-tab goes backwards
  4700. if ((keyData & Keys.Shift) == Keys.Shift) {
  4701. if (disp_index > 0) {
  4702. // Move one cell to the left
  4703. MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index - 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, false, true);
  4704. return true;
  4705. } else if (currentCellAddress.Y > 0) {
  4706. // Move to the last cell in the previous row
  4707. MoveCurrentCell (ColumnDisplayIndexToIndex (Columns.Count - 1), currentCellAddress.Y - 1, true, false, false, true);
  4708. return true;
  4709. }
  4710. } else {
  4711. if (disp_index < Columns.Count - 1) {
  4712. // Move one cell to the right
  4713. MoveCurrentCell (ColumnDisplayIndexToIndex (disp_index + 1), currentCellAddress.Y, true, (keyData & Keys.Control) == Keys.Control, false, true);
  4714. return true;
  4715. } else if (currentCellAddress.Y < Rows.Count - 1) {
  4716. // Move to the first cell in the next row
  4717. MoveCurrentCell (ColumnDisplayIndexToIndex (0), currentCellAddress.Y + 1, true, false, false, true);
  4718. return true;
  4719. }
  4720. }
  4721. return false;
  4722. }
  4723. protected bool ProcessUpKey (Keys keyData)
  4724. {
  4725. int current_row = CurrentCellAddress.Y;
  4726. if (current_row > 0) {
  4727. // Move to the first cell in the column
  4728. if ((keyData & Keys.Control) == Keys.Control)
  4729. MoveCurrentCell (CurrentCellAddress.X, 0, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
  4730. // Move one cell up
  4731. else
  4732. MoveCurrentCell (CurrentCellAddress.X, current_row - 1, true, (keyData & Keys.Control) == Keys.Control, (keyData & Keys.Shift) == Keys.Shift, true);
  4733. return true;
  4734. }
  4735. return false;
  4736. }
  4737. protected bool ProcessZeroKey (Keys keyData)
  4738. {
  4739. if ((keyData & Keys.Control) == Keys.Control && CurrentCell.EditType != null) {
  4740. CurrentCell.Value = DBNull.Value;
  4741. InvalidateCell (CurrentCell);
  4742. return true;
  4743. }
  4744. return false;
  4745. }
  4746. protected override void SetBoundsCore (int x, int y, int width, int height, BoundsSpecified specified) {
  4747. base.SetBoundsCore(x, y, width, height, specified);
  4748. }
  4749. [MonoTODO ("Does not use validateCurrentCell")]
  4750. protected virtual bool SetCurrentCellAddressCore (int columnIndex, int rowIndex, bool setAnchorCellAddress, bool validateCurrentCell, bool throughMouseClick)
  4751. {
  4752. if ((columnIndex < 0 || columnIndex > Columns.Count - 1) && rowIndex != -1)
  4753. throw new ArgumentOutOfRangeException ("columnIndex");
  4754. if ((rowIndex < 0 || rowIndex > Rows.Count - 1) && columnIndex != -1)
  4755. throw new ArgumentOutOfRangeException ("rowIndex");
  4756. DataGridViewCell cell;
  4757. if (columnIndex == -1 && rowIndex == -1)
  4758. cell = null;
  4759. else
  4760. cell = Rows.SharedRow (rowIndex).Cells[columnIndex];
  4761. if (cell != null && !cell.Visible)
  4762. throw new InvalidOperationException ("cell is not visible");
  4763. // Always update the current cell address property
  4764. // If the row has moved it would be out of date.
  4765. if (currentCell != null) {
  4766. if (setAnchorCellAddress) {
  4767. anchor_cell.X = currentCell.ColumnIndex;
  4768. anchor_cell.Y = currentCell.RowIndex;
  4769. }
  4770. currentCellAddress.X = currentCell.ColumnIndex;
  4771. currentCellAddress.Y = currentCell.RowIndex;
  4772. }
  4773. if (cell != currentCell) {
  4774. if (currentCell != null) {
  4775. if (currentCell.IsInEditMode) {
  4776. if (!EndEdit ())
  4777. return false;
  4778. else if (currentCell.RowIndex == NewRowIndex && new_row_editing)
  4779. CancelEdit ();
  4780. } else {
  4781. // CancelEdit will replace the uncommited real editing row with a place holder row
  4782. if (new_row_editing && currentCell.RowIndex == NewRowIndex)
  4783. CancelEdit ();
  4784. }
  4785. OnCellLeave (new DataGridViewCellEventArgs(currentCell.ColumnIndex, currentCell.RowIndex));
  4786. OnRowLeave (new DataGridViewCellEventArgs (currentCell.ColumnIndex, currentCell.RowIndex));
  4787. }
  4788. currentCell = cell;
  4789. if (setAnchorCellAddress)
  4790. anchor_cell = new Point (columnIndex, rowIndex);
  4791. currentCellAddress = new Point (columnIndex, rowIndex);
  4792. if (cell != null) {
  4793. UpdateBindingPosition (cell.RowIndex);
  4794. OnRowEnter (new DataGridViewCellEventArgs (cell.ColumnIndex, cell.RowIndex));
  4795. OnCellEnter (new DataGridViewCellEventArgs(cell.ColumnIndex, cell.RowIndex));
  4796. }
  4797. OnCurrentCellChanged (EventArgs.Empty);
  4798. if (cell != null) {
  4799. // If the user begins an edit in the NewRow, add a new real row
  4800. if (AllowUserToAddRows && cell.RowIndex == NewRowIndex && !is_binding && !new_row_editing) {
  4801. // OnUserAddedRow will add a real row and reset the current cell
  4802. OnUserAddedRow (new DataGridViewRowEventArgs (Rows[NewRowIndex]));
  4803. } else {
  4804. if (editMode == DataGridViewEditMode.EditOnEnter)
  4805. BeginEdit (true);
  4806. }
  4807. }
  4808. } else {
  4809. if (cell != null && throughMouseClick)
  4810. BeginEdit (true);
  4811. }
  4812. return true;
  4813. }
  4814. protected virtual void SetSelectedCellCore (int columnIndex, int rowIndex, bool selected) {
  4815. rows [rowIndex].Cells [columnIndex].Selected = selected;
  4816. OnSelectionChanged (EventArgs.Empty);
  4817. }
  4818. internal void SetSelectedColumnCoreInternal (int columnIndex, bool selected) {
  4819. SetSelectedColumnCore (columnIndex, selected);
  4820. }
  4821. protected virtual void SetSelectedColumnCore (int columnIndex, bool selected) {
  4822. if (selectionMode != DataGridViewSelectionMode.ColumnHeaderSelect && selectionMode != DataGridViewSelectionMode.FullColumnSelect)
  4823. return;
  4824. DataGridViewColumn col = columns [columnIndex];
  4825. col.SelectedInternal = selected;
  4826. if (selected_columns == null)
  4827. selected_columns = new DataGridViewSelectedColumnCollection ();
  4828. bool selectionChanged = false;
  4829. if (!selected && selected_columns.Contains (col)) {
  4830. selected_columns.InternalRemove (col);
  4831. selectionChanged = true;
  4832. } else if (selected && !selected_columns.Contains (col)) {
  4833. selected_columns.InternalAdd (col);
  4834. selectionChanged = true;
  4835. }
  4836. if (selectionChanged)
  4837. OnSelectionChanged (EventArgs.Empty);
  4838. Invalidate();
  4839. }
  4840. internal void SetSelectedRowCoreInternal (int rowIndex, bool selected) {
  4841. if (rowIndex >= 0 && rowIndex < Rows.Count)
  4842. SetSelectedRowCore (rowIndex, selected);
  4843. }
  4844. protected virtual void SetSelectedRowCore (int rowIndex, bool selected) {
  4845. DataGridViewRow row = rows [rowIndex];
  4846. row.SelectedInternal = selected;
  4847. if (selected_rows == null)
  4848. selected_rows = new DataGridViewSelectedRowCollection (this);
  4849. bool selectionChanged = false;
  4850. if (!selected && selected_rows.Contains (row)) {
  4851. selected_rows.InternalRemove (row);
  4852. selectionChanged = true;
  4853. } else if (selected && !selected_rows.Contains (row)) {
  4854. selected_rows.InternalAdd (row);
  4855. selectionChanged = true;
  4856. }
  4857. if (selectionChanged)
  4858. OnSelectionChanged (EventArgs.Empty);
  4859. Invalidate();
  4860. }
  4861. protected override void WndProc (ref Message m)
  4862. {
  4863. base.WndProc (ref m);
  4864. }
  4865. internal void InternalOnCellClick (DataGridViewCellEventArgs e)
  4866. {
  4867. OnCellClick (e);
  4868. }
  4869. internal void InternalOnCellContentClick (DataGridViewCellEventArgs e)
  4870. {
  4871. OnCellContentClick (e);
  4872. }
  4873. internal void InternalOnCellContentDoubleClick (DataGridViewCellEventArgs e)
  4874. {
  4875. OnCellContentDoubleClick (e);
  4876. }
  4877. internal void InternalOnCellValueChanged (DataGridViewCellEventArgs e)
  4878. {
  4879. OnCellValueChanged (e);
  4880. }
  4881. internal void InternalOnDataError (DataGridViewDataErrorEventArgs e)
  4882. {
  4883. /////////////// false? ////////////
  4884. OnDataError (false, e);
  4885. }
  4886. internal void InternalOnMouseWheel (MouseEventArgs e)
  4887. {
  4888. OnMouseWheel (e);
  4889. }
  4890. internal void OnHScrollBarScroll (object sender, ScrollEventArgs e)
  4891. {
  4892. int lastRightVisibleColumntIndex = Columns.Count - DisplayedColumnCount (false);
  4893. horizontalScrollingOffset = e.NewValue;
  4894. int left = 0;
  4895. for (int index = 0; index < Columns.Count; index++) {
  4896. DataGridViewColumn col = Columns[index];
  4897. if (col.Index >= lastRightVisibleColumntIndex) {
  4898. first_col_index = lastRightVisibleColumntIndex;
  4899. Invalidate ();
  4900. OnScroll (e);
  4901. } else if (e.NewValue < left + col.Width) {
  4902. if (first_col_index != index) {
  4903. first_col_index = index;
  4904. Invalidate ();
  4905. OnScroll (e);
  4906. }
  4907. return;
  4908. }
  4909. left += col.Width;
  4910. }
  4911. }
  4912. internal void OnVScrollBarScroll (object sender, ScrollEventArgs e)
  4913. {
  4914. verticalScrollingOffset = e.NewValue;
  4915. if (Rows.Count == 0)
  4916. return;
  4917. int top = 0;
  4918. int lastTopVisibleRowIndex = Rows.Count - DisplayedRowCount (false);
  4919. for (int index = 0; index < Rows.Count; index++) {
  4920. DataGridViewRow row = Rows[index];
  4921. if (!row.Visible)
  4922. continue;
  4923. if (row.Index >= lastTopVisibleRowIndex) {
  4924. first_row_index = lastTopVisibleRowIndex;
  4925. Invalidate ();
  4926. OnScroll (e);
  4927. } else if (e.NewValue < top + row.Height) {
  4928. if (first_row_index != index) {
  4929. first_row_index = index;
  4930. Invalidate ();
  4931. OnScroll (e);
  4932. }
  4933. return;
  4934. }
  4935. top += row.Height;
  4936. }
  4937. first_row_index = lastTopVisibleRowIndex;
  4938. Invalidate ();
  4939. OnScroll (e);
  4940. }
  4941. internal void RaiseCellStyleChanged (DataGridViewCellEventArgs e) {
  4942. OnCellStyleChanged(e);
  4943. }
  4944. internal void OnColumnCollectionChanged (object sender, CollectionChangeEventArgs e) {
  4945. switch (e.Action) {
  4946. case CollectionChangeAction.Add:
  4947. OnColumnAddedInternal(new DataGridViewColumnEventArgs(e.Element as DataGridViewColumn));
  4948. break;
  4949. case CollectionChangeAction.Remove:
  4950. OnColumnPostRemovedInternal(new DataGridViewColumnEventArgs(e.Element as DataGridViewColumn));
  4951. break;
  4952. case CollectionChangeAction.Refresh:
  4953. hover_cell = null;
  4954. MoveCurrentCell (-1, -1, true, false, false, true);
  4955. break;
  4956. }
  4957. }
  4958. // Resizes all columns according to their AutoResizeMode property.
  4959. // First all the columns that aren't Filled are resized, then we resize all the Filled columns.
  4960. internal void AutoResizeColumnsInternal ()
  4961. {
  4962. for (int i = 0; i < Columns.Count; i++)
  4963. AutoResizeColumnInternal (i, Columns [i].InheritedAutoSizeMode);
  4964. AutoFillColumnsInternal ();
  4965. }
  4966. internal void AutoFillColumnsInternal ()
  4967. {
  4968. float totalFillWeight = 0;
  4969. int FillCount = 0; // The number of columns that has AutoSizeMode.Fill set
  4970. int spaceLeft = ClientSize.Width - (verticalScrollBar.VisibleInternal ? verticalScrollBar.Width : 0);
  4971. if (RowHeadersVisible) {
  4972. spaceLeft -= RowHeadersWidth;
  4973. }
  4974. spaceLeft -= BorderWidth * 2;
  4975. int [] fixed_widths = new int [Columns.Count];
  4976. int [] new_widths = new int [Columns.Count];
  4977. bool fixed_any = false;
  4978. for (int i = 0; i < Columns.Count; i++) {
  4979. DataGridViewColumn col = Columns [i];
  4980. if (!col.Visible)
  4981. continue;
  4982. switch (col.InheritedAutoSizeMode) {
  4983. case DataGridViewAutoSizeColumnMode.Fill:
  4984. FillCount++;
  4985. totalFillWeight += col.FillWeight;
  4986. break;
  4987. case DataGridViewAutoSizeColumnMode.AllCellsExceptHeader:
  4988. case DataGridViewAutoSizeColumnMode.AllCells:
  4989. case DataGridViewAutoSizeColumnMode.DisplayedCells:
  4990. case DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader:
  4991. case DataGridViewAutoSizeColumnMode.None:
  4992. case DataGridViewAutoSizeColumnMode.NotSet:
  4993. spaceLeft -= Columns [i].Width;
  4994. break;
  4995. }
  4996. }
  4997. spaceLeft = Math.Max (0, spaceLeft);
  4998. do {
  4999. fixed_any = false;
  5000. for (int i = 0; i < columns.Count; i++) {
  5001. DataGridViewColumn col = Columns [i];
  5002. int width;
  5003. if (col.InheritedAutoSizeMode != DataGridViewAutoSizeColumnMode.Fill)
  5004. continue;
  5005. if (!col.Visible)
  5006. continue;
  5007. if (fixed_widths [i] != 0)
  5008. continue;
  5009. width = (totalFillWeight == 0) ? 0 : (int) Math.Round (spaceLeft * (col.FillWeight / totalFillWeight), 0);
  5010. if (width < 0)
  5011. width = 0;
  5012. if (width < col.MinimumWidth) {
  5013. width = col.MinimumWidth;
  5014. fixed_widths [i] = width;
  5015. fixed_any = true;
  5016. spaceLeft -= width;
  5017. totalFillWeight -= col.FillWeight;
  5018. }
  5019. new_widths [i] = width;
  5020. }
  5021. } while (fixed_any);
  5022. for (int i = 0; i < columns.Count; i++) {
  5023. if (Columns [i].InheritedAutoSizeMode != DataGridViewAutoSizeColumnMode.Fill)
  5024. continue;
  5025. if (!Columns[i].Visible)
  5026. continue;
  5027. Columns [i].Width = new_widths [i];
  5028. }
  5029. }
  5030. internal void AutoResizeColumnInternal (int columnIndex, DataGridViewAutoSizeColumnMode mode)
  5031. {
  5032. // http://msdn2.microsoft.com/en-us/library/ms171605.aspx
  5033. int size = 0;
  5034. DataGridViewColumn col = Columns [columnIndex];
  5035. switch (mode) {
  5036. case DataGridViewAutoSizeColumnMode.Fill:
  5037. return;
  5038. case DataGridViewAutoSizeColumnMode.AllCellsExceptHeader:
  5039. case DataGridViewAutoSizeColumnMode.AllCells:
  5040. case DataGridViewAutoSizeColumnMode.DisplayedCells:
  5041. case DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader:
  5042. size = Math.Max (CalculateColumnCellWidth (columnIndex, col.InheritedAutoSizeMode),
  5043. col.HeaderCell.ContentBounds.Width);
  5044. break;
  5045. case DataGridViewAutoSizeColumnMode.ColumnHeader:
  5046. size = col.HeaderCell.ContentBounds.Width;
  5047. break;
  5048. default:
  5049. size = col.Width;
  5050. break;
  5051. }
  5052. if (size < 0)
  5053. size = 0;
  5054. if (size < col.MinimumWidth)
  5055. size = col.MinimumWidth;
  5056. col.Width = size;
  5057. }
  5058. internal int CalculateColumnCellWidth (int index, DataGridViewAutoSizeColumnMode mode)
  5059. {
  5060. int first_row = 0;
  5061. int last_row = Rows.Count;
  5062. int result = 0;
  5063. if (mode == DataGridViewAutoSizeColumnMode.DisplayedCells ||
  5064. mode == DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader) {
  5065. first_row = first_row_index;
  5066. last_row = DisplayedRowCount (true);;
  5067. }
  5068. for (int i = first_row; i < last_row; i++) {
  5069. if (!Rows[i].Visible)
  5070. continue;
  5071. int cell_width = Rows[i].Cells[index].PreferredSize.Width;
  5072. result = Math.Max (result, cell_width);
  5073. }
  5074. return result;
  5075. }
  5076. Rectangle GetHeaderCellBounds (DataGridViewHeaderCell cell)
  5077. {
  5078. Rectangle bounds = new Rectangle (ClientRectangle.Location, cell.Size);
  5079. if (cell is DataGridViewColumnHeaderCell) {
  5080. if (RowHeadersVisible)
  5081. bounds.X += RowHeadersWidth;
  5082. List<DataGridViewColumn> sortedColumns = columns.ColumnDisplayIndexSortedArrayList;
  5083. for (int index = first_col_index; index < sortedColumns.Count; index++) {
  5084. DataGridViewColumn column = sortedColumns [index];
  5085. if (column.Index == cell.ColumnIndex)
  5086. break;
  5087. bounds.X += column.Width;
  5088. }
  5089. } else {
  5090. if (ColumnHeadersVisible)
  5091. bounds.Y += ColumnHeadersHeight;
  5092. for (int index = first_row_index; index < Rows.Count; index++) {
  5093. DataGridViewRow row = GetRowInternal (index);
  5094. if (row.HeaderCell == cell)
  5095. break;
  5096. bounds.Y += row.Height;
  5097. }
  5098. }
  5099. return bounds;
  5100. }
  5101. private void PrepareEditingRow (bool cell_changed, bool column_changed)
  5102. {
  5103. if (new_row_editing)
  5104. return;
  5105. bool show = false;
  5106. show = ColumnCount > 0 && AllowUserToAddRows;
  5107. if (!show) {
  5108. RemoveEditingRow ();
  5109. } else if (show) {
  5110. if (editing_row != null && (cell_changed || column_changed)) {
  5111. // The row changed, it's no longer an editing row.
  5112. // or
  5113. // The number of columns has changed, we need a new editing row.
  5114. RemoveEditingRow ();
  5115. }
  5116. if (editing_row == null) {
  5117. editing_row = RowTemplateFull;
  5118. Rows.AddInternal (editing_row, false);
  5119. }
  5120. }
  5121. }
  5122. internal void RemoveEditingRow ()
  5123. {
  5124. if (editing_row != null) {
  5125. if (Rows.Contains (editing_row))
  5126. Rows.RemoveInternal (editing_row);
  5127. editing_row = null;
  5128. }
  5129. }
  5130. internal DataGridViewRow EditingRow {
  5131. get { return editing_row; }
  5132. }
  5133. private void AddBoundRow (object element)
  5134. {
  5135. // Don't add rows if there are no columns
  5136. if (ColumnCount == 0)
  5137. return;
  5138. DataGridViewRow row = (DataGridViewRow)RowTemplateFull;
  5139. rows.AddInternal (row, false);
  5140. }
  5141. private bool IsColumnAlreadyBound (string name)
  5142. {
  5143. foreach (DataGridViewColumn col in Columns)
  5144. if (String.Compare (col.DataPropertyName, name, true) == 0)
  5145. return true;
  5146. return false;
  5147. }
  5148. private DataGridViewColumn CreateColumnByType (Type type)
  5149. {
  5150. if (type == typeof (bool))
  5151. return new DataGridViewCheckBoxColumn ();
  5152. else if (typeof(Bitmap).IsAssignableFrom (type))
  5153. return new DataGridViewImageColumn ();
  5154. return new DataGridViewTextBoxColumn ();
  5155. }
  5156. private void ClearBinding ()
  5157. {
  5158. if (IsCurrentCellInEditMode && !EndEdit ())
  5159. CancelEdit ();
  5160. MoveCurrentCell (-1, -1, false, false, false, true);
  5161. if (DataManager != null) {
  5162. DataManager.ListChanged -= OnListChanged;
  5163. DataManager.PositionChanged -= OnListPositionChanged;
  5164. columns.ClearAutoGeneratedColumns ();
  5165. rows.Clear ();
  5166. RemoveEditingRow ();
  5167. }
  5168. }
  5169. private void ResetRows ()
  5170. {
  5171. rows.Clear ();
  5172. RemoveEditingRow ();
  5173. if (DataManager != null) {
  5174. foreach (object element in DataManager.List)
  5175. AddBoundRow (element);
  5176. }
  5177. PrepareEditingRow (false, true);
  5178. OnListPositionChanged (this, EventArgs.Empty);
  5179. }
  5180. private void DoBinding ()
  5181. {
  5182. /* 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:
  5183. - the System.Collections.IList interface, including one-dimensional arrays.
  5184. - the System.ComponentModel.IListSource interface, such as the System.Data.DataTable and System.Data.DataSet classes.
  5185. - the System.ComponentModel.IBindingList interface, such as the System.ComponentModel.Collections.BindingList<> class.
  5186. - the System.ComponentModel.IBindingListView interface, such as the System.Windows.Forms.BindingSource class.
  5187. */
  5188. if (dataSource != null && DataManager != null) {
  5189. if (autoGenerateColumns) {
  5190. is_autogenerating_columns = true;
  5191. foreach (PropertyDescriptor property in DataManager.GetItemProperties()) {
  5192. // This keeps out things like arrays
  5193. if ((typeof(ICollection).IsAssignableFrom (property.PropertyType)))
  5194. continue;
  5195. if (!property.IsBrowsable)
  5196. continue;
  5197. if (IsColumnAlreadyBound (property.Name))
  5198. continue;
  5199. DataGridViewColumn col = CreateColumnByType (property.PropertyType);
  5200. col.Name = property.DisplayName;
  5201. col.DataPropertyName = property.Name;
  5202. col.ReadOnly = !DataManager.AllowEdit || property.IsReadOnly;
  5203. col.ValueType = property.PropertyType;
  5204. col.AutoGenerated = true;
  5205. columns.Add (col);
  5206. }
  5207. is_autogenerating_columns = false;
  5208. }
  5209. // DataBind both autogenerated and not columns if there is a matching property
  5210. foreach (DataGridViewColumn column in columns)
  5211. column.DataColumnIndex = FindDataColumnIndex (column);
  5212. foreach (object element in DataManager.List)
  5213. AddBoundRow (element);
  5214. DataManager.ListChanged += OnListChanged;
  5215. DataManager.PositionChanged += OnListPositionChanged;
  5216. OnDataBindingComplete (new DataGridViewBindingCompleteEventArgs (ListChangedType.Reset));
  5217. OnListPositionChanged (this, EventArgs.Empty);
  5218. } else {
  5219. if (Rows.Count > 0 && Columns.Count > 0)
  5220. MoveCurrentCell (0, 0, true, false, false, false);
  5221. }
  5222. PrepareEditingRow (false, true);
  5223. }
  5224. private void MoveCurrentCell (int x, int y, bool select, bool isControl, bool isShift, bool scroll)
  5225. {
  5226. if (x == -1 || y == -1)
  5227. x = y = -1;
  5228. else {
  5229. if (x < 0 || x > Columns.Count - 1)
  5230. throw new ArgumentOutOfRangeException ("x");
  5231. if (y < 0 || y > Rows.Count - 1)
  5232. throw new ArgumentOutOfRangeException ("y");
  5233. if (!Rows[y].Visible) {
  5234. for (int i = y; i < Rows.Count; i++) {
  5235. if (Rows[i].Visible) {
  5236. y = i;
  5237. break;
  5238. }
  5239. }
  5240. }
  5241. if (!Columns[x].Visible) {
  5242. for (int i = x; i < Columns.Count; i++) {
  5243. if (Columns[i].Visible) {
  5244. x = i;
  5245. break;
  5246. }
  5247. }
  5248. }
  5249. // in case either no visible columns or rows
  5250. if (!Rows[y].Visible || !Columns[x].Visible)
  5251. x = y = -1;
  5252. }
  5253. if (!SetCurrentCellAddressCore (x, y, true, false, false)) {
  5254. ClearSelection ();
  5255. return;
  5256. }
  5257. if (x == -1 && y == -1) {
  5258. ClearSelection ();
  5259. return;
  5260. }
  5261. bool full_row_selected = Rows.SharedRow(CurrentCellAddress.Y).Selected;
  5262. bool full_col_selected = Columns[CurrentCellAddress.X].Selected;
  5263. // Move Selection
  5264. DataGridViewSelectionMode mode = selectionMode;
  5265. // If we are row header select and we clicked a row header, use full row
  5266. if (mode == DataGridViewSelectionMode.RowHeaderSelect && (x == -1 || (full_row_selected && CurrentCellAddress.X == x)))
  5267. mode = DataGridViewSelectionMode.FullRowSelect;
  5268. else if (mode == DataGridViewSelectionMode.RowHeaderSelect)
  5269. mode = DataGridViewSelectionMode.CellSelect;
  5270. // If we are col header select and we clicked a col header, use full col
  5271. if (mode == DataGridViewSelectionMode.ColumnHeaderSelect && (y == -1 || (full_col_selected && CurrentCellAddress.Y == y)))
  5272. mode = DataGridViewSelectionMode.FullColumnSelect;
  5273. else if (mode == DataGridViewSelectionMode.ColumnHeaderSelect)
  5274. mode = DataGridViewSelectionMode.CellSelect;
  5275. // If the current cell isn't visible, scroll to it
  5276. if (scroll) {
  5277. int disp_x = ColumnIndexToDisplayIndex (x);
  5278. bool scrollbarsRefreshed = false;
  5279. int displayedColumnsCount = DisplayedColumnCount (false);
  5280. int delta_x = 0;
  5281. // The trick here is that in order to avoid unnecessary calculations each time a row/column
  5282. // is added/removed we recalculate the whole grid size just before the scroll to selection.
  5283. if (disp_x < first_col_index) {
  5284. RefreshScrollBars ();
  5285. scrollbarsRefreshed = true;
  5286. if (disp_x == 0)
  5287. delta_x = horizontalScrollBar.Value;
  5288. else {
  5289. // in case the column got removed
  5290. if (first_col_index >= ColumnCount)
  5291. first_col_index = ColumnCount - 1;
  5292. for (int i = disp_x; i < first_col_index; i++)
  5293. delta_x += Columns[ColumnDisplayIndexToIndex (i)].Width;
  5294. }
  5295. horizontalScrollBar.SafeValueSet (horizontalScrollBar.Value - delta_x);
  5296. OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
  5297. } else if (disp_x > first_col_index + displayedColumnsCount - 1 && disp_x != 0) {
  5298. RefreshScrollBars ();
  5299. scrollbarsRefreshed = true;
  5300. if (disp_x == Columns.Count - 1)
  5301. delta_x = horizontalScrollBar.Maximum - horizontalScrollBar.Value;
  5302. else
  5303. for (int i = first_col_index + displayedColumnsCount - 1; i < disp_x && i != -1; i++)
  5304. delta_x += Columns[ColumnDisplayIndexToIndex (i)].Width;
  5305. horizontalScrollBar.SafeValueSet (horizontalScrollBar.Value + delta_x);
  5306. OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
  5307. }
  5308. int disp_y = y;
  5309. int displayedRowsCount = DisplayedRowCount (false);
  5310. int delta_y = 0;
  5311. if (disp_y < first_row_index) {
  5312. if (!scrollbarsRefreshed)
  5313. RefreshScrollBars ();
  5314. if (disp_y == 0)
  5315. delta_y = verticalScrollBar.Value;
  5316. else {
  5317. // in case the row got removed
  5318. if (first_row_index >= RowCount)
  5319. first_row_index = RowCount - 1;
  5320. for (int i = disp_y; i < first_row_index; i++)
  5321. delta_y += GetRowInternal (i).Height;
  5322. }
  5323. verticalScrollBar.SafeValueSet (verticalScrollBar.Value - delta_y);
  5324. OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
  5325. } else if (disp_y > first_row_index + displayedRowsCount - 1 && disp_y != 0) {
  5326. if (!scrollbarsRefreshed)
  5327. RefreshScrollBars ();
  5328. if (disp_y == Rows.Count - 1)
  5329. delta_y = verticalScrollBar.Maximum - verticalScrollBar.Value;
  5330. else
  5331. for (int i = first_row_index + displayedRowsCount - 1; i < disp_y; i++)
  5332. delta_y += GetRowInternal (i).Height;
  5333. verticalScrollBar.SafeValueSet (verticalScrollBar.Value + delta_y);
  5334. OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
  5335. }
  5336. }
  5337. if (!select)
  5338. return;
  5339. // Clear old selection unless multi-selecting
  5340. if (!isShift)
  5341. ClearSelection ();
  5342. switch (mode) {
  5343. case DataGridViewSelectionMode.CellSelect:
  5344. SetSelectedCellCore (x, y, true);
  5345. break;
  5346. case DataGridViewSelectionMode.FullRowSelect:
  5347. SetSelectedRowCore (y, true);
  5348. break;
  5349. case DataGridViewSelectionMode.FullColumnSelect:
  5350. SetSelectedColumnCore (x, true);
  5351. break;
  5352. }
  5353. Invalidate ();
  5354. }
  5355. private int ColumnIndexToDisplayIndex (int index)
  5356. {
  5357. if (index == -1)
  5358. return index;
  5359. return Columns[index].DisplayIndex;
  5360. }
  5361. private int ColumnDisplayIndexToIndex (int index)
  5362. {
  5363. return Columns.ColumnDisplayIndexSortedArrayList[index].Index;
  5364. }
  5365. private void OnListChanged (object sender, ListChangedEventArgs args)
  5366. {
  5367. switch (args.ListChangedType) {
  5368. case ListChangedType.ItemAdded:
  5369. AddBoundRow (DataManager[args.NewIndex]);
  5370. break;
  5371. case ListChangedType.ItemDeleted:
  5372. Rows.RemoveAtInternal (args.NewIndex);
  5373. break;
  5374. case ListChangedType.ItemChanged:
  5375. break;
  5376. default:
  5377. ResetRows ();
  5378. break;
  5379. }
  5380. Invalidate ();
  5381. }
  5382. private void OnListPositionChanged (object sender, EventArgs args)
  5383. {
  5384. if (Rows.Count > 0 && Columns.Count > 0 && DataManager.Position != -1)
  5385. MoveCurrentCell (currentCell != null ? currentCell.ColumnIndex : 0, DataManager.Position,
  5386. true, false, false, true);
  5387. else
  5388. MoveCurrentCell (-1, -1, true, false, false, true);
  5389. }
  5390. private void ReBind ()
  5391. {
  5392. if (!is_binding) {
  5393. SuspendLayout ();
  5394. is_binding = true;
  5395. ClearBinding ();
  5396. DoBinding ();
  5397. is_binding = false;
  5398. ResumeLayout (true);
  5399. Invalidate ();
  5400. }
  5401. }
  5402. private bool MouseOverColumnResize (int col, int mousex)
  5403. {
  5404. if (!allowUserToResizeColumns)
  5405. return false;
  5406. Rectangle col_bounds = GetCellDisplayRectangle (col, 0, false);
  5407. if (mousex >= col_bounds.Right - 4 && mousex <= col_bounds.Right)
  5408. return true;
  5409. return false;
  5410. }
  5411. private bool MouseOverRowResize (int row, int mousey)
  5412. {
  5413. if (!allowUserToResizeRows)
  5414. return false;
  5415. Rectangle row_bounds = GetCellDisplayRectangle (0, row, false);
  5416. if (mousey >= row_bounds.Bottom - 4 && mousey <= row_bounds.Bottom)
  5417. return true;
  5418. return false;
  5419. }
  5420. private void DrawVerticalResizeLine (int x)
  5421. {
  5422. Rectangle splitter = new Rectangle (x, Bounds.Y + 3 + (ColumnHeadersVisible ? ColumnHeadersHeight : 0), 1, Bounds.Height - 3 - (ColumnHeadersVisible ? ColumnHeadersHeight : 0));
  5423. XplatUI.DrawReversibleRectangle (Handle, splitter, 2);
  5424. }
  5425. private void DrawHorizontalResizeLine (int y)
  5426. {
  5427. Rectangle splitter = new Rectangle (Bounds.X + 3 + (RowHeadersVisible ? RowHeadersWidth : 0), y, Bounds.Width - 3 + (RowHeadersVisible ? RowHeadersWidth : 0), 1);
  5428. XplatUI.DrawReversibleRectangle (Handle, splitter, 2);
  5429. }
  5430. #region Stuff for ToolTips
  5431. private void MouseEnteredErrorIcon (DataGridViewCell item)
  5432. {
  5433. tooltip_currently_showing = item;
  5434. ToolTipTimer.Start ();
  5435. }
  5436. private void MouseLeftErrorIcon (DataGridViewCell item)
  5437. {
  5438. ToolTipTimer.Stop ();
  5439. ToolTipWindow.Hide (this);
  5440. tooltip_currently_showing = null;
  5441. }
  5442. private Timer ToolTipTimer {
  5443. get {
  5444. if (tooltip_timer == null) {
  5445. tooltip_timer = new Timer ();
  5446. tooltip_timer.Enabled = false;
  5447. tooltip_timer.Interval = 500;
  5448. tooltip_timer.Tick += new EventHandler (ToolTipTimer_Tick);
  5449. }
  5450. return tooltip_timer;
  5451. }
  5452. }
  5453. private ToolTip ToolTipWindow {
  5454. get {
  5455. if (tooltip_window == null)
  5456. tooltip_window = new ToolTip ();
  5457. return tooltip_window;
  5458. }
  5459. }
  5460. private void ToolTipTimer_Tick (object o, EventArgs args)
  5461. {
  5462. string tooltip = tooltip_currently_showing.ErrorText;
  5463. if (!string.IsNullOrEmpty (tooltip))
  5464. ToolTipWindow.Present (this, tooltip);
  5465. ToolTipTimer.Stop ();
  5466. }
  5467. #endregion
  5468. private class ColumnSorter : IComparer
  5469. {
  5470. int column;
  5471. int direction = 1;
  5472. bool numeric_sort;
  5473. public ColumnSorter (DataGridViewColumn column, ListSortDirection direction, bool numeric)
  5474. {
  5475. this.column = column.Index;
  5476. this.numeric_sort = numeric;
  5477. if (direction == ListSortDirection.Descending)
  5478. this.direction = -1;
  5479. }
  5480. #region IComparer Members
  5481. public int Compare (object x, object y)
  5482. {
  5483. DataGridViewRow row1 = (DataGridViewRow)x;
  5484. DataGridViewRow row2 = (DataGridViewRow)y;
  5485. if (row1.Cells[column].ValueType == typeof (DateTime) && row2.Cells[column].ValueType == typeof (DateTime))
  5486. return DateTime.Compare ((DateTime)row1.Cells[column].Value, (DateTime)row2.Cells[column].Value) * direction;
  5487. object val1 = row1.Cells[column].FormattedValue;
  5488. object val2 = row2.Cells[column].FormattedValue;
  5489. object val1NullValue = row1.Cells[column].InheritedStyle.NullValue;
  5490. object val2NullValue = row2.Cells[column].InheritedStyle.NullValue;
  5491. if (val1 == val1NullValue && val2 == val2NullValue)
  5492. return 0;
  5493. if (val1 == val1NullValue)
  5494. return direction;
  5495. if (val2 == val2NullValue)
  5496. return -1 * direction;
  5497. if (numeric_sort)
  5498. return (int)(double.Parse (val1.ToString ()) - double.Parse (val2.ToString ())) * direction;
  5499. else
  5500. return string.Compare (val1.ToString (), val2.ToString ()) * direction;
  5501. }
  5502. #endregion
  5503. }
  5504. public sealed class HitTestInfo {
  5505. public static readonly HitTestInfo Nowhere = new HitTestInfo(-1, -1, -1, -1, DataGridViewHitTestType.None);
  5506. private int columnIndex;
  5507. private int columnX;
  5508. private int rowIndex;
  5509. private int rowY;
  5510. private DataGridViewHitTestType type;
  5511. internal HitTestInfo (int columnIndex, int columnX, int rowIndex, int rowY, DataGridViewHitTestType type) {
  5512. this.columnIndex = columnIndex;
  5513. this.columnX = columnX;
  5514. this.rowIndex = rowIndex;
  5515. this.rowY = rowY;
  5516. this.type = type;
  5517. }
  5518. public int ColumnIndex {
  5519. get { return columnIndex; }
  5520. }
  5521. public int ColumnX {
  5522. get { return columnX; }
  5523. }
  5524. public int RowIndex {
  5525. get { return rowIndex; }
  5526. }
  5527. public int RowY {
  5528. get { return rowY; }
  5529. }
  5530. public DataGridViewHitTestType Type {
  5531. get { return type; }
  5532. }
  5533. public override bool Equals (object value) {
  5534. if (value is HitTestInfo) {
  5535. HitTestInfo aux = (HitTestInfo) value;
  5536. if (aux.columnIndex == columnIndex && aux.columnX == columnX && aux.rowIndex == rowIndex && aux.rowY == rowY && aux.type == type) {
  5537. return true;
  5538. }
  5539. }
  5540. return false;
  5541. }
  5542. public override int GetHashCode () {
  5543. return base.GetHashCode();
  5544. }
  5545. public override string ToString () {
  5546. return string.Format ("Type:{0}, Column:{1}, Row:{2}", type, columnIndex, rowIndex);
  5547. }
  5548. }
  5549. [ComVisible (false)]
  5550. public class DataGridViewControlCollection : Control.ControlCollection
  5551. {
  5552. private DataGridView owner;
  5553. public DataGridViewControlCollection (DataGridView owner) : base (owner)
  5554. {
  5555. this.owner = owner;
  5556. }
  5557. public override void Clear ()
  5558. {
  5559. //
  5560. // This is severely buggy, just as MS' implementation is.
  5561. //
  5562. for (int i = 0; i < Count; i++) {
  5563. Remove (this [i]);
  5564. }
  5565. }
  5566. public void CopyTo (Control [] array, int index)
  5567. {
  5568. base.CopyTo (array, index);
  5569. }
  5570. public void Insert (int index, Control value)
  5571. {
  5572. throw new NotSupportedException ();
  5573. }
  5574. public override void Remove (Control value)
  5575. {
  5576. if (value == owner.horizontalScrollBar)
  5577. return;
  5578. if (value == owner.verticalScrollBar)
  5579. return;
  5580. if (value == owner.editingControl)
  5581. return;
  5582. base.Remove (value);
  5583. }
  5584. internal void RemoveInternal (Control value)
  5585. {
  5586. base.Remove (value);
  5587. }
  5588. }
  5589. [ComVisibleAttribute(true)]
  5590. protected class DataGridViewAccessibleObject : ControlAccessibleObject {
  5591. public DataGridViewAccessibleObject (DataGridView owner) : base (owner){
  5592. }
  5593. public override AccessibleRole Role {
  5594. get { return base.Role; }
  5595. }
  5596. public override string Name {
  5597. get { return base.Name; }
  5598. }
  5599. public override AccessibleObject GetChild (int index) {
  5600. return base.GetChild(index);
  5601. }
  5602. public override int GetChildCount () {
  5603. return base.GetChildCount();
  5604. }
  5605. public override AccessibleObject GetFocused () {
  5606. return base.GetFocused();
  5607. }
  5608. public override AccessibleObject GetSelected () {
  5609. return base.GetSelected();
  5610. }
  5611. public override AccessibleObject HitTest (int x, int y) {
  5612. return base.HitTest(x, y);
  5613. }
  5614. public override AccessibleObject Navigate( AccessibleNavigation navigationDirection) {
  5615. return base.Navigate(navigationDirection);
  5616. }
  5617. }
  5618. [ComVisible (true)]
  5619. protected class DataGridViewTopRowAccessibleObject : AccessibleObject
  5620. {
  5621. #region Constructors
  5622. public DataGridViewTopRowAccessibleObject ()
  5623. {
  5624. }
  5625. public DataGridViewTopRowAccessibleObject (DataGridView owner)
  5626. {
  5627. this.owner = owner;
  5628. }
  5629. #endregion
  5630. #region Public Methods
  5631. public override AccessibleObject GetChild (int index)
  5632. {
  5633. return base.GetChild (index);
  5634. }
  5635. public override int GetChildCount ()
  5636. {
  5637. return base.GetChildCount ();
  5638. }
  5639. public override AccessibleObject Navigate (AccessibleNavigation navigationDirection)
  5640. {
  5641. return base.Navigate (navigationDirection);
  5642. }
  5643. #endregion
  5644. #region Public Properties
  5645. public override Rectangle Bounds {
  5646. get { return base.Bounds; }
  5647. }
  5648. public override string Name {
  5649. get { return base.Name; }
  5650. }
  5651. public DataGridView Owner {
  5652. get { return (DataGridView)owner; }
  5653. set {
  5654. if (owner != null)
  5655. throw new InvalidOperationException ("owner has already been set");
  5656. owner = value;
  5657. }
  5658. }
  5659. public override AccessibleObject Parent {
  5660. get { return base.Parent; }
  5661. }
  5662. public override AccessibleRole Role {
  5663. get { return base.Role; }
  5664. }
  5665. public override string Value {
  5666. get { return base.Value; }
  5667. }
  5668. #endregion
  5669. }
  5670. }
  5671. }