You have made a very simple error in your logic. Try this.
The problem is that if any row doesn't have the checkbox checked you are displaying the label instead of if none are checked. I've removed the code that isn't relevant to the answer.
protected void Button3_Click(object sender, EventArgs e)
{
bool isAnythingChecked = false;
foreach (GridViewRow row in GridView1.Rows)
{
CheckBox chk = (CheckBox)row.FindControl("chk1");
if (chk != null && chk.Checked)
{
isAnythingChecked = true;
}
}
if (!isAnythingChecked)
{
Label2.Text = "Please select atlease one record";
}
}