如何根据Textbox传入的两列值匹配DataGridView行并显示第三列值到Textbox
WinForm DataGridView 双条件匹配选中行并取值实现方案
前提说明
你的控件按如下命名即可直接复用代码,可根据实际项目的控件名自行调整:
- 输入Name匹配值的文本框:
txt_Name - 输入City匹配值的文本框:
txt_City - 显示Age结果的文本框:
txt_Age - 目标DataGridView控件:
dgv_Data,已预设Name/City/Age三列及对应3行测试数据
实现逻辑
把匹配逻辑抽为独立方法,绑定到两个输入框的TextChanged事件即可实现输入实时匹配,也可以绑定到查询按钮的Click事件按需触发。匹配时先清空历史选中状态,逐行校验双条件,匹配成功后选中对应行、取出Age值赋值到结果框,支持自动滚动到选中行位置。
完整代码
// 窗体加载时绑定触发事件 private void Form1_Load(object sender, EventArgs e) { txt_Name.TextChanged += SearchMatchedRow; txt_City.TextChanged += SearchMatchedRow; } // 核心匹配方法 private void SearchMatchedRow(object sender, EventArgs e) { // 初始化状态:清空历史选中、清空结果框 dgv_Data.ClearSelection(); txt_Age.Clear(); // 获取输入条件,自动去除首尾空格 string inputName = txt_Name.Text.Trim(); string inputCity = txt_City.Text.Trim(); // 任意一个条件为空就终止匹配 if (string.IsNullOrWhiteSpace(inputName) || string.IsNullOrWhiteSpace(inputCity)) return; // 遍历所有数据行,跳过用户编辑新增的空白行 foreach (DataGridViewRow row in dgv_Data.Rows) { if (row.IsNewRow) continue; // 取当前行的字段值,处理null值避免运行报错 string nameVal = row.Cells["Name"].Value?.ToString().Trim() ?? ""; string cityVal = row.Cells["City"].Value?.ToString().Trim() ?? ""; // 双条件完全匹配 if (nameVal == inputName && cityVal == inputCity) { row.Selected = true; // 选中目标行 txt_Age.Text = row.Cells["Age"].Value?.ToString() ?? ""; // 赋值Age到结果框 dgv_Data.FirstDisplayedScrollingRowIndex = row.Index; // 自动滚动到选中行位置 break; // 假设Name+City为唯一键,匹配到即终止循环 } } }
大数据量优化写法
如果你的DataGridView绑定的是DataTable数据源,数据量超过100行时建议直接用数据源筛选,比遍历行性能更好:
// 替换核心方法里的遍历逻辑即可 DataTable sourceDt = (DataTable)dgv_Data.DataSource; // 转义单引号避免筛选表达式语法报错 string filterExpr = $"Name = '{inputName.Replace("'", "''")}' AND City = '{inputCity.Replace("'", "''")}'"; DataRow[] result = sourceDt.Select(filterExpr); if (result.Length > 0) { int targetIdx = sourceDt.Rows.IndexOf(result[0]); dgv_Data.Rows[targetIdx].Selected = true; txt_Age.Text = result[0]["Age"].ToString(); dgv_Data.FirstDisplayedScrollingRowIndex = targetIdx; }
注意事项
- 如果需要忽略大小写匹配,把对比的两边值都加上
.ToLower()即可 - 如果Name+City可能存在重复行,删掉代码里的
break,可自行扩展多行匹配的处理逻辑 - 如果DataGridView开启了多选,记得在匹配前加
dgv_Data.MultiSelect = false;保证只选中目标行
内容的提问来源于stack exchange,提问作者Vicky_Smaith
相关产品推荐
相关产品推荐

