我有3个文本框:tbName,tbMiddleName和tbSurname。在他们下面我有网格,它返回SqlServer基地的所有人。我在谷歌搜索如何通过名称过滤这些人,并看到事件处理程序text_changed做的事情。当我在tbName中键入一些名称时,它可以工作!我在基地有130个名字,当我输入“Mike”时,例如网格显示我所有名叫Mike-12的人。但问题是当我在tbMiddleName中键入“John”时它取消了第一个过滤器并且返回给我所有人哪个中间名是“John”,但我只想要名字是“Mike”的人,中间名是“John”(它应该只返回一个人)。与tbSurname相同。
这是我的代码:
private void tbName_TextChanged(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(tbName.Text))
{
bsAllPeople.Filter = null;
}
else
{
bsAllPeople.Filter = "Name LIKE '%" + tbName.Text + "%'";
}
}
private void tbMiddleName_TextChanged(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(tbSifraTransakcije.Text))
{
bsAllPeople.Filter = null;
}
else
{
bsAllPeople.Filter = "MiddleName LIKE '%" + tbMiddleName.Text + "%'";
}
}
private void tbSurname_TextChanged(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(tbSurname.Text))
{
bsAllPeople.Filter = null;
}
else
{
bsAllPeople.Filter = "Surname LIKE '%" + tbSurname.Text + "%'";
}
}
答案 0 :(得分:2)
只需制作另一种处理过滤器的方法。
public void Refilter()
{
bsAllPeople.Filter = $"Name LIKE '%{tbName.Text}%' AND MiddleName LIKE '%{tbMiddleName.Text}%' AND Surname LIKE '%{tbSurname.Text}%'";
}
并像这样使用
private void tbName_TextChanged(object sender, EventArgs e)
{
Refilter();
}
注意:请搜索有关参数化SQL查询,SQL注入的信息。
答案 1 :(得分:1)
您的问题不是关于几个文本更改处理程序,而是关于创建过滤器。
我认为在您的特定情况下,您可以为所有三个文本框使用一个共享文本链接事件处理程序。
在此事件处理程序中,您必须创建一个类似
的过滤器"Name LIKE '%" + tbName.Text + "%' AND MiddleName LIKE '%" + tbMiddleName.Text + "%'"
答案 2 :(得分:0)
试试这个:
`private void tbName_TextChanged(object sender, EventArgs e)
{
bsAllPeople.Filter = "Name LIKE '%" + tbName.Text + "%' and MiddleName LIKE
'%" + tbMiddleName.Text + "%' and Surname LIKE '%" + tbSurname.Text + "%'";
}`
在所有文本框更改事件上调用此事件。
答案 3 :(得分:0)
您的代码存在的问题是您覆盖Filter
的{{1}}属性,而不检查是否存在其他过滤器。
更好的做法是使用一个方法从所有TextBox中构建一个过滤器语句。只要任何TextBox更改,就会调用该方法。
你可以做这样的事情,我承认这有点难看,但只要你只有三个TextBox仍然可以。如果您有更多或更大的数字,您应该选择一个聪明的例程构建过滤器并考虑bsAllPeople
类,但这是另一个主题。
StringBuilder