【问题标题】:Filter a Listview with a combobox in vb.net在 vb.net 中使用组合框过滤 Listview
【发布时间】:2013-07-04 17:53:27
【问题描述】:

我想要的主要是隐藏数组而不是请求。所以我有一个组合框和列表框,其中包含由适配器、数据集、数据表和绑定源完成的数据库值。 .因此,当该人更改组合框值时,它将过滤列表。因此,可以说组合框包含 ID,因此列表视图将显示具有该 ID 的那些行。 Onload listview 显示所有属性。那么如果没有 Requery 怎么办????所以下面我有填充列表和组合框部分。

这是一个链接,但它不是很有帮助 VB.NET Listview Multiple Column Filter

   Dim listcount As Integer = listview1.Columns.Count

    With listview1
        .Columns.Clear()
        .View = View.Details


        .GridLines = True


        .Columns.Add("Name").Width = 70
        .Columns.Add("ID").Width = 60
        .Columns.Add("Number").Width = 90


    End With


    Try


        strQuery = "Select * From Table"



        DB.Connection = New SqlConnection(strConnection)

        DB.Connection.Open()
        ' add a daaset
       Adapter = New SqlDataAdapter(strQuery, DB.Connection)
        ListRS = New DataSet



        Adapter.Fill(ListRS)

        Dim table As DataTable = ListRS.Tables(0)


        bnsrc = New BindingSource
        bnsrc.DataSource = ListRS.Tables(0)
        combobox1.DataSource = bnsrc
         combobox1.DisplayMember = "ID"
        combobox1.ValueMember = "ID"
        combobox1.AutoCompleteSource = AutoCompleteSource.ListItems

       Listview1.Items.Clear()



        DB.Connection.Close()

所以,如果我们要重新查询,那么我们改变 sql 语句也是一样的。

      strQuery =  "Select * from Table Where ID=@id"

如果我添加了一个参数,它将如何影响组合框,因为它们使用相同的查询。

【问题讨论】:

  • 你能粘贴一些代码吗?
  • 我唯一的代码是填充部分。实际上我不知道如何进行过滤,如何开始。你想让我发布组合框和列表的填充吗? @CarlosLanderas
  • ID 在这里是唯一的,这意味着它只会在找到时显示一行,或者它不是唯一的,意味着可以显示多行?
  • @Edper 好的,我的英语不是很好,所以如果我用错了措辞,请纠正我。 select 语句与示例不太一样。语句中有inner join和group by。所以查询实际上是一个视图。在这种形式下,用户只能查看而不能做任何事情,因此过滤可能对他们有好处

标签: vb.net listview visual-studio-2012 combobox filtering


【解决方案1】:

您可以通过每次添加您想要的项目来在comboxbox1SelectedIndexChanged 事件上填充Listview1。示例:

Private Sub combobox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles comboBox1.SelectedIndexChanged
    ListView1.Items.Clear()
    Dim curSelectionCombobox As String = combobox1.SelectedItem.ToString()
    For Each item As String In allItems
        If (condition) Then
            ListView1.Items.Add(item)
        End If
    Next
End Sub

使用上面的代码,您可以在combobox1 (curSelectionCombobox) 中获得当前选定的项目,并遍历从数据库中检索到的所有元素并决定(根据给定条件)哪些元素应该/应该不被添加。因此,这种方法不使用任何过滤,而是在每次combobox1 的选择发生变化时从头开始添加元素。

如果你想在 form1 加载时执行“过滤”

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    ListView1.Items.Clear()
    For Each item As String In allItems
        If (condition) Then
            ListView1.Items.Add(item)
        End If
    Next
End Sub

如果您想在运行时根据各种条件更改 Listview1 中的项目,您应该依赖允许多选的控件(例如,复选框)。示例代码:

Private Sub CheckBox1_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles CheckBox1.CheckedChanged

    If (CheckBox1.Checked And CheckBox2.Checked And CheckBox3.Checked) Then
        ListView1.Items.Clear()
        For Each item As String In allItems
            If (condition) Then
                ListView1.Items.Add(item)
            End If
        Next
    End If
End Sub

因此,我们的想法不是将所有项目添加到 Listbox1 然后过滤它们,而只是添加您想要的项目。我把“条件”放在哪里,你可以调用一个函数来执行你想要的复杂检查。

【讨论】:

  • 这是来自 C# 不是吗???好吧,我认为您的代码将添加到列表视图中,但是在我选择组合框中的另一个值时会发生什么?
  • 为什么来自 C#?!这是 VB.NET。每次更改combobox1中选择的索引时都会调用此函数(如果您在设计器视图中双击combobox1,将自动生成此函数)。您可以在变量 curSelectionCombobox 中获得准确的值。您为什么不实施此解决方案,对其进行测试并了解其具体作用?
  • listview1.item.add 末尾有一个分号。我想从大约 100 多个项目中过滤。您的代码只需添加一个项目,它并不清楚。我说的是 100 多个具有相同 ID 的项目中的 10 个。如果我这样做,它会添加 1 个项目。我在我的问题中放置的代码是在表单加载中。所以在表单 Load This 正在显示。
  • 啊!对不起,一个错字:)...我的代码没有添加一个项目。它添加了您想要的所有项目。当用户选择不同的 combobox1 项目时,将调用此代码(您当时只能选择一个组合框项目)。如果要同时选择多个项目,则不应依赖组合框,而应依赖复选框,例如;这些也将有相关的事件。如果您不想在运行时更新列表,则应在表单加载时填充 Listview1 时应用您的条件。我将更新我的代码以应对所有这些可能性。
  • 我会试一试,看看它是如何工作的! (:感谢您的努力,我会让您知道它的工作原理。
猜你喜欢
  • 1970-01-01
  • 2012-10-27
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
相关资源
最近更新 更多