循环内IF条件失效:TextBox值变更时无法正确匹配员工数据
解决TextBox值变更事件中IF条件失效的问题
嘿,我帮你排查了这段代码里的问题,难怪不管有没有匹配数据都会弹出"No Data Found..."的提示——核心问题出在你判断匹配的逻辑时机不对,还有一些小细节需要调整。
问题分析
- 错误的提示触发时机:你在DataTable的循环里,每遇到一行不匹配的员工数据就立刻触发错误提示,而不是等遍历完所有数据确认完全找不到匹配项再弹。这就导致哪怕后面有匹配的行,前面的循环已经弹出提示了,而且不管最终有没有找到,都会弹一次甚至多次提示。
- 冗余的DataTable初始化:你把
DataTable dt = (DataTable)Application["Employee_details"];放在了GridView的foreach循环内部,每次遍历GridView行都重新取一次数据,虽然不影响功能,但没必要重复操作。 - 未处理非数据行:遍历GridViewRow时没有跳过非数据行(比如表头行),可能导致EmployeeNo为空,引发误判。
- 重复的控件查找:多次调用
FindControl获取同一个文本框,既影响效率也降低了代码可读性。
修正后的代码
protected void txtEmployeeNumber_TextChanged(object sender, EventArgs e) { // 先从Application获取员工数据,只执行一次即可 DataTable dt = Application["Employee_details"] as DataTable; if (dt == null) { ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "DataError", "alert('Employee data is not available...')", true); return; } // 遍历GridView的每一行 foreach (GridViewRow row in grdRegister.Rows) { // 只处理数据行,跳过表头、页脚等非数据行 if (row.RowType != DataControlRowType.DataRow) continue; // 获取当前行的员工编号文本框内容,做空值和空格处理 TextBox txtEmpNo = row.Cells[1].FindControl("txtEmployeeNumber") as TextBox; string EmployeeNo = txtEmpNo?.Text?.Trim() ?? ""; // 获取当前行的员工姓名文本框,提前缓存避免重复查找 TextBox txtEmpName = row.Cells[2].FindControl("txtEmployeeName") as TextBox; if (txtEmpName == null) continue; bool isMatchFound = false; // 遍历员工数据表查找匹配的员工ID foreach (DataRow dr in dt.Rows) { string empIdFromDb = dr["Employee_ID"].ToString()?.Trim() ?? ""; if (empIdFromDb.Equals(EmployeeNo, StringComparison.OrdinalIgnoreCase)) { txtEmpName.Text = dr["Employee_Name"].ToString(); isMatchFound = true; break; // 找到匹配项就跳出循环,不用继续遍历 } } // 只有遍历完所有数据都没找到匹配,且姓名框为空时才弹出提示 if (!isMatchFound && string.IsNullOrEmpty(txtEmpName.Text)) { // 用RowIndex作为脚本Key的一部分,避免多个行的脚本被覆盖 ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "NotFound_" + row.RowIndex, "alert('No Data Found...')", true); txtEmpName.Text = ""; // 清空姓名框,避免残留旧数据 } } }
关键改动说明
- 调整提示触发逻辑:用
isMatchFound变量标记是否找到匹配项,只有遍历完整个员工数据表都没找到时,才判断是否弹出提示,彻底解决了误弹的问题。 - 优化数据获取:把DataTable的获取移到foreach循环外,避免重复操作,同时增加了空判断,防止Application中无数据导致的异常。
- 增加控件空判断和字符串处理:用
?.空安全运算符避免空引用异常,用Trim()去除字符串前后空格,防止因为空格导致的匹配失败。 - 区分数据行和非数据行:跳过非数据行,避免无效处理和错误的EmployeeNo值。
- 优化脚本Key:给每个行的提示脚本加上唯一的Key(RowIndex),确保多个行触发时每个提示都能正确执行,不会被覆盖。
内容的提问来源于stack exchange,提问作者Nits Patel
相关产品推荐
相关产品推荐

