如何在C#中使用多个事件处理程序text_changed?

时间:2015-12-10 08:35:23

标签: c#

我有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 + "%'";
        }
    }

4 个答案:

答案 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