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
相关产品推荐
相关产品推荐

