It seems that as your page is being refreshed so you lose previous data .
You can use asp:UpdatePanel and ViewState to hold previous data and place a asyn triggger for insert button event.
Here is a your solution
In .Aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication8._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div><asp:ScriptManager runat="server"></asp:ScriptManager>
<asp:TextBox ID="txtRoll" runat="server" ></asp:TextBox>
<asp:Button ID="btnAdd" runat="server" Text="Push" OnClick="btnAdd_Click" />
<asp:UpdatePanel ID="up" runat="server">
<ContentTemplate>
<asp:gridview ID="Gridview1" runat="server"></asp:gridview>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnAdd" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
Code behind
public List<string> alstroll;
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
alstroll = new List<string>();
ViewState["RollList"] = alstroll;
}
else
alstroll = (List<string>)ViewState["RollList"];
Gridview1.DataSource = alstroll;
Gridview1.DataBind();
}
protected void btnAdd_Click(object sender,EventArgs e)
{
if (txtRoll.Text != null)
{
alstroll.Add(txtRoll.Text);
ViewState["RollList"] = alstroll;
Gridview1.DataBind();
}
}