如何使用Entity Framework实现连接表搜索?WinForm搜索结果显示布尔值的问题排查与修复
问题排查:WinForm搜索后DataGridView显示布尔值而非匹配数据
嘿,这个问题我一眼就瞅出症结了——你代码里把「判断是否匹配搜索文本」的布尔结果,直接当成要显示的字段值了,难怪DataGridView全是true/false!
问题根源
看你Join后创建的匿名对象,每个属性写的都是类似 accID = booking.accID.Contains(txtSearch.Text) 这种代码。Contains()方法返回的是布尔值(true表示字段包含搜索文本,false表示不包含),而不是booking.accID这个字段的实际内容。你相当于把“是否符合条件”的判断结果当成了要展示的数据,自然就全是布尔值了。
修复方案
咱们得调整逻辑,分两步走:
- 先过滤出符合搜索条件的记录:在Linq查询里加
Where子句,筛选出任意字段包含搜索文本的记录; - 选择实际的字段值:在匿名对象里返回真实的字段内容,而不是判断结果。
修复后的完整代码
private void txtSearch_TextChanged(object sender, EventArgs e) { this.dataGridView1.DataSource = null; this.dataGridView1.Rows.Clear(); string searchText = txtSearch.Text.Trim(); // 去掉首尾空格,避免无效搜索 // 搜索文本为空时返回所有数据,避免表格变空 if (string.IsNullOrEmpty(searchText)) { LoadAllData(); // 可以单独写个加载全量数据的方法,这里省略实现 return; } using (var context = new edeappEntities1()) { var data = context.bookingorders .Join( context.addressbooks, booking => booking.addrID, address => address.addrID, (booking, address) => new { // 这里返回实际的字段值,而非判断结果 accID = booking.accID, bookId = booking.bookingID, companyName = address.companyName, // 合并多段地址,展示更友好 address = $"{address.addressLn1} {address.addressLn2} {address.addressLn3}".Trim(), region = address.region, postcode = address.postcode, contact = address.contectName, // 注意:这里字段名疑似笔误,应该是contactName?建议检查模型 phone = address.phoneNo, fax = address.faxNo, telex = address.telexNo, // 合并日期和时间字段 pickupTime = $"{booking.pickupDate} {booking.pickupTime}".Trim() } ) // 这里筛选出符合搜索条件的记录 .Where(item => item.accID.Contains(searchText) || item.bookId.Contains(searchText) || item.companyName.Contains(searchText) || item.address.Contains(searchText) || item.region.Contains(searchText) || item.postcode.Contains(searchText) || item.contact.Contains(searchText) || item.phone.Contains(searchText) || item.fax.Contains(searchText) || item.telex.Contains(searchText) || item.pickupTime.Contains(searchText) ) .ToList(); // 直接绑定DataSource比手动Add行更高效 dataGridView1.DataSource = data; // 如果一定要手动Add行,保留原来的foreach也可以,不过绑定DataSource更简洁 // foreach (var db in data) // { // dataGridView1.Rows.Add(db.accID, db.bookId, db.companyName, db.address, db.region, db.postcode, db.contact, db.phone, db.fax, db.telex, db.pickupTime); // } } }
额外小提示
- 检查字段拼写:代码里的
address.contectName大概率是笔误,应该是contactName,建议核对你的模型字段; - 用
DataSource绑定数据比手动循环添加行更高效,还能自动匹配列名; - 可以给搜索加个延迟触发(比如用Timer),避免用户每输入一个字符就触发一次查询,提升性能。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

