如何使用多个不同的文本框在datagridview中进行多搜索

时间:2018-02-09 10:56:32

标签: c# excel winforms datagridview

我做的很小,会做以下

  1. 将Excel文件加载到datagridview
  2. 使用多个datagridview示例过滤textbox内的数据 如图所示,Textbox_TextChanged事件上的National_ID和中间名以及姓氏。
  3. 我的问题是在文本TB_National_ID中输入数据时进行过滤 它会过滤数据,但是当我想根据两个文本框过滤数据时 TB_National_IDTB_FName或更多结果不正确如何解决此问题 所以我可以基于一个或两个或三个或更多textboxs

    进行过滤
            private void TB_National_ID_TextChanged(object sender, EventArgs e)
        {
            BindingSource bs = new BindingSource();
            bs.DataSource = dataGridView1.DataSource;
            bs.Filter = string.Format("convert(ID,'System.String') LIKE '%{0}%' ", TB_National_ID.Text);
            dataGridView1.DataSource = bs;
            //Re-calculate record counts
            Rec_Count.Text = dataGridView1.Rows.Count.ToString();
        }
    
        private void TB_FName_TextChanged(object sender, EventArgs e)
        {
            BindingSource bs = new BindingSource();
            bs.DataSource = dataGridView1.DataSource;
            bs.Filter = "Name LIKE '%" + TB_FName.Text + "%'";
            dataGridView1.DataSource = bs;
            //Re-calculate record counts
            Rec_Count.Text = dataGridView1.Rows.Count.ToString();
        }
    

    更新

    我出来的解决方案如下所示,但如果有更快的方式,因为我正在过滤10,000

    我在每个TextChanged事件

    上调用此方法
        public void DataFilter()
        {
            BindingSource bs = new BindingSource();
            bs.DataSource = dataGridView1.DataSource;
            bs.Filter = string.Format("convert(ID,'System.String') LIKE '%{0}%' and Name LIKE '%{1}%' ", TB_National_ID.Text, TB_Full_Name.Text);
            dataGridView1.DataSource = bs;
            //Re-calculate record counts
            Rec_Count.Text = dataGridView1.Rows.Count.ToString();
        }
    

1 个答案:

答案 0 :(得分:0)

如果没有看到您的错误在代码中的位置,那么推测就是所有人都可以提供的。我建议您寻找的一点是在设置过滤器后重新设置DataSource。示例:在已发布代码的最后一个片段中:DataFilter方法...重新创建新的BindingSource是不必要的。将BindingSource设为全局变量,只需设置ITS过滤器即可。第二个问题是,在您为BindingSource设置过滤器之后,代码会将DatagridViews DataSource重新分配给BindingSource ...,因为这是不必要的。

制作全局DataTable,将其填入Excel数据,然后将其用作DataSource BindingSource。然后,您可以将此BindingSource用作DataSource DataGridView。注意:您只需要执行此操作。设置网格数据源后,对BindingSource应用“过滤器”会自动更新DataGridView以反映此过滤器。无需重新分配网格DataSourceDataFilter方法应该是一行代码:bs.Filter = Your filter string….

下面是我上面描述的一个例子。我用超过13,000多行数据运行它并没有显得太迟钝。显然,对于更多数据,滤波器延迟可能是不可接受的。代码以winform开头,其中包含用于存储excel文件的DataGridView和用于根据用户在文本框中键入的内容过滤TextBoxes的两个DataGridView。< / p>

有四(4)个全局变量:

string DefaultDirectory,用于存储Excel文件的路径。

string[] ExcelFilePaths,其中包含DefaultDirectory中所有Excel文件的字符串路径。

DataTable BindingSourceDataTableDataTable包含堆叠在一起的所有组合工作表,每个工作表之间有一个空行。

最后是BindingSource GridBindingSource,其DataSource是之前的DataTable。它用作DataSource的{​​{1}},也可用作过滤数据的目标。

方法: DataGridView ...获取Excel工作簿的字符串路径,并返回ImportExcel(string FilePath),其中包含名为“Sheet1”的工作表中的数据(如果找到)。否则,它返回null,表示找不到名为“Sheet1”的工作表。

DataTable返回一个GetDataFromExcel(),其中包含DataTable中所有工作簿中名为“Sheet1”的所有工作表中的数据。此方法使用DefaultDirectory属性合并单个工作表DataTable.MergeDataTables)以形成最终的大tempTable DataTable。我假设工作表都有相同的列模式;否则,纸张可能无法按预期堆叠。如果列模式相同,则表单应该叠加在另一个之上。

最后,mergedTables从两个文本框中返回一个过滤字符串。每次文本在其中一个文本框中更改时,都会调用此方法。此过滤器字符串将在用户键入时过滤数据。要清除任何过滤器,用户只需清除文本框即可。

显然,您需要调整过滤字符串以匹配数据表中的列名等。

希望这有帮助。

GetFilterStringFromTextBoxes()