As discussed in the comments, the problem is caused by binding the grid on every page load without checking the
IsPostBack
property first.
Every time you bind the grid, it throws away anything that the user has typed, and recreates the entire grid control tree based on the markup and the data.
Instead of:
protected void Page_Load(object sender, EventArgs e)
{
BindGrid();
}
Use:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindGrid();
}
}