Batch Editing in Grid Control
11 Jan 202312 minutes to read
In batch edit mode, when you double-click on the grid cell, then the target cell changed to edit state. You can bulk save (added, changed and deleted data in the single request) to data source by click on the toolbar’s Update button or by externally calling the batchSave method. To enable Batch edit, set the mode
property of e-grid-editSettings
tag helper as Batch.
<ejs-grid id="Grid" dataSource="@ViewBag.DataSource" height="273" toolbar="@(new List<string>() { "Add", "Delete","Update","Cancel" })">
<e-grid-editSettings allowAdding="true" allowDeleting="true" allowEditing="true" mode="Batch"></e-grid-editSettings>
<e-grid-columns>
<e-grid-column field="OrderID" headerText="Order ID" validationRules="@(new { required=true})" isPrimaryKey="true" textAlign="Right" width="100"></e-grid-column>
<e-grid-column field="CustomerID" headerText="Customer ID" allowEditing="false" validationRules="@(new { required=true, minLength=3})" type="string" width="120"></e-grid-column>
<e-grid-column field="Freight" headerText="Freight" textAlign="Right" format="C2" editType="numericedit" width="120"></e-grid-column>
<e-grid-column field="ShipCountry" headerText="Ship Country" width="150"></e-grid-column>
</e-grid-columns>
</ejs-grid>
public IActionResult Index()
{
var Order = OrderDetails.GetAllRecords();
ViewBag.DataSource = Order;
return View();
}
If a column’s AllowEditing property is set to false, then the focus can be skipped in that non-editable column by clicking the tab or shift-tab key while in batch edit mode.
Cancel edit based on condition in batch mode
You can prevent the CRUD operations of the Batch edit Grid by using condition in the cellEdit
, beforeBatchAdd
and beforeBatchDelete
events for Edit, Add and Delete actions respectively.
In the below demo, we prevent the CRUD operation based on the Role
column value. If the Role Column is Employee
, we are unable to edit/delete that row.
<button onclick="btnClick(event)">Grid is Addable</button>
<ejs-grid id="Grid" dataSource="@ViewBag.DataSource" height="273" toolbar="@(new List<string>() { "Add", "Delete","Update","Cancel" })" cellEdit="cellEdit" beforeBatchAdd="beforeBatchAdd" beforeBatchDelete="beforeBatchDelete">
<e-grid-editSettings allowAdding="true" allowDeleting="true" allowEditing="true" mode="Batch"></e-grid-editSettings>
<e-grid-columns>
<e-grid-column field="OrderID" headerText="Order ID" validationRules="@(new { required=true})" isPrimaryKey="true" textAlign="Right" width="100"></e-grid-column>
<e-grid-column field="Role" headerText="Role" width="120"></e-grid-column>
<e-grid-column field="Freight" headerText="Freight" textAlign="Right" format="C2" editType="numericedit" width="120"></e-grid-column>
<e-grid-column field="ShipCountry" headerText="Ship Country" width="150"></e-grid-column>
</e-grid-columns>
</ejs-grid>
<script>
var isAddable = true;
function btnClick(args) {
args.target.innerText == 'Grid is Addable' ? (args.target.innerText = 'Grid is Not Addable') : (args.target.innerText = 'Grid is Addable');
isAddable = !isAddable;
}
function cellEdit(args) {
if (args.rowData['Role'] == 'Employee') {
args.cancel = true;
}
}
function beforeBatchAdd(args) {
if (!isAddable) {
args.cancel = true;
}
}
function beforeBatchDelete(args) {
if (args.rowData['Role'] == 'Employee') {
args.cancel = true;
}
}
</script>
public IActionResult Index()
{
var Order = OrderDetails.GetAllRecords();
ViewBag.DataSource = Order;
return View();
}
Confirmation dialog
By default, grid will show the confirm dialog when saving or canceling or performing any actions like filtering, sorting, etc.
<ejs-grid id="Grid" dataSource="@ViewBag.DataSource" height="273" toolbar="@(new List<string>() { "Add", "Delete","Update", "Cancel" })">
<e-grid-editSettings allowAdding="true" allowDeleting="true" allowEditing="true" mode="Batch" showDeleteConfirmDialog="true"></e-grid-editSettings>
<e-grid-columns>
<e-grid-column field="OrderID" headerText="Order ID" isPrimaryKey="true" textAlign="Right" width="100"></e-grid-column>
<e-grid-column field="CustomerID" headerText="Customer ID" type="string" width="120"></e-grid-column>
<e-grid-column field="Freight" headerText="Freight" textAlign="Right" format="C2" editType="numericedit" width="120"></e-grid-column>
<e-grid-column field="ShipCountry" headerText="Ship Country" width="150"></e-grid-column>
</e-grid-columns>
</ejs-grid>
public IActionResult Index()
{
var Order = OrderDetails.GetAllRecords();
ViewBag.DataSource = Order;
return View();
}
NOTE
showConfirmDialog
requires themode
to be Batch.
* IfshowConfirmDialog
set to false, then confirmation dialog does not display in batch editing.
How to make editing in single click and arrow keys
When using batch mode, the TAB key allows you to edit or move to the next cell or row from the current record by default. Using the grid’s load event, the same functionality can also be achieved by pressing the arrow keys. Additionally, the editCell
method of the grid allows for cells to be made editable with a single click.
In the following sample, the Load event of the Grid will be used to bind the keydown event handler. When any arrow key is pressed, the editCell
method of the Grid will be used to identify the next or previous cell (td) and set it to be editable. Additionally, it is possible to enable editing of a cell with a single click by utilizing the editCell
method within the Created event of the Grid.
<ejs-grid id="Grid" dataSource="ViewBag.DataSource" allowPaging="true" enableHover="true" created="created" load="load" toolbar="@(new List<string>() {"Add", "Edit", "Delete", "Update", "Cancel"})" load="load">
<e-grid-editSettings allowAdding="true" allowEditing="true" allowDeleting="true" mode="Batch"></e-grid-editSettings>
<e-grid-columns>
<e-grid-column field="OrderID" headerText="Order ID" textAlign="Right" width="100" isPrimaryKey="true"></e-grid-column>
<e-grid-column field="CustomerID" headerText="Customer ID" width="120"></e-grid-column>
<e-grid-column field="Freight" headerText="Freight" textAlign="Right" width="120" format="C2"></e-grid-column>
<e-grid-column field="ShipCountry" headerText="Ship Country" width="150"></e-grid-column>
</e-grid-columns>
</ejs-grid>
<script>
function load(args) {
var grid = document.getElementById('Grid').ej2_instances[0];
grid.element.addEventListener('keydown', function (e) {
var closesttd = (e.target).closest('td');
if (e.keyCode === 39 && !ej.base.isNullOrUndefined(closesttd.nextSibling)) {
editACell(closesttd.nextSibling);
}
if (e.keyCode === 37 && !ej.base.isNullOrUndefined(closesttd.previousSibling) &&
!grid.getColumnByIndex(
parseInt(closesttd.previousSibling.getAttribute('data-colindex'))).isPrimaryKey) {
editACell(closesttd.previousSibling);
}
if (e.keyCode === 40 && !ej.base.isNullOrUndefined(closesttd.closest('tr').nextSibling)) {
editACell(
closesttd.closest('tr').nextSibling.querySelectorAll('td')[
parseInt(closesttd.getAttribute('data-colindex'))]);
}
if (e.keyCode === 38 && !ej.base.isNullOrUndefined(closesttd.closest('tr').previousSibling)) {
editACell(
closesttd.closest('tr').previousSibling.querySelectorAll('td')[
parseInt(closesttd.getAttribute('data-colindex'))]);
}
});
}
function created(args) {
var grid = document.getElementById('Grid').ej2_instances[0];
grid.getContentTable().addEventListener('click', function (args) {
if ((args.target).classList.contains('e-rowcell')) {
grid.editModule.editCell(parseInt((args.target).getAttribute('index')),
grid.getColumnByIndex(parseInt(args.target.getAttribute('data-colindex'))).field);
}
});
}
function editACell(args) {
var grid = document.getElementById('Grid').ej2_instances[0];
grid.editModule.editCell(
parseInt(args.getAttribute('index')),
grid.getColumnByIndex(parseInt(args.getAttribute('data-colindex'))).field);
}
</script>
public IActionResult Index()
{
var Order = OrderDetails.GetAllRecords();
ViewBag.DataSource = Order;
return View();
}