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

如何根据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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:57:14