2015-11-20 151 views
1

我有以下几点:与客户现场在它 搜索输入文字时,使用2个文本框的搜索1列

  • 查询正是基于客户表

    • 客户表
    • 形式命名Form1

    Form1有两个TextBox S,即TxtCustomer1TxtCustomer2

    Query,客户领域的标准之内,我在下面标明以下代码:

    Like "*" & [forms]![Form1]![TxtCustomer1].[Text] & "*" And _ 
    Like "*" & [forms]![Form1]![txtCustomer2].[Text] & "*" 
    

    我希望你能看到我这个打算。我已经把查询中Form1作为子窗体,名为Sub1

    的2个文本框TxtCustomer1TxtCustomer2有一个OnChange事件,重新查询是在Sub1

    当前,该2 TextBox s是可操作的并且能够过滤Form1中的Sub1子表单。

    但这里的问题是:

    我不能用2 TextBox过滤掉该1列S在一起,其分别滤除。换句话说,在通过Sub1使用TxtCustomer1进行筛选之后,我开始输入以用TxtCustomer2进行筛选,此时它将重新开始Sub1中的排序,并且首先从TextCustomer2开始,反之亦然。

    好了,现在我已经能够一列2个TextBox有几分,但不得不做出2点的变化:

    • 变化1:使用“后更新”事件,而不是“关于改变”事件
    • 更改2:使用与上面张贴的相同的确切代码,但没有[Text] Control属性,它看起来像下面所示。

      Like "*" & [forms]![Form1]![TxtCustomer1] & "*" And _ Like "*" & [forms]![Form1]![TxtCustomer2] & "*"

  • 回答

    0

    你现在有什么工作,但它不再是“搜索您键入”使用AfterUpdate事件时。

    .Text属性仅在控件具有焦点时可用,但它也是在键入时返回文本的唯一属性 - .Value在离开控件之前不会返回它。

    所以我会做的是:

    Private Sub TxtCustomer1_Dirty(Cancel As Integer) 
        ' TxtCustomer1 is currently edited -> use its .Text property, and .Value for TxtCustomer2 
        Call DoFilter(Me!TxtCustomer1.Text, Me!TxtCustomer2.Value) 
    End Sub 
    
    Private Sub TxtCustomer2_Dirty(Cancel As Integer) 
        ' The other way around 
        Call DoFilter(Me!TxtCustomer1.Value, Me!TxtCustomer2.Text) 
    End Sub 
    
    Private Sub DoFilter(ByVal Cust1 As Variant, ByVal Cust2 As Variant) 
    
        Dim S As String 
        S = "Customer Like '*" & Cust1 & "*' And Customer Like '*" & Cust2 & "*'" 
        ' etc. 
    
    End Sub 
    
    +0

    那么我怎么能在窗体中实现这个? 2文本框 名为TxtCustomer1的第一个文本框 名为TxtCustomer2的第二个文本框 还有什么我如何在窗体中设置它? –

    +0

    答案就在这里。实现'Dirty'事件,并在'DoFilter()'中构建过滤器字符串,然后将其应用于结果列表(表单)。 – Andre

    -2