Using the Row for New Records in the Windows Forms DataGridView Control
When you use a DataGridView for editing data in your application, you will often want to give your users the ability to add new rows of data to the data store. The DataGridView control supports this functionality by providing a row for new records, which is always shown as the last row. It is marked with an asterisk (*) symbol in its row header. The following sections discuss some of the things you should consider when you program with the row for new records enabled.
Displaying the Row for New Records
Use the AllowUserToAddRows property to indicate whether the row for new records is displayed. The default value of this property is
For the data bound case, the row for new records will be shown if the AllowUserToAddRows property of the control and the IBindingList.AllowNew property of the data source are both
true. If either is
false then the row will not be shown.
Populating the Row for New Records with Default Data
This event provides access to the new DataGridViewRow and enables you to populate the new row with default data. For more information, see How to: Specify Default Values for New Rows in the Windows Forms DataGridView Control
The Rows Collection
The row for new records cannot be removed from the Rows collection programmatically. An InvalidOperationException is thrown if this is attempted. The user also cannot delete the row for new records. The DataGridViewRowCollection.Clear method does not remove this row from the Rows collection.
No row can be added after the row for new records. An InvalidOperationException is raised if this is attempted. As a result, the row for new records is always the last row in the DataGridView control. The methods on DataGridViewRowCollection that add rows—Add, AddCopy, and AddCopies—all call insertion methods internally when the row for new records is present.
Visual Customization of the Row for New Records
When the row for new records is created, it is based on the row specified by the RowTemplate property. Any cell styles that are not specified for this row are inherited from other properties. For more information about cell style inheritance, see Cell Styles in the Windows Forms DataGridView Control.
The initial values displayed by cells in the row for new records are retrieved from each cell's DefaultNewRowValue property. For cells of type DataGridViewImageCell, this property returns a placeholder image. Otherwise, this property returns
null. You can override this property to return a custom value. However, these initial values can be replaced by a DefaultValuesNeeded event handler when focus enters the row for new records.
The standard icons for this row's header, which are an arrow or an asterisk, are not exposed publicly. If you want to customize the icons, you will need to create a custom DataGridViewRowHeaderCell class.
If the row header cell has a string value set, and if there is not enough room for both the text and icon, the icon is dropped first.
In unbound mode, new records will always be added to the end of the DataGridView even if the user has sorted the content of the DataGridView. The user will need to apply the sort again in order to sort the row to the correct position; this behavior is similar to that of the ListView control.
In data bound and virtual modes, the insertion behavior when a sort is applied will be dependent on the implementation of the data model. For ADO.NET, the row is immediately sorted into the correct position.
Other Notes on the Row for New Records
The row for new records is always created in the unselected state.
If you are implementing virtual mode, you will need to track when a row for new records is needed in the data model and when to roll back the addition of the row. The exact implementation of this functionality depends on the implementation of the data model and its transaction semantics, for example, whether commit scope is at the cell or row level. For more information, see Virtual Mode in the Windows Forms DataGridView Control.