如何使用c#筛选具有多列值的数据表

本文关键字:数据表 何使用 筛选 | 更新日期: 2023-09-27 18:08:31

我在我的网页上有5个控件,如txtFirstName (TextBox), txtDisplayName (TextBox), txtFromDate (TextBox), txtToDate (TextBox)和btnFilter(按钮)。我也绑定了一些数据在GridView同一页使用数据表。

现在我想通过使用上面提到的这些搜索参数控件来过滤DataTable。

过滤条件为,

  • 我们不确定填充控件和空控件。因此,根据在控件上输入的内容,我们需要过滤DataTable。如果控件值为空,我们不应该允许它们过滤Datatable

  • 我们需要通过LIKE操作符或String.Startswith()

  • 过滤数据值
  • 如果txtFromDate和txtToDate已经填满,那么我们需要过滤范围之间的数据值

  • 如果所有控件都被填充,那么我们需要根据所有过滤器参数和日期范围过滤数据表。

我们如何实现这个过滤?请帮助我成功地实现这一点。我们可以用LINQ或lambda表达式来做吗?如果有,请告诉我你的建议。

我试了两种方法,但都不起作用,

第一方式:

var test=dtActions.AsEnumerable().Where(z=>
    !string.IsNullOrEmpty(txtFirstName.Text)? z.Field<string>("FirstName").ToUpper().StartsWith(txtFirstName.Text.ToUpper()) &&
    !string.IsNullOrEmpty(txtDisplayName.Text)?z.Field<string>("DisplayName").ToUpper().StartsWith(txtDisplayName.Text.ToUpper()) &&
    !string.IsNullOrEmpty(txtCreatedBy.Text)?z.Field<string>("CreatedBy").ToUpper().StartsWith(txtCreatedBy.Text.ToUpper());

我不知道如何获取DateTime文本框之间的数据

第二种方式:

var results = from dataRow in dtActions.AsEnumerable()
    where dataRow.Field<string>("FirstName").ToUpper().StartsWith(txtFirstName.Text.ToUpper()) ||
        dataRow.Field<string>("DisplayName").ToUpper().StartsWith(txtFirstName.Text.ToUpper()) ||  
        ((dataRow.Field<DateTime>("CreatedDate")>= Convert.ToDateTime(txtFromDate.Text)) && (dataRow.Field<DateTime>("CreatedDate")<= Convert.ToDateTime(txtToDate.Text)))
    select dataRow;

如何使用c#筛选具有多列值的数据表

代码如下:

var test = dtActions.AsEnumerable().Where(z =>
    (string.IsNullOrEmpty(txtFirstName.Text) ? true : z.Field<string>("FirstName").ToUpper().StartsWith(txtFirstName.Text.ToUpper())) &&
    (string.IsNullOrEmpty(txtDisplayName.Text) ? true : z.Field<string>("DisplayName").ToUpper().StartsWith(txtDisplayName.Text.ToUpper())) &&
    (string.IsNullOrEmpty(txtCreatedBy.Text) ? true : z.Field<string>("CreatedBy").ToUpper().StartsWith(txtCreatedBy.Text.ToUpper()))
);

你的第二个查询

var results = from dataRow in dtActions.AsEnumerable()
        where (string.IsNullOrEmpty(txtFirstName.Text) ? true : dataRow.Field<string>("FirstName").ToUpper().StartsWith(txtFirstName.Text.ToUpper())) ||
            (string.IsNullOrEmpty(txtDisplayName.Text) ? true : dataRow.Field<string>("DisplayName").ToUpper().StartsWith(txtDisplayName.Text.ToUpper())) ||
            (string.IsNullOrEmpty(txtCreatedBy.Text) ? true : dataRow.Field<string>("CreatedBy").ToUpper().StartsWith(txtCreatedBy.Text.ToUpper())) ||
            (dataRow.Field<DateTime>("CreatedDate") >= Convert.ToDateTime(txtFromDate.Text) && (dataRow.Field<DateTime>("CreatedDate") <= Convert.ToDateTime(txtToDate.Text)))
        select dataRow;

你的代码不工作的原因是不正确的条件操作符。如果string为null或空则返回true,否则检查字段值。

应用ToList(),如果你想要一个列表在结束或ToArray(),如果你想要一个数组

是否检查了数据视图过滤器?http://msdn.microsoft.com/en-us/library/system.data.dataview.rowfilter.aspx