我有来自文本框输入的rowfilter,这是它的样子
var dt = (DataTable)dataGridView1.DataSource;
try
{
dt.DefaultView.RowFilter = string.Format("KATBR like '%{0}%'", filterKatbr.Text.Trim().Replace("'", "''")) + "AND " + string.Format("NAZIV like '%{0}%'", filterNaziv.Text.Trim().Replace("'", "''"));
dataGridView1.Refresh();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
它同时支持2个文本框并从2个文本框中过滤,但现在让我们专注于一个文本框。我想要实现的是,如果我输入类似于此Computer%Land
的文本框,它需要过滤掉所有必须有Computer
然后任何字符之间的所有字符,然后必须有Land
。
anything between
使用什么字符无关紧要。我使用%
但它可以是任何东西。
所以,如果我有这样的表:
|Computer432Land |
|Computer321 Land |
|Land 213 Computer |
|Computer asd13 Land|
结果将是第一,第二和第四列。
答案 0 :(得分:0)
不要将您的过滤器视为单个语句,而是要将两个语句连接起来。也就是说,您需要以下所有内容:
像这样:
dt.DefaultView.RowFilter = "ColumnName like 'Computer%' AND ColumnName like '%Land'";
如下图所示,使用您的示例数据 ++ ,我们可以看到预期结果。
DataTable dt = new DataTable();
dt.Columns.Add("ColumnName", typeof(string));
dt.Rows.Add("Computer432Land");
dt.Rows.Add("Computer31 Land");
dt.Rows.Add("Land 213 Computer");
dt.Rows.Add("Computer asd13 Land");
dt.Rows.Add("Computer asd13");
dt.Rows.Add("asd13 Land");
dataGridView1.DataSource = dt;
答案 1 :(得分:0)
哦,因为分裂字符串很吸引人,但这就是我如何制作它(它只能用一个'%')
string filterNazivStr = filterNaziv.Text;
if(filterNazivStr.ToLower().Contains('%'))
{
int i= 0;
string first = "";
string second = "";
Char separator = '%';
String[] substrings = filterNazivStr.Split(separator);
foreach (var substring in substrings)
{
switch (i)
{
case 0:
first = substring;
break;
case 1:
second = substring;
break;
default:
break;
}
i++;
}
dt.DefaultView.RowFilter = string.Format("NAZIV like '%{0}%'", first) + " AND " + string.Format("NAZIV like '%{0}%'", second);
}