数据表过滤(多列)

时间:2012-06-18 21:08:53

标签: c# filter datatable

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

   }

}

2 个答案:

答案 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 PropertyDataView.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