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

DataGridView根据TextBox输入选中行功能添加else语句后失效的问题排查

问题分析与修复方案

这个问题的核心在于你把「未找到匹配行」的判断逻辑放错地方了!

你现在的代码在foreach循环里,只要第一行的序列号不匹配,就立刻触发else分支:弹出错误提示、清空输入框,还直接break跳出了循环。这就导致后面的行根本没机会被检查到——哪怕目标行在第二行或者更后面,程序也提前终止了,自然找不到匹配项。而没加else的时候,程序会老老实实遍历所有行,直到找到匹配的那一行,所以功能正常。

修复后的代码

private void transactionSerial_Box_TextChanged(object sender, EventArgs e) 
{ 
    string serialSearch = transactionSerial_Box.Text; 
    int rowIndex = -1; 

    if (transactionSerial_Box.Text.Length == 4) 
    { 
        // 先遍历所有行找匹配项
        foreach (DataGridViewRow row in toolDataGridView.Rows) 
        { 
            // 跳过DataGridView的新行(如果开启了添加新行功能)
            if (row.IsNewRow) continue;

            // 用空值运算符避免单元格值为null时的报错
            if (row.Cells[0].Value?.ToString().Equals(serialSearch) == true) 
            { 
                toolDataGridView.ClearSelection(); 
                rowIndex = row.Index; 
                toolDataGridView.Rows[rowIndex].Selected = true; 
                break; // 找到匹配项后再跳出循环
            }
            // 这里不要加else!否则第一行不匹配就直接走错误逻辑了
        } 

        // 遍历完所有行后,再判断是否找到匹配项
        if (rowIndex == -1)
        {
            MessageBox.Show($"Serial number '{serialSearch}' is not a valid serial number. Please try again.", "Invalid Serial Number", MessageBoxButtons.OK, MessageBoxIcon.Error); 
            transactionSerial_Box.Text = ""; 
            toolDataGridView.ClearSelection(); // 清空选中状态更合理
        }
    } 
}

额外优化建议

你代码里已经用到了tooldataSet.Tool.Rows.Find(serialSearch),其实可以先通过这个判断DataTable里是否存在该序列号,再去操作DataGridView,这样效率更高:

private void transactionSerial_Box_TextChanged(object sender, EventArgs e) 
{ 
    string serialSearch = transactionSerial_Box.Text; 
    int rowIndex = -1; 

    if (transactionSerial_Box.Text.Length == 4) 
    { 
        // 先检查DataTable里是否存在该序列号
        DataRow matchingRow = tooldataSet.Tool.Rows.Find(serialSearch);
        if (matchingRow != null)
        {
            // 找到对应的DataGridView行
            foreach (DataGridViewRow row in toolDataGridView.Rows) 
            { 
                if (row.IsNewRow) continue;
                if (row.Cells[0].Value?.ToString().Equals(serialSearch) == true) 
                { 
                    toolDataGridView.ClearSelection(); 
                    rowIndex = row.Index; 
                    toolDataGridView.Rows[rowIndex].Selected = true; 
                    break; 
                }
            }
        }
        else
        {
            // DataTable里都没有,直接提示错误
            MessageBox.Show($"Serial number '{serialSearch}' is not a valid serial number. Please try again.", "Invalid Serial Number", MessageBoxButtons.OK, MessageBoxIcon.Error); 
            transactionSerial_Box.Text = ""; 
            toolDataGridView.ClearSelection();
        }
    } 
}

关键注意点

  • 永远不要在遍历集合的循环内部,用else处理「整个集合无匹配」的逻辑:要等遍历完全部元素,确认没有匹配项后,再执行错误处理。
  • 记得跳过DataGridView的IsNewRow(如果开启了允许添加新行的功能),避免空值报错。
  • 使用?.空值运算符(C# 6+),防止单元格值为null时调用ToString()抛出空引用异常。

内容的提问来源于stack exchange,提问作者Joe Fisher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 23:49:10