Here's a solution using only code begind and no JavaScript:
1. To achieve this, make use of the form.defaultbutton property.
2. Ensure that edit controls .e.g text boxes are manually defined in TemplateFields with Id property set.
3. Ensure the Edit, Update buttons are also defined manually inside TemplateFields with Ids set, this is how the enter button will allow you to update, and move on to next row.
4. SetFocus() - tailor this to your own requirement to aid user experience.
Markup:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="EnterKeyEditGrid.aspx.cs" Inherits="WebFormsGridViewCommand.EnterKeyEditGrid" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView runat="server" ID="gv1"
AutoGenerateColumns="false"
OnRowEditing="gv1_RowEditing"
OnRowCancelingEdit="gv1_RowCancelingEdit"
OnRowUpdating="gv1_RowUpdating">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<%#Eval("Item") %>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" ID="ItemTextBox" Text='<%#Eval("Item") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderText="Price" DataField="Price" DataFormatString="{0:c}" />
<asp:TemplateField>
<ItemTemplate>
<asp:Button runat="server" ID="editButton" Text="Edit" CommandName="edit" />
</ItemTemplate>
<EditItemTemplate>
<asp:Button runat="server" ID="updateButton" Text="Update" CommandName="update" ClientIDMode="AutoID" />
<asp:Button runat="server" ID="cancelButton" Text="Cancel" CommandName="cancel" />
</EditItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</form>
</body>
</html>
Code:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebFormsGridViewCommand
{
public partial class EnterKeyEditGrid : System.Web.UI.Page
{
private const string SESSION_GV_DATA = "Data";
private DataTable _Data
{
get
{
if (Session[SESSION_GV_DATA] == null)
{
Session[SESSION_GV_DATA] = GetData();
}
return (DataTable)Session[SESSION_GV_DATA];
}
set { Session[SESSION_GV_DATA] = value; }
}
public void SetUpdateButtonId()
{
if (gv1.EditIndex != -1)
{
Button updateButton = (Button)gv1.Rows[gv1.EditIndex].FindControl("UpdateButton");
if (updateButton != null)
{
Form.DefaultButton = updateButton.UniqueID;
}
}
else
{
Form.DefaultButton = null;
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
LoadGridView();
}
}
protected void LoadGridView()
{
_Data = GetData();
gv1.DataSource = _Data;
gv1.DataBind();
}
private DataTable GetData()
{
DataTable dt = new DataTable("data1");
dt.Columns.AddRange(
new DataColumn[]
{
new DataColumn("Item",typeof(string)),
new DataColumn("Price", typeof(decimal))
});
List<object[]> dataItems = new List<object[]>
{
new object[] { "Apple", 0.30m },
new object[] { "Orange", 0.20m },
new object[] { "Pear", 0.40m }
};
dataItems.ForEach(x => dt.Rows.Add(x));
return dt;
}
protected void gv1_RowEditing(object sender, GridViewEditEventArgs e)
{
gv1.EditIndex = e.NewEditIndex;
LoadGridView();
SetFocus();
}
protected void gv1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
gv1.EditIndex = -1;
LoadGridView();
}
protected void gv1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
SetEditRow();
LoadGridView();
SetUpdateButtonId();
SetFocus();
}
private void SetEditRow()
{
if (gv1.EditIndex == -1) return;
if (gv1.EditIndex + 1 < gv1.Rows.Count)
{
if (gv1.Rows[gv1.EditIndex + 1].RowType == DataControlRowType.DataRow)
{
gv1.EditIndex++;
}
}
else
{
gv1.EditIndex = -1;
}
}
private void SetFocus()
{
if (gv1.EditIndex == -1) return;
gv1.Rows[gv1.EditIndex].Cells[0].FindControl("ItemTextBox").Focus();
}
}
}