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

在c#Winform(实体框架)中搜索记录,c#,winforms,entity-framework,search,full-text-search,C#,Winforms,Entity Framework,Search,Full Text Search,我有一个带有文本框的c#winform,通过实体框架连接到一个名为候选表(它有700条记录)的表。 我正在使用名为candidatesBindingSource的BindingSource。一切都按我的要求进行 只有一件事。我正在尝试用姓氏搜索候选人。所以我有一个文本框,叫做textNames,还有一个带有这个代码的按钮 用于搜索我的记录: var searchResults = (from a in _context.Candidates where (a.Surname.Contains(t

我有一个带有文本框的c#winform,通过实体框架连接到一个名为候选表(它有700条记录)的表。 我正在使用名为
candidatesBindingSource
的BindingSource。一切都按我的要求进行

只有一件事。我正在尝试用姓氏搜索候选人。所以我有一个文本框,叫做textNames,还有一个带有这个代码的按钮 用于搜索我的记录:

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
实际上是作为recordcount工作的(在我的表中为700) 并且无法转到第2638号记录(而不是具有此Id的记录)。我说得对吗?那么,如何使用找到的Id实现GOTO记录呢? 我真的必须使用For循环和
MoveNext
命令来比较我搜索的Id和所有Id吗


任何提示都将不胜感激。

我认为您应该设置为candidatesBindingSource。项目的位置索引,而不是id。 这篇文章将帮助您正确地获取项目的索引,而无需再次读取整个数据。


您还可以尝试从绑定源获取索引。

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

candidatesBindingSource.DataSource = _context.Candidates.ToList();
然后,您不需要搜索数据库,您可以使用以下命令搜索数据源列表:

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;
var candidateList=(List)candidatesBindingSource.DataSource;
var searchText=textNames.Text;
var firstMatchIndex=candidateList.FindIndex(c=>c.lasname.Contains(searchText));
如果(firstMatchIndex>=0)
candidatesBindingSource.Position=firstMatchIndex;

如果根据上下文创建列表,它将具有与表单上设置的数据绑定相同的索引。要将表单设置为查看搜索结果,可以使用列表的FindIndex()方法中的a match,然后将.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;
}

您在
candidatesBindingSource.DataSource
中放了什么?这一行使我的Bindingsource:
candidatesBindingSource.DataSource=_context.Candidates.ToList()