在c#Winform(实体框架)中搜索记录
本文关键字:搜索 记录 框架 c#Winform 实体 | 更新日期: 2023-09-27 18:21:55
我有一个带有文本框的c#winform,通过实体框架连接到一个名为Candidate的表(它有700条记录)。我正在使用名为candidatesBindingSource
的BindingSource。一切都如我所愿。
只有一件事。我正在尝试实现用姓氏搜索候选人。所以我有一个名为textSurname的Textbox和一个包含以下代码的Button用于搜索我的记录:
var searchResults = (from a in _context.Candidates where (a.Surname.Contains(textSurname.Text)) select a.Id).ToList();
if (searchResults.Count > 0)
{
// Id of a record in searchResults is correct
var position = searchResults[0];
// This line moves focus to a wrong record
candidatesBindingSource.Position = position; //
}
如果找到一张唱片,我可以得到它的Id。这里我有个问题。如何将candidatesBindingSource
重新定位到用我的搜索结果中的Id记录?例如,如果我的Id为2638,则上面的代码会重新定位我的candidatesBindingSource
到最后一张唱片。我怀疑这部分candidatesBindingSource.Position
实际上是作为记录计数(我的表中为700)工作的并且不能转到记录编号2638(不转到具有该Id的记录)。我说得对吗?那么,我如何用找到的Id实现GOTO记录呢?我真的必须使用带有MoveNext
命令的For循环来将我搜索的Id与所有Id进行比较吗?
任何提示都将不胜感激。
好的,这就是初始化绑定源的方法
candidatesBindingSource.DataSource = _context.Candidates.ToList();
然后你不需要搜索数据库,你可以使用list.FindIndex方法搜索数据源列表,如下所示:
var candidateList = (List<Candidate>)candidatesBindingSource.DataSource;
var searchText = textSurname.Text;
var firstMatchIndex = candidateList.FindIndex(c => c.Surname.Contains(searchText));
if (firstMatchIndex >= 0)
candidatesBindingSource.Position = firstMatchIndex;
我认为您应该设置为candidatesBindingSource.Position index of item而不是id。这篇文章将帮助您正确地获取项目的索引,而不必重新读取整个数据。使用实体框架获取列表中的行索引
您也可以尝试从绑定源获取索引。
如果你在上下文之外创建一个列表,它将具有与你在表单上设置的数据绑定相同的索引。要将表单设置为查看搜索结果,你可以使用列表的FindIndex()方法中的匹配,然后将.Position设置为该索引。
using (Candidates _context = new Candidates())
{
var candidateList = _context.Candidate.ToList();
var firstCandidateMatchIndex = candidateList.FindIndex(c =>
c.Surname.Contains(textSurname.Text));
if (firstCandidateMatchIndex >= 0)
candidateBindingSource.Position = firstCandidateMatchIndex;
}