You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环内IF条件失效:TextBox值变更时无法正确匹配员工数据

解决TextBox值变更事件中IF条件失效的问题

嘿,我帮你排查了这段代码里的问题,难怪不管有没有匹配数据都会弹出"No Data Found..."的提示——核心问题出在你判断匹配的逻辑时机不对,还有一些小细节需要调整。

问题分析

  1. 错误的提示触发时机:你在DataTable的循环里,每遇到一行不匹配的员工数据就立刻触发错误提示,而不是等遍历完所有数据确认完全找不到匹配项再弹。这就导致哪怕后面有匹配的行,前面的循环已经弹出提示了,而且不管最终有没有找到,都会弹一次甚至多次提示。
  2. 冗余的DataTable初始化:你把DataTable dt = (DataTable)Application["Employee_details"];放在了GridView的foreach循环内部,每次遍历GridView行都重新取一次数据,虽然不影响功能,但没必要重复操作。
  3. 未处理非数据行:遍历GridViewRow时没有跳过非数据行(比如表头行),可能导致EmployeeNo为空,引发误判。
  4. 重复的控件查找:多次调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:18:18