0

我有以下(示例)代码来过滤来自 LLBLGen 数据源的搜索结果:

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

当我触发此代码时,这可以正常工作并过滤结果。但是,如果我添加第二个过滤器,我必须按两次调用代码才能看到结果。下面是带有 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 按钮单击事件中。Page Load 事件块中也没有影响此数据源的代码。

有任何想法吗?

4

1 回答 1

0

我无法复制您在简单测试用例中看到的行为(见下文)。此外,除非您在数据源上使用参数绑定,否则不必在 DataSource 控件上调用 DataBind,而只需在 GridView 上调用。


测试用例:

DB 包含 1 个表 Customer,其中包含两个 varchar(50) 字段:FirstName 和 LastName。

默认.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>

默认.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 回答