0

您好,我有一个数据表,我想用一个不区分大小写的文本框进行过滤。换句话说,当用户开始在文本框中输入内容时,我希望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;

   }

}
4

2 回答 2

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();
于 2012-06-18T21:15:00.937 回答
-1

网格提供了三种互补的数据过滤方法。Row.Filtered - 显示或隐藏数据的最简单方法。但是,它不支持偶数驱动的数据模型,因此对于更复杂的应用程序没有用处。使用这种方法,程序员必须手动控制行的可见性,并考虑数据可以排序或分组,并且可以具有复杂的层次结构。

IFilter 接口 - 最高效便捷的过滤方式。程序员必须继承 IFilter 接口并实现 IsFiltered 方法。此方法使用行作为参数,网格确定是否需要过滤。

列中的图形过滤器。此功能使程序员能够实现任何可用于交互式数据过滤的图形过滤器。放置在下拉框中的任何图形控件都可以用作过滤器。此类过滤器的实现基于熟悉的 UITypeEditor,它可以为任何用户提供更多控制细节,您可以访问 dapfor。com

于 2012-11-05T08:27:43.927 回答