在 c# Winform 中搜索记录 (Entity Framework)
Searching for record in c# Winform (Entity Framework)
我有一个带有文本框的 c# winform,通过 Entity Framework 连接到一个名为 Candidates 的 table(它有 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
重新定位到
使用我的搜索结果中的 ID 进行记录?例如,如果我有一个 Id = 2638,上面的代码会重新定位我的 candidatesBindingSource
到最后一条记录。我怀疑这部分 candidatesBindingSource.Position
实际上用作记录计数(在我的 table 中为 700)
并且无法进入记录 nr。 2638(不是用这个 Id 记录的)。我对吗?那么如何使用找到的 ID 实现 GOTO 记录呢?
我真的必须使用带有 MoveNext
命令的 For 循环来将我搜索到的 ID 与所有 ID 进行比较吗?
如有任何提示,我们将不胜感激。
我认为您应该设置 candidatesBindingSource.Position 项目索引而不是 id。
post 将帮助您正确获取项目索引,而无需再次读取整个数据。
Get Row Index in a list by using entity framework
您也可以尝试从绑定源获取索引。
好的,这就是您初始化绑定源的方式
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;
如果您在上下文之外创建列表,它将具有与您在表单上设置的数据绑定相同的索引。要将表单设置为查看搜索结果,您可以使用列表的 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;
}
我有一个带有文本框的 c# winform,通过 Entity Framework 连接到一个名为 Candidates 的 table(它有 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
重新定位到
使用我的搜索结果中的 ID 进行记录?例如,如果我有一个 Id = 2638,上面的代码会重新定位我的 candidatesBindingSource
到最后一条记录。我怀疑这部分 candidatesBindingSource.Position
实际上用作记录计数(在我的 table 中为 700)
并且无法进入记录 nr。 2638(不是用这个 Id 记录的)。我对吗?那么如何使用找到的 ID 实现 GOTO 记录呢?
我真的必须使用带有 MoveNext
命令的 For 循环来将我搜索到的 ID 与所有 ID 进行比较吗?
如有任何提示,我们将不胜感激。
我认为您应该设置 candidatesBindingSource.Position 项目索引而不是 id。 post 将帮助您正确获取项目索引,而无需再次读取整个数据。 Get Row Index in a list by using entity framework
您也可以尝试从绑定源获取索引。
好的,这就是您初始化绑定源的方式
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;
如果您在上下文之外创建列表,它将具有与您在表单上设置的数据绑定相同的索引。要将表单设置为查看搜索结果,您可以使用列表的 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;
}