WebページにtxtFirstName
(TextBox)、txtDisplayName
(TextBox)、txtFromDate
(TextBox)、txtToDate
(TextBox)、btnFilter
(button)のような5つのコントロールがあります。また、DataTableを使用してGridViewの同じページにいくつかのデータをバインドしています。
次に、上記で説明したこれらの検索パラメーターコントロールを使用して、DataTableをフィルター処理します。
フィルター条件は、
満たされたコントロールと空のコントロールについてはわかりません。したがって、コントロールに入力された入力に基づいて、DataTableをフィルタリングする必要があります。コントロール値が空の場合、Datatableをフィルタリングすることを許可しないでください。
LIKE演算子またはString.Startswith()でデータ値をフィルタリングする必要があります
txtFromDateとtxtToDateがいっぱいになっている場合は、範囲間のデータ値をフィルタリングする必要があります。
すべてのコントロールが満たされている場合は、日付範囲のすべてのフィルターパラメーターに基づいてデータテーブルをフィルター処理する必要があります。
このフィルタリングをどのように実現しますか?これをうまく実装するのを手伝ってください。LINQまたはLamda式でこれを行うことはできますか?もしそうなら、私に提案を教えてください。
私は2つの方法を試しましたが、機能しません。
最初の方法:
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テキストボックス間でデータを取得する考えがありません。
2番目の方法:
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()))
);
2番目のクエリ
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;
コードが機能しない理由は、条件演算子が正しくないためです。文字列がnullまたは空の場合はtrueを返し、そうでない場合はフィールド値を確認します。
ToList()
最後にリストが必要なToArray()
場合、または配列としてリストが必要な場合に適用します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加