Your issue is that you call Binddata() on every iteration of a row.
Move the Binddata() call out of the foreach completely. Don't rebind your data until you are done processing.
foreach (GridViewRow row in GridView1.Rows)
{
CheckBox chk = (CheckBox)row.FindControl("CheckBox1");
if (chk.Checked)
{
int id = Convert.ToInt32("",GridView1.DataKeys[row.RowIndex].Value);
SqlConnection sqlconn = new SqlConnection("server=.\\sqlexpress;database=practice;integrated security=true");
SqlCommand sqlcomm = new SqlCommand("delete from prac where id='"+id+"'", sqlconn);
sqlconn.Open();
sqlcomm.ExecuteNonQuery();
sqlconn.Close();
Label1.Text = "Record Deleted";
}
}
Binddata();