C# 如何使用C中更改的多个事件处理程序文本?

C# 如何使用C中更改的多个事件处理程序文本?,c#,C#,我有3个文本框:tbName、tbMiddleName和tbnamese。在它们下面,我有一个返回SqlServer数据库中所有人员的网格。我在谷歌上搜索了如何按姓名过滤这些人,并看到事件处理程序text_改变了做这件事。当我在tbName中键入某个名称时,它会工作!我有130个名字在基地,当我键入“迈克”,例如网格显示我所有的人的名字是迈克-12。但问题是,当我在tbMiddleName中键入“John”时,它取消了第一个过滤器,并返回所有中间名为“John”的人,但我只想要中间名为“Mike

我有3个文本框:tbName、tbMiddleName和tbnamese。在它们下面,我有一个返回SqlServer数据库中所有人员的网格。我在谷歌上搜索了如何按姓名过滤这些人,并看到事件处理程序text_改变了做这件事。当我在tbName中键入某个名称时,它会工作!我有130个名字在基地,当我键入“迈克”,例如网格显示我所有的人的名字是迈克-12。但问题是,当我在tbMiddleName中键入“John”时,它取消了第一个过滤器,并返回所有中间名为“John”的人,但我只想要中间名为“Mike”的人,中间名为“John”(应该只返回一个人)。我的姓氏也是这样

这是我的密码:

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

您的问题不在于几个文本更改处理程序,而在于创建过滤器

我认为在您的特定情况下,您可以对所有三个文本框使用一个共享文本更改事件处理程序

在这个事件处理程序中,您必须创建一个类似

"Name LIKE '%" + tbName.Text + "%' AND MiddleName LIKE '%" + tbMiddleName.Text + "%'"

只需使用另一种方法来处理过滤器

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注入的信息。

尝试以下操作:

`private void tbName_TextChanged(object sender, EventArgs e)
 {
  bsAllPeople.Filter = "Name LIKE '%" + tbName.Text + "%' and MiddleName LIKE 
  '%" + tbMiddleName.Text + "%' and Surname LIKE '%" + tbSurname.Text + "%'";
 }`

在所有文本框更改事件上调用此事件。

代码的问题是您覆盖了
bsAllPeople
Filter
属性,而没有检查是否存在任何其他筛选器

更好的做法是使用一种方法,从所有文本框中构建一条筛选语句。每当任何文本框发生更改时,都可以调用该方法

你可以这样做,我承认这有点难看,但只要你只有三个文本框就行了。如果你有更大或更大的数字,你应该选择一个聪明的常规构建过滤器,考虑<代码> StringBuilder <代码>类,但是这是另一个主题。
var filter = string.Empty;

if (String.IsNullOrEmpty(tbName.Text))
{
    filter += "Name LIKE '%" + tbName.Text + "%'";
}

if (String.IsNullOrEmpty(tbSifraTransakcije.Text))
{
    if (!String.IsNullOrEmpty(filter))
    {
        filter += " AND ";
    }

    filter += "MiddleName LIKE '%" + tbMiddleName.Text + "%'";
}

if (String.IsNullOrEmpty(tbSurname.Text))
{
     if (!String.IsNullOrEmpty(filter))
    {
        filter += " AND ";
    }

    filter += "Surname LIKE '%" + tbSurname.Text + "%'";

}

bsAllPeople.Filter = filter;

只需扩展您的过滤器:“Name LIKE[…]和MiddleName LIKE[…]以及姓氏LIKE[…]”-您可能需要检查名称是否已实际填写,但这应该可以做到。您必须对所有三个参数使用通用表达式。但是你不应该在这种情况下使用sql查询,因为sql注入是不可能的。很容易!杰米,我明白你的意思,但最好像克里斯那样输入代码。干杯,伙计们!;-)Tnx给你们所有的人,这么快的回答!:)