如何重构代码实现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
相关产品推荐
相关产品推荐

