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

时间:2015-11-13 09:22:07

标签: c# winforms entity-framework search full-text-search

我有一个带有文本框的c#winform,通过Entity Framework连接到一个名为Candidates的表(它有700条记录)。 我正在使用名为candidatesBindingSource的BindingSource。一切都按我的意愿运作。

只有一件事。我正在尝试用姓氏来实现搜索候选人。所以我有一个文本框,名为textSurname和一个带有此代码的按钮 搜索我的记录:

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重新定位到。{1}} 记录我的searchResults的ID?例如,如果我的Id = 2638,则上面的代码会重新定位candidatesBindingSource 到最后一个记录。我怀疑这部分candidatesBindingSource.Position实际上是作为记录计数(在我的表中700) 并且无法进入记录nr。 2638(不是带有此Id的记录)。我对吗?那么如何用我找到的ID实现GOTO记录呢? 我是否真的必须使用带有MoveNext命令的For循环来将我搜索到的Id与所有Id进行比较?

任何提示都会非常感激。

3 个答案:

答案 0 :(得分:2)

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

candidatesBindingSource.DataSource = _context.Candidates.ToList();

然后您不需要搜索数据库,您可以使用List.FindIndex method搜索数据源列表,如下所示:

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;

答案 1 :(得分:1)

我认为你应该设置itemsBindingSource.Position索引的项而不是id。 该帖子将帮助您正确获取项目索引,无需再次读取整个数据。 Get Row Index in a list by using entity framework

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

答案 2 :(得分:0)

如果您在上下文之外创建列表,则其索引将与您在表单上设置的数据绑定相同。若要将表单设置为查看搜索结果,可以使用列表的FindIndex()方法中的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;
}