我有一个带有文本框的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进行比较?
任何提示都会非常感激。
答案 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;
}