0

LLBLGen データ ソースから検索結果をフィルター処理する次の (サンプル) コードがあります。

IPredicateExpression firstFilter = new PredicateExpression();
firstFilter.Add(new FieldLikePredicate(CustomerFields.FirstName, null, txtSearchFirst.Text.Trim() + "%"));
llbldsCustomer.FilterToUser = firstFilter;
llbldsCustomer.DataBind();
gridview1.DataBind();

これは正常に機能し、このコードをトリガーすると結果がフィルタリングされます。ただし、2 番目のフィルターを追加すると、結果を表示する前にコードの呼び出しを 2 回押す必要があります。以下は、2 つのフィルターを含むスニペットです。

IPredicateExpression firstFilter = new PredicateExpression();
firstFilter.Add(new FieldLikePredicate(CustomerFields.FirstName, null, txtSearchFirst.Text.Trim() + "%"));
firstFilter.Add(new FieldLikePredicate(CustomerFields.LastName, null, txtSearchLast.Text.Trim() + "%"));
llbldsCustomer.FilterToUser = firstFilter;
llbldsCustomer.DataBind();
gridview1.DataBind();

この問題は、最初の検索以降のすべての検索で問題ありません。ただし、最初のもので動作する必要があります。

更新: コードは ASP.Net ボタン クリック イベントにあります。ページ読み込みイベント ブロックにも、このデータ ソースに影響を与えるコードはありません。

何か案は?

4

1 に答える 1

0

単純なテスト ケースで見られる動作を再現することはできません (以下を参照)。また、データソースでパラメーター バインドを使用していない限り、DataSource コントロールで DataBind を呼び出す必要はなく、GridView でのみ呼び出す必要があります。


テストケース:

DB には、FirstName と LastName の 2 つの varchar(50) フィールドを持つ 1 つのテーブル Customer が含まれています。

デフォルト.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestWebApp1._Default" %>
<%@ Register Assembly="SD.LLBLGen.Pro.ORMSupportClasses.NET20" Namespace="SD.LLBLGen.Pro.ORMSupportClasses" TagPrefix="llblgenpro" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
        <br />
        <br />
    <asp:GridView ID="CustomersGridView" runat="server" DataSourceID="dsCustomers">
    </asp:GridView>
    </div>
    <llblgenpro:LLBLGenProDataSource ID="dsCustomers" runat="server" 
        DataContainerType="EntityCollection" 
        EntityCollectionTypeName="TestWebApp1Framework.CollectionClasses.CustomerCollection, TestWebApp1Framework">
    </llblgenpro:LLBLGenProDataSource>
    </form>
</body>
</html>

Default.aspx.cs:

using System;
using SD.LLBLGen.Pro.ORMSupportClasses;
using TestWebApp1Framework.HelperClasses;

namespace TestWebApp1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Button1_Click(object sender, EventArgs e)
        {
            var filter = new PredicateExpression();
            filter.Add(new FieldLikePredicate(CustomerFields.FirstName, null, TextBox1.Text.Trim() + "%"));
            filter.AddWithOr(new FieldLikePredicate(CustomerFields.LastName, null, TextBox1.Text.Trim() + "%"));
            dsCustomers.FilterToUse = filter;
            dsCustomers.DataBind();
            CustomersGridView.DataBind();
        }
    }
}

テスト結果: このページを読み込むと、最初はすべての顧客が表示されます。文字 A をテキストボックスに入力してボタンをクリックすると、名前または姓が A で始まるすべての顧客のリストが表示されます。これは、両方のフィルターが正しく機能していることを示しています。

于 2009-03-25T15:11:41.257 に答える