The issue in your Code In Page load you are re initiate the DataTable... Other thing is you now maintaining the datatable values between the post Back. Use Below code.
protected void Page_Load(object sender, EventArgs e)
{
if (ViewState["DT"] != null)
{
dt = (DataTable)ViewState["DT"];
}
else
{
dt = new DataTable();
DataColumn dc1 = new DataColumn("FirstName");
DataColumn dc2 = new DataColumn("MiddleName");
DataColumn dc3 = new DataColumn("LastName");
DataColumn dc4 = new DataColumn("Gender");
dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
dt.Columns.Add(dc3);
dt.Columns.Add(dc4);
ViewState["DT"] = dt;
}
}
protected void Button3_Click(object sender, EventArgs e)
{
DataRow Dr = dt.NewRow();
Dr[0] = TextBox1.Text;
Dr[1] = TextBox2.Text;
Dr[2] = TextBox3.Text;
Dr[3] = TextBox4.Text;
dt.Rows.Add(Dr);
dt.AcceptChanges();
ViewState["DT"] = dt;
GridView1.DataSource = dt;
GridView1.DataBind();
ClearFields();
}