通过 C# 文本框过滤 DataGridView,每个单词作为过滤器
Filter DataGridView via C# textbox with each word as a filter
我想根据文本框的每个单词过滤网格视图。每次我连续添加一个单词时,过滤器都必须在数据网格中搜索。但在下面的代码中,它仅根据最后一个词结束返回搜索。请注意,我使用的是数据网格视图。
任何建议
private void textBox1_TextChanged(object sender, EventArgs e)
{
int count = textBox1.Text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Count();
label68.Text = count.ToString();
string[] nameParts = textBox1.Text.Split(' ');
int cnlp = 1;
while (cnlp <= count)
{
string loopcount = nameParts[(cnlp - 1)];
lbtest5.Text = loopcount.ToString();
var bd = (BindingSource)dgvShopDrawings.DataSource;
var dt = (DataTable)bd.DataSource;
dt.DefaultView.RowFilter = string.Format("DrawingID like '%{0}%' or title like '%{0}%' or level like '%{0}%'", lbtest5.Text.Replace("'", "''"));
dgvShopDrawings.Refresh();
ShopDrawingRecordCount = dt.Rows.Count;
SdDgvStatusCount.Text = String.Format("Records In {0} / {1} ", dgvShopDrawings.Rows.Count, ShopDrawingRecordCount);
cnlp = cnlp + 1;
}
}
RowFilter
returns 最近应用的过滤器,这就是为什么你得到最后应用的过滤器(文本框中的最后一个字)。对 RowFilter
使用 in
条件而不是 =
。在循环中创建 in
条件兼容字符串,并将其应用于循环外的数据表。
尝试相应地更改代码。我用 in
条件更改了发布的代码。可能是一些编译错误,因为我没有编译。
string RowFilter="";
int count = textBox1.Text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Count();
label68.Text = count.ToString();
string[] nameParts = textBox1.Text.Split(' ');
int cnlp = 0;
while (cnlp < nameParts.Count())
{
string loopcount =nameParts[cnlp];
RowFilter+="'" + loopcount + "',";
cnlp = cnlp + 1;
}
if (RowFilter != "")
RowFilter = RowFilter.Substring(0, RowFilter.Length - 1);
var bd = (BindingSource)dgvShopDrawings.DataSource;
var dt = (DataTable)bd.DataSource;
dt.DefaultView.RowFilter = string.Format("DrawingID in ({0}) or title in ({0}) or level in ({0})", RowFilter);
dgvShopDrawings.Refresh();
int ShopDrawingRecordCount = dt.Rows.Count;
SdDgvStatusCount.Text = String.Format("Records In {0} / {1} ", dgvShopDrawings.Rows.Count, ShopDrawingRecordCount);
您每次迭代都在替换 RowFilter,因此它当然只显示最后一个。
试试这样的方法:
int count = textBox1.Text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Count();
label68.Text = count.ToString();
string[] nameParts = textBox1.Text.Split(' ');
int cnlp = 1;
string rowfilter = "";
while (cnlp <= count)
{
string loopcount = nameParts[(cnlp - 1)];
lbtest5.Text = loopcount.ToString();
if (rowfilter.Length > 0) rowfilter += " AND ";
rowfilter += tring.Format("(DrawingID like '%{0}%' or title like '%{0}%' or level like '%{0}%')", lbtest5.Text.Replace("'", "''"));
cnlp = cnlp + 1;
}
var bd = (BindingSource)dgvShopDrawings.DataSource;
var dt = (DataTable)bd.DataSource;
dt.DefaultView.RowFilter = rowfilter;
dgvShopDrawings.Refresh();
ShopDrawingRecordCount = dt.Rows.Count;
SdDgvStatusCount.Text = String.Format("Records In {0} / {1} ", dgvShopDrawings.Rows.Count, ShopDrawingRecordCount);
我想根据文本框的每个单词过滤网格视图。每次我连续添加一个单词时,过滤器都必须在数据网格中搜索。但在下面的代码中,它仅根据最后一个词结束返回搜索。请注意,我使用的是数据网格视图。
任何建议
private void textBox1_TextChanged(object sender, EventArgs e) {
int count = textBox1.Text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Count();
label68.Text = count.ToString();
string[] nameParts = textBox1.Text.Split(' ');
int cnlp = 1;
while (cnlp <= count)
{
string loopcount = nameParts[(cnlp - 1)];
lbtest5.Text = loopcount.ToString();
var bd = (BindingSource)dgvShopDrawings.DataSource;
var dt = (DataTable)bd.DataSource;
dt.DefaultView.RowFilter = string.Format("DrawingID like '%{0}%' or title like '%{0}%' or level like '%{0}%'", lbtest5.Text.Replace("'", "''"));
dgvShopDrawings.Refresh();
ShopDrawingRecordCount = dt.Rows.Count;
SdDgvStatusCount.Text = String.Format("Records In {0} / {1} ", dgvShopDrawings.Rows.Count, ShopDrawingRecordCount);
cnlp = cnlp + 1;
}
}
RowFilter
returns 最近应用的过滤器,这就是为什么你得到最后应用的过滤器(文本框中的最后一个字)。对 RowFilter
使用 in
条件而不是 =
。在循环中创建 in
条件兼容字符串,并将其应用于循环外的数据表。
尝试相应地更改代码。我用 in
条件更改了发布的代码。可能是一些编译错误,因为我没有编译。
string RowFilter="";
int count = textBox1.Text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Count();
label68.Text = count.ToString();
string[] nameParts = textBox1.Text.Split(' ');
int cnlp = 0;
while (cnlp < nameParts.Count())
{
string loopcount =nameParts[cnlp];
RowFilter+="'" + loopcount + "',";
cnlp = cnlp + 1;
}
if (RowFilter != "")
RowFilter = RowFilter.Substring(0, RowFilter.Length - 1);
var bd = (BindingSource)dgvShopDrawings.DataSource;
var dt = (DataTable)bd.DataSource;
dt.DefaultView.RowFilter = string.Format("DrawingID in ({0}) or title in ({0}) or level in ({0})", RowFilter);
dgvShopDrawings.Refresh();
int ShopDrawingRecordCount = dt.Rows.Count;
SdDgvStatusCount.Text = String.Format("Records In {0} / {1} ", dgvShopDrawings.Rows.Count, ShopDrawingRecordCount);
您每次迭代都在替换 RowFilter,因此它当然只显示最后一个。
试试这样的方法:
int count = textBox1.Text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Count();
label68.Text = count.ToString();
string[] nameParts = textBox1.Text.Split(' ');
int cnlp = 1;
string rowfilter = "";
while (cnlp <= count)
{
string loopcount = nameParts[(cnlp - 1)];
lbtest5.Text = loopcount.ToString();
if (rowfilter.Length > 0) rowfilter += " AND ";
rowfilter += tring.Format("(DrawingID like '%{0}%' or title like '%{0}%' or level like '%{0}%')", lbtest5.Text.Replace("'", "''"));
cnlp = cnlp + 1;
}
var bd = (BindingSource)dgvShopDrawings.DataSource;
var dt = (DataTable)bd.DataSource;
dt.DefaultView.RowFilter = rowfilter;
dgvShopDrawings.Refresh();
ShopDrawingRecordCount = dt.Rows.Count;
SdDgvStatusCount.Text = String.Format("Records In {0} / {1} ", dgvShopDrawings.Rows.Count, ShopDrawingRecordCount);