C# 使用dataview筛选具有多个关键字的datagridview

C# 使用dataview筛选具有多个关键字的datagridview,c#,datagridview,datatable,C#,Datagridview,Datatable,我正在使用datagridview绑定到datatable来显示我的记录,我有这样的记录(只是示例) 名称国家城市 JAck Country1 City1 Name2 Country1 City2 JACK Country2 City1 我有用于搜索的文本框我不想使用此文本框在此datagridview中搜索多个关键字 例如,我不想获得Country1的所有记录,也不想有jack的名字 我在文本框中放置了一个字符串,如下所示 [JACK country1] 我

我正在使用datagridview绑定到datatable来显示我的记录,我有这样的记录(只是示例)
名称国家城市

JAck     Country1   City1
Name2    Country1   City2
JACK     Country2   City1
我有用于搜索的文本框我不想使用此文本框在此datagridview中搜索多个关键字 例如,我不想获得Country1的所有记录,也不想有jack的名字 我在文本框中放置了一个字符串,如下所示
[JACK country1]
我创建此方法是为了基于任何列创建动态行过滤器查询

 string query = "";
        Boolean firsttime = true;
        bool firstkeyword = true;
        foreach (string se in txt_ar_recherche.Text.Trim().Split(' '))
        {
            string search = (Convert.ToString(" like '%") + se) + "%'";
            if(!firstkeyword) query += " and ";

            query += "(";
            bool firstcolumn = true;

            foreach (DataGridViewColumn col in grid.Columns)
            {
                if (col.Visible)
                {
                    if (firsttime)
                    {
                        query += "Convert(" + col.Name + ",'System.String')" + search;
                        firsttime = false;
                    }
                    else
                    {
                        query += " or " + "Convert(" + col.Name + ",'System.String')" + search;
                    }
                }
                firstcolumn = false;
            }
            firstkeyword = false;
            query += ")";

        }
        (grid.DataSource as DataTable).DefaultView.RowFilter = query;
但它不起作用,我不知道如何解决这个问题,在datagridview中使用多个关键字进行搜索 我不想创建datatable javascript使用的相同文本框搜索,这是一个演示

尝试以下完整示例:

using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        DataGridView dataGridView;
        DataTable dataTable;
        DataView dataView;
        TextBox textBoxSearch;

        public Form1()
        {
            //InitializeComponent();

            Width = 800;
            dataGridView = new DataGridView { Parent = this, Dock = DockStyle.Top };
            textBoxSearch = new TextBox { Parent = this, Top = 200 };
            textBoxSearch.TextChanged += TextBoxSearch_TextChanged;

            dataTable = new DataTable();

            dataTable.Columns.Add("Name");
            dataTable.Columns.Add("Country");
            dataTable.Columns.Add("City");

            dataTable.Rows.Add("JAck", "Country1", "City1");
            dataTable.Rows.Add("Name2", "Country1", "City2");
            dataTable.Rows.Add("JACK", "Country2", "City1");

            dataView = new DataView(dataTable);
            dataGridView.DataSource = dataView;
        }

        private void TextBoxSearch_TextChanged(object sender, EventArgs e)
        {
            var words = textBoxSearch.Text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

            if (!words.Any())
            {
                dataGridView.DataSource = dataView;
                return;
            }

            var dv = dataView;

            foreach (var word in words)
            {
                var values = dataTable.Columns
                    .OfType<DataColumn>()
                    .Select(c => "Convert([" + c.ColumnName + "], System.String)")
                    .Select(c => c + " like '%" + word + "%'");

                var filter = string.Join(" or ", values);
                dv = new DataView(dv.ToTable());
                dv.RowFilter = filter;
                dataGridView.DataSource = dv;
            }
        }
    }
}
使用系统;
使用系统数据;
使用System.Linq;
使用System.Windows.Forms;
命名空间WindowsFormsApp1
{
公共部分类Form1:Form
{
DataGridView DataGridView;
数据表数据表;
数据视图数据视图;
文本框文本框搜索;
公共表格1()
{
//初始化组件();
宽度=800;
dataGridView=newDataGridView{Parent=this,Dock=DockStyle.Top};
textBoxSearch=newtextbox{Parent=this,Top=200};
textBoxSearch.TextChanged+=textBoxSearch\u TextChanged;
dataTable=新的dataTable();
dataTable.Columns.Add(“名称”);
dataTable.Columns.Add(“国家”);
dataTable.Columns.Add(“城市”);
添加(“杰克”、“国家1”、“城市1”);
添加(“名称2”、“国家1”、“城市2”);
添加(“杰克”、“国家2”、“城市1”);
dataView=新的dataView(dataTable);
dataGridView.DataSource=dataView;
}
私有void TextBoxSearch\u TextChanged(对象发送者,事件参数e)
{
var words=textBoxSearch.Text.Split(新字符[]{''},StringSplitOptions.RemoveEmptyEntries);
如果(!words.Any())
{
dataGridView.DataSource=dataView;
返回;
}
var dv=数据视图;
foreach(单词中的var单词)
{
var值=dataTable.Columns
第()类
.选择(c=>“转换([“+c.ColumnName+”],System.String)”)
。选择(c=>c+“类似“%”+word+“%”);
var filter=string.Join(“或”,值);
dv=新数据视图(dv.ToTable());
dv.RowFilter=过滤器;
dataGridView.DataSource=dv;
}
}
}
}

生成的查询是什么样子的?还有什么不起作用?应用程序崩溃?对某些列或其他内容进行错误筛选?进行了一些测试,如果您查看您的查询。。你会发现一个不相关的“或”,可能会引起问题,但如果没有或查询像这样的loke(名称像“%JACK%”或国家像“%JACK%”或城市像“%JACK%”)和(名称像“%country1%”或国家像“%country1%”或城市像“%country1%”),它就不起作用了。我会得到错误的结果