使用VB.net和excel(组合框和搜索)

使用VB.net和excel(组合框和搜索),.net,vb.net,excel,combobox,oledb,.net,Vb.net,Excel,Combobox,Oledb,编程新手,需要在VB中编写程序,以便在后台与Excel交互 这个想法是有两个组合框,一个是“国家”,另一个是“城市”(如果选择了国家,城市列表将减少到该国家;如果选择了城市,国家将自动选择) 我有一个DataGridView,它显示excel speadsheet中的两列,即此人的名字和姓氏 因此,给定城市或国家/城市,将显示居住在该国的人员列表 此外,我还尝试创建一个搜索框,当您在文本字段中键入内容时,根据您目前键入的内容,它将过滤GridView中的名字(包含您键入的内容) 到目前为止,我已

编程新手,需要在VB中编写程序,以便在后台与Excel交互

这个想法是有两个组合框,一个是“国家”,另一个是“城市”(如果选择了国家,城市列表将减少到该国家;如果选择了城市,国家将自动选择)

我有一个DataGridView,它显示excel speadsheet中的两列,即此人的名字和姓氏

因此,给定城市或国家/城市,将显示居住在该国的人员列表

此外,我还尝试创建一个搜索框,当您在文本字段中键入内容时,根据您目前键入的内容,它将过滤GridView中的名字(包含您键入的内容)

到目前为止,我已经设法让其他东西工作,如单选按钮和不同选项的复选框

我找不到任何与组合框和搜索字段相关的东西(没有按钮,所以需要进行“实时”筛选过程)

我对SQL很熟悉,所以到目前为止我一直在使用SQL向excel发送查询并检索网格视图的信息

你能帮忙吗?(可能会提供我应该如何编码的模板…)


我正在使用Visual Basic 2012和OleDB 4.0(如果我没有弄错的话)建立连接


鉴于下面的评论,我发现搜索栏的解决方法是创建一个按钮,然后使其尽可能小,并通过“将其发送到后面”将其隐藏在搜索栏后面,因为使其不可见似乎完全禁用了它

然后,我将以下代码用于按钮:

    Private Sub BtSearch_Click(sender As Object, e As EventArgs) Handles BtSearch.Click

    Try
        FillSearchResults("SELECT First_Name, Last_Name FROM [Database$] WHERE Country LIKE '%" & Country.Text & "%'")
        Country.Text = dt.Rows(0).Item(1)

    Catch ex As Exception
        MsgBox("Not Found")
    End Try

End Sub
对于文本字段(在用户点击Enter时显示搜索结果):

下一步:我可能会尝试应用过滤器,这样用户就不必按enter键来更新网格视图



我将在这里发布任何开发,以便如建议的那样,如果其他任何人有相同的问题,可以更清楚地看到以下…

您可以为
DataGridView
过滤器
应用到
BindingSource
。您可以将该代码放入
组合框的
SelectedIndexChanged
事件的事件处理程序中:

Private Sub myComboBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles myComboBox.SelectedIndexChanged
    bindingSourceForMyDataGridView.Filter = 
        "SomeColumn LIKE '%" & myComboBox.SelectedValue & "%'"
End Sub

组合框
还有其他更适用的处理程序,如
SelectedValueChanged
TextChanged

还有其他更适用的值,具体取决于
组合框
的填充方式,例如
.Text
.SelectedText
好的,基本上我已经完成了问题中描述的搜索

关于组合框,我留下了一个组合框

通过GUI/Designer模式填充:

  • 选择组合框

  • 单击小箭头

  • 点击编辑项目

  • 将弹出一个窗口-在那里输入您的选项(每行一个选项)

  • 一旦你做到了,保存它

双击它,代码模式就会出现

我有一个FillSearchResults函数,它将SQL语句发送到excel,并将该信息放入网格视图:

        Private Sub FillSearchResults(ByVal Query As String)

    Dim da As OleDbDataAdapter
    Dim dt As New DataTable

    'The Connection should already be open'

    da = New OleDbDataAdapter(Query, cn)
    dt.Clear()
    da.Fill(dt)

    'To name the columns and make it so that when the window size is changed the column widths would automatically adjust'
    With SearchResults
        .DataSource = dt
        .Columns(0).HeaderText = "First Name"
        .Columns(1).HeaderText = "Second Name"
        .Columns(2).HeaderText = "Country"
        .Columns(3).HeaderText = "Completed Fully"
        .Columns(0).Width = 70
    End With

    'To Color the whole rows depending if all of the information is complete (I do realise this is not the best way to do it but still...)'
    For i As Integer = 0 To Me.SearchResults.Rows.Count - 1
        If Me.SearchResults.Rows(i).Cells("Completed_Fully").Value.ToString = "No" Then
            Me.SearchResults.Rows(i).Cells("First_Name").Style.BackColor = Color.Cornsilk
            Me.SearchResults.Rows(i).Cells("Second_Name").Style.BackColor = Color.Cornsilk
            Me.SearchResults.Rows(i).Cells("Country").Style.BackColor = Color.Cornsilk
            Me.SearchResults.Rows(i).Cells("Completed_Fully").Style.BackColor = Color.Cornsilk

        ElseIf Me.SearchResults.Rows(i).Cells("Completed_Fully").Value.ToString = "Yes" Then
            Me.SearchResults.Rows(i).Cells("First_Name").Style.BackColor = Color.Azure
            Me.SearchResults.Rows(i).Cells("Second_Name").Style.BackColor = Color.Azure
            Me.SearchResults.Rows(i).Cells("Country").Style.BackColor = Color.Azure
            Me.SearchResults.Rows(i).Cells("Completed_Fully").Style.BackColor = Color.Azure

        Else
            Me.SearchResults.RowsDefaultCellStyle.BackColor = Color.Red
            Me.SearchResults.ClearSelection()
        End If
    Next

   'To Clear the first row/cell being selected'
    Me.SearchResults.ClearSelection()

End Sub
现在链接国家/地区字段:

    Private Sub Country_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Country.SelectedIndexChanged

    FillSearchResults(SELECT Country FROM Database WHERE Country LIKE '%" & Country.Text & "%' ")

End Sub
完成:)

无论何时选择一个国家,都只显示该国家的结果


PS:我将国家组合框称为“国家”。

您可以为
DataGridView
过滤
BindingSource
。查看谢谢:)我完成了搜索部分,用户必须单击enter,但这很好。如果您解决了自己的问题,请“回答您自己的问题”,并向我们展示您是如何解决的。这样,其他搜索此问题的人也可以看到您的解决方案。@Alex除非您希望,否则用户不需要单击按钮。您可以使用
组合框
SelectionChanged
事件处理程序执行更改过滤器的代码。这样,每当
组合框中的选择改变时,
过滤器也会改变,
@Jordumux我会添加我到目前为止在问题中所做的,因为它不是我所需要的完整解决方案,也是解决方案的变体,更像是一种变通方法;如果我能成功地将过滤器应用于绑定源,我将发布另一篇文章,如上所述,如下所述,非常感谢;这很有帮助;但是,我需要通过OleDB连接(已经建立)使用SQL代码(很可能)用excel列中的国家名称填充组合框,因为它似乎可以很好地完成这项工作,类似于从[Database$]中选择不同的国家。。。我找不到用excel中不同的值填充组合框的方法。。。您所描述的将是这一步之后的下一步,但我也将尝试将其应用于搜索栏,希望我能够做到;谢谢
    Private Sub Country_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Country.SelectedIndexChanged

    FillSearchResults(SELECT Country FROM Database WHERE Country LIKE '%" & Country.Text & "%' ")

End Sub