Set DataKeyNames property to "userid", use bind on textboxes and rewrite code like this.
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
var name = e.NewValues["name"] as string;
var age = e.NewValues["age"] as string;
var userid = (string)e.Keys[0];
UpdateProduct(userid, name, age);
}
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowCancelingEdit="GridView1_RowcancelingEdit" OnRowUpdating="GridView1_RowUpdating" DataKeyNames="userid" OnRowEditing="GridView1_RowEditing" >
<Columns>
<asp:BoundField DataField="userid" HeaderText="userid" ReadOnly="true" />
<asp:TemplateField HeaderText="name">
<ItemTemplate>
<%# Eval("name")%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" ID="txtname" Text='<%# Bind("name")%>' />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="age">
<ItemTemplate>
<%# Eval("age")%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" ID="txtage" Text='<%# Bind("age")%>' />
</EditItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowEditButton="True" ButtonType="Button" />
</Columns>
</asp:GridView>