首页 文章

通过C#文本框过滤DataGridView,每个单词作为过滤器

提问于
浏览
0

我想根据文本框的每个单词过滤网格视图 . 每当我连续添加一个单词时,过滤器必须搜索数据网格 . 但是在下面的代码中,它仅根据最后一个单词返回搜索结束 . 请注意我使用的是数据网格视图 .

任何建议

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;
        }

    }

2 回答

  • 0

    您每次迭代都要替换RowFilter,因此cource只显示最后一次 .

    尝试这样的事情:

    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);
    
  • 0

    RowFilter 返回最新应用的过滤器,这就是您获取最后一个应用过滤器的原因(文本框中的最后一个单词) . 使用 in condtion为 RowFilter 而不是 = . 在循环中创建 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);
    

相关问题