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

如何重构代码实现BindingList多属性检索,精简Windows Forms搜索逻辑

WinForm中BindingList多字段搜索代码精简方案

核心优化思路是将重复的字段匹配逻辑收拢,避免多次重复写属性取值、关键词匹配的代码,同时提前提取搜索关键词减少重复的控件取值操作:

  • 提前提取搜索关键词,避免重复调用partsSearchTextBox.Text属性
  • 将需要匹配的6个属性统一转为字符串存入临时集合,用LINQ的Any()方法替代冗长的或条件判断
  • 可选增加搜索前清空原有选中状态、关键词空值判断逻辑,更符合常规搜索交互

最小改动版本(仅优化if条件,保留原有for循环结构)

// 提前提取搜索关键词,加ToLower()可实现不区分大小写搜索,不需要可删除
string searchKey = partsSearchTextBox.Text.Trim().ToLower();
found = false;
// 搜索前清空之前的选中状态,不需要可删除
dgvParts.ClearSelection();

for (int i = 0; i < Inventory.AllParts.Count; i++)
{
    var currentPart = Inventory.AllParts[i];
    // 一行完成多字段匹配判断
    if (new[] { currentPart.PartID.ToString(), currentPart.Name, currentPart.Price.ToString(), currentPart.Instock.ToString(), currentPart.Min.ToString(), currentPart.Max.ToString() }.Any(field => field.ToLower().Contains(searchKey)))
    {
        dgvParts.Rows[i].Selected = true;
        found = true;
    }
}

更精简版本(用LINQ替代for循环,代码量更少)

string searchKey = partsSearchTextBox.Text.Trim().ToLower();
dgvParts.ClearSelection();

// 一次性拿到所有匹配项的索引
var matchedRows = Inventory.AllParts
    .Select((part, idx) => new { part, idx })
    .Where(item => new[] { item.part.PartID.ToString(), item.part.Name, item.part.Price.ToString(), item.part.Instock.ToString(), item.part.Min.ToString(), item.part.Max.ToString() }.Any(f => f.ToLower().Contains(searchKey)))
    .ToList();

// 批量选中匹配行、赋值found状态
matchedRows.ForEach(item => dgvParts.Rows[item.idx].Selected = true);
found = matchedRows.Any();

注意:如果你的DataGridView开启了自定义排序、分页功能,绑定的BindingList索引和DataGridView行索引可能不对应,建议直接通过dgvParts.DataSource获取绑定项匹配,避免索引错位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 20:36:02