我做的很小,会做以下
datagridview
datagridview
示例过滤textbox
内的数据
如图所示,Textbox_TextChanged
事件上的National_ID和中间名以及姓氏。 我的问题是在文本TB_National_ID
中输入数据时进行过滤
它会过滤数据,但是当我想根据两个文本框过滤数据时
TB_National_ID
和TB_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();
}
答案 0 :(得分:0)
如果没有看到您的错误在代码中的位置,那么推测就是所有人都可以提供的。我建议您寻找的一点是在设置过滤器后重新设置DataSource
。示例:在已发布代码的最后一个片段中:DataFilter
方法...重新创建新的BindingSource
是不必要的。将BindingSource
设为全局变量,只需设置ITS过滤器即可。第二个问题是,在您为BindingSource
设置过滤器之后,代码会将DatagridViews
DataSource
重新分配给BindingSource
...,因为这是不必要的。
制作全局DataTable
,将其填入Excel数据,然后将其用作DataSource
BindingSource
。然后,您可以将此BindingSource
用作DataSource
DataGridView
。注意:您只需要执行此操作。设置网格数据源后,对BindingSource
应用“过滤器”会自动更新DataGridView
以反映此过滤器。无需重新分配网格DataSource
。 DataFilter
方法应该是一行代码:bs.Filter = Your filter string….
下面是我上面描述的一个例子。我用超过13,000多行数据运行它并没有显得太迟钝。显然,对于更多数据,滤波器延迟可能是不可接受的。代码以winform开头,其中包含用于存储excel文件的DataGridView
和用于根据用户在文本框中键入的内容过滤TextBoxes
的两个DataGridView
。< / p>
有四(4)个全局变量:
string
DefaultDirectory
,用于存储Excel文件的路径。
string[]
ExcelFilePaths
,其中包含DefaultDirectory
中所有Excel文件的字符串路径。
DataTable
BindingSourceDataTable
此DataTable
包含堆叠在一起的所有组合工作表,每个工作表之间有一个空行。
最后是BindingSource
GridBindingSource
,其DataSource
是之前的DataTable
。它用作DataSource
的{{1}},也可用作过滤数据的目标。
方法:
DataGridView
...获取Excel工作簿的字符串路径,并返回ImportExcel(string FilePath)
,其中包含名为“Sheet1”的工作表中的数据(如果找到)。否则,它返回null,表示找不到名为“Sheet1”的工作表。
DataTable
返回一个GetDataFromExcel()
,其中包含DataTable
中所有工作簿中名为“Sheet1”的所有工作表中的数据。此方法使用DefaultDirectory
属性合并单个工作表DataTable.Merge
(DataTables
)以形成最终的大tempTable
DataTable
。我假设工作表都有相同的列模式;否则,纸张可能无法按预期堆叠。如果列模式相同,则表单应该叠加在另一个之上。
最后,mergedTables
从两个文本框中返回一个过滤字符串。每次文本在其中一个文本框中更改时,都会调用此方法。此过滤器字符串将在用户键入时过滤数据。要清除任何过滤器,用户只需清除文本框即可。
显然,您需要调整过滤字符串以匹配数据表中的列名等。
希望这有帮助。
GetFilterStringFromTextBoxes()