如何使用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;
代码如下:
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