如何通过单击列表框行项将搜索结果返回到文本框

Posted

技术标签:

【中文标题】如何通过单击列表框行项将搜索结果返回到文本框【英文标题】:How to return searched result to textbox by clicking on listbox row item 【发布时间】:2016-06-02 09:28:13 【问题描述】:

我正在尝试从数据库中读取数据以显示在列表框中。

我有文本框和组合框:txtIndex、txtEventID、cmbServer、cmbCompany、txtMessage...

当我点击“显示列表”按钮时,数据表中的所有数据都将被读取并填充到列表框中。单击列表框行项后,所有相关信息将显示在相应的文本框和组合框中对于这种情况

我使用 FindAll 函数实现搜索引擎,搜索结果似乎还可以。

问题是:当我点击列表框中的搜索结果时,文本框和组合框中显示的数据不正确。

下面是列出索引,不是我想要的。

这是我显示数据的代码(由 UserForm1_Click() 处理)

Private Sub Listbox1_Click()

Dim strAddress As String
Dim idx As Long

'    idx = ListBox1.ListIndex + 1

For idx = 0 To ListBox1.ListCount
    If ListBox1.Selected(idx) = True Then
        strAddress = ListBox1.ListIndex + 1

        UserForm1.txIndex.Value = Sheets("DATA").Range("A" & strAddress).Value
        UserForm1.txtEventID.Value = Sheets("DATA").Range("B" & strAddress).Value
        UserForm1.txtSource.Value = Sheets("DATA").Range("C" & strAddress).Value
        UserForm1.cmbServer.Value = Sheets("DATA").Range("D" & strAddress).Value
        UserForm1.txtMessage.Value = Sheets("DATA").Range("E" & strAddress).Value
        UserForm1.cmbStatus.Value = Sheets("DATA").Range("F" & strAddress).Value
        UserForm1.txtDate.Value = Sheets("DATA").Range("G" & strAddress).Value
        UserForm1.txtDate.Text = VBA.Format(txtDate, "yyyy.mm.dd")

        UserForm1.txtIssueNo.Value = Sheets("DATA").Range("H" & strAddress).Value
        UserForm1.cmbCompany.Value = Sheets("DATA").Range("I" & strAddress).Value
        UserForm1.txtErrorType.Value = Sheets("DATA").Range("J" & strAddress).Value
        UserForm1.cmbPriority.Value = Sheets("DATA").Range("K" & strAddress).Value
        UserForm1.txtComment.Value = Sheets("DATA").Range("L" & strAddress).Value
        UserForm1.txtName.Value = Sheets("DATA").Range("M" & strAddress).Value

        GoTo EndLoop
'        UserForm1.Show
    End If
Next idx

EndLoop:
Application.ScreenUpdating = True
Label25.Caption = "You're looking for event id:  " & txtEventID.Text

End Sub

结果不正确。我想在文本框和组合框中显示与所选项目完全相关的数据,但是当我选择搜索结果(显示在第一行)时,Useform 在工作表中显示了 1 行数据,而不是搜索结果。

问题如附图所示。

【问题讨论】:

我理解正确吗?数据表的第一行具有值“索引”、“事件 ID”等作为列标题。然后表单填充这些而不是相关行,即strAddress 始终为 1? 嗨,arcadeprecinct,是的,你是对的。我的第一行显示列标题。 【参考方案1】:

首先,您不应该使用 UserForm1_Click() 事件来显示数据,而应该使用 SomeButton_Click 事件来显示数据

那么你必须有一个ListBox1_Click事件句柄用户窗体控件在选择任何ListBox1项目后刷新 如下:

Option Explicit

Private Sub Listbox1_Click()
    Dim strAddress As Long
    Dim dataSht As Worksheet

    With Me
        If .ListBox1.ListIndex <> -1 Then
            Set dataSht = Sheets("DATA")
            strAddress = GetEventIDRow(.ListBox1.List(.ListBox1.ListIndex, 1), dataSht.Columns("B")) '<~~  GetEventIDRow returns "Data" sheet row corresponding to the selected EventID, which is got from the 2nd column of the selected ListBox row

            .txIndex.Value = dataSht.Range("A" & strAddress).Value
            .txtEventID.Value = dataSht.Range("B" & strAddress).Value
            .txtSource.Value = dataSht.Range("C" & strAddress).Value
            .cmbServer.Value = dataSht.Range("D" & strAddress).Value
            .txtMessage.Value = dataSht.Range("E" & strAddress).Value
            .cmbStatus.Value = dataSht.Range("F" & strAddress).Value
            .txtDate.Value = dataSht.Range("G" & strAddress).Value
            .txtDate.Text = VBA.Format(txtDate, "yyyy.mm.dd")

            .txtIssueNo.Value = dataSht.Range("H" & strAddress).Value
            .cmbCompany.Value = dataSht.Range("I" & strAddress).Value
            .txtErrorType.Value = dataSht.Range("J" & strAddress).Value
            .cmbPriority.Value = dataSht.Range("K" & strAddress).Value
            .txtComment.Value = dataSht.Range("L" & strAddress).Value
            .txtName.Value = dataSht.Range("M" & strAddress).Value
        End If
    End With
End Sub

Function GetEventIDRow(EventID As Long, rng As Range) As Long
    GetEventIDRow = rng.Find(What:=EventID, LookAt:=xlWhole, LookIn:=xlValues).Row
End Function

请考虑我几乎是盲目的编码,所以你必须适应你的实际数据和控制结构

【讨论】:

您好 User3598756,非常感谢您的及时回复。这是很好的评论,我非常感谢。我已经测试了你的代码。当我尝试通过搜索框中的某些条件搜索记录时,它运行良好。但是,在“显示列表”按钮、“添加新”记录、“删除”和“更新”的情况下,listbox_click () 事件似乎无法正常工作。列表框中的选定项目与 DATA 表中的相应记录不匹配。我在这里附上了我的完整代码,你能给我一些提示吗?再次感谢您的关注。 非常感谢。我根据您的提示修改了我的代码。它工作得很好。 :) 你的提示中我还有一个疑惑。你能帮我解释一下吗?它是:当我使用:“strAddress = GetIndexRow(.ListBox1.List(.ListBox1.ListIndex, 0), dataSht.Columns("A"))”时,查找索引,然后显示列表:使用 ListBox1 '.ColumnHeads = True .List = Sheets("DATA").Range("A1").CurrentRegion.Value .ColumnCount = Sheets("DATA").Cells(2, 2).CurrentRegion.Columns.Count 当我第一次点击时结束行(列标题),错误会来。在这种情况下我该怎么办?非常感谢您的想法,并在此先感谢您! 我不太清楚你的问题是什么。你最好把它放在一个只添加相关代码的新问题中(只是你的处理程序子和GetIndexRow的运行摘录)。这也将在 SO 规则的路径中...... 我已经完成了我的程序,没有任何错误。它运作良好。非常感谢你的帮助。很高兴跟你聊天。 ^^

以上是关于如何通过单击列表框行项将搜索结果返回到文本框的主要内容,如果未能解决你的问题,请参考以下文章

无法存储通过搜索文本框在硒列表中生成的下拉列表项

如何在jsp中使用下拉列表、文本框和搜索按钮获取数据

将 Access 2003 列表框行源(查询)导出到 Excel 2003 的最有效方法

如何突出显示 MS-Access 列表框行?

通过表单事件过程中的函数填充访问文本框

点击文本框搜索,出现在下拉列表中