你好我有一个数据表,我想用一个文本框过滤,不区分大小写。换句话说,当用户开始在文本框中键入内容时,我希望RowFilter
显示包含键入信息的任何行(无论如何都是这样)。
我的当前代码仅显示完全匹配,仅适用于单个列(“ID”)。我想要包括一些其他列,即“标题”,“用户名”,“公司”等。
有什么想法吗?
private void searchTextBox_TextChanged(object sender, EventArgs e)
{
if (searchTextBox.Text.Trim() != "")
{
gridToTable.DefaultView.RowFilter = "ID = " + searchTextBox.Text;
}
else
{
gridToTable.DefaultView.RowFilter = string.Empty;
}
}
答案 0 :(得分:2)
您可以在LIKE
中使用RowFilter
,并使用OR
汇总所有广告。
var rowFilter = string.Format(
"ID LIKE '%{0}%' OR TITLE LIKE '%{1}%' OR Company LIKE '%{2}%' OR UserName LIKE '%{3}%'"
, txtSearchID.Text
, txtSearchTitle.Text
, txtSearchCompany.Text
, txtSearchUserName.Text
);
gridToTable.DefaultView.RowFilter = rowFilter;
DataColumn.Expression Property
(DataView.RowFilter
的语法相同)
但说实话,我建议使用LINQ-to-DataSet
,因为它更强大。
例如:
DataTable tblFiltered = gridToTable.AsEnumerable()
.Where(r => r.Field<int>("ID").ToString().Contains(txtSearchID.Text)
|| r.Field<string>("TITLE").Contains(txtSearchTitle.Text)
|| r.Field<string>("Company").Contains(txtSearchCompany.Text)
|| r.Field<string>("UserName").Contains(txtSearchUserName.Text))
.CopyToDataTable();
答案 1 :(得分:-1)
网格提供了三种互补的数据过滤方法。 Row.Filtered-显示或隐藏数据的最简单方法。但是,它不支持偶数驱动的数据模型,因此它对更复杂的应用程序没有用。使用这种方法,程序员必须手动控制行可见性,并考虑数据可以进行排序或分组,并且可以具有复杂的层次结构。
IFilter接口 - 最有效,最方便的过滤方法。程序员必须继承IFilter接口并实现IsFiltered方法。此方法使用row作为参数,网格确定是否需要过滤。
列中的图形过滤器。此功能使程序员能够实现可用于交互式数据过滤的任何图形过滤器。放置在下拉框中的任何图形控件都可以用作过滤器。这种过滤器的实现基于熟悉的UITypeEditor,可以为任何用户控制提供更多细节,您可以访问dapfor。 COM