Некоторые вещи идут не так, в первую очередь вы просматриваете все строки в сетке, пока изменилось только одно текстовое поле. Таким образом, для каждого Employeeumber в каждой строке, отсутствующей в таблице данных, вы уже получаете сообщение об ошибке.
Вы можете найти active / currentrow с помощью: (sender как TextBox) .NamingContainer как GridViewRow.
Во-вторых, для каждой записи в таблице данных до (если) вы найдете число сотрудников, вы получаете сообщение об ошибке, когда текстовое поле пустое.
Код ниже должен делать то, что вы хотите.
protected void txtEmployeeNumber_TextChanged(Object sender, EventArgs e) {
string EmployeeNo = "";
string EmployeeName = "";
DataTable dt = (DataTable)Application["Employee_details"];
var row = (sender as TextBox).NamingContainer as GridViewRow;
EmployeeNo = (row.FindControl("txtEmployeeNumber") as TextBox).Text;
var txtEmployeeName = (row.FindControl("txtEmployeeName") as TextBox);
EmployeeName = txtEmployeeName.Text;
for (int i = 0; i < dt.Rows.Count; i++) {
if (dt.Rows[i]["Employee_ID"].ToString() == EmployeeNo) {
txtEmployeeName.Text = dt.Rows[i]["Employee_Name"].ToString();
return;
}
}
ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "Error", "alert('No Data Found...')", true);
}