在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进行比较吗?

任何提示都将不胜感激。

在c#Winform(实体框架)中搜索记录

好的,这就是初始化绑定源的方法

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;
}