C# 使用dataview筛选具有多个关键字的datagridview
我正在使用datagridview绑定到datatable来显示我的记录,我有这样的记录(只是示例)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] 我
名称国家城市
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%”),它就不起作用了。我会得到错误的结果