应用来自多个 checkboxList 的过滤器来过滤 VB.net 中的 ListView
Apply filters from multiple checkboxList to filter ListView in VB.net
我有一个 web 应用程序,其中有 1000 个产品,因此需要有多个过滤器。我总共有 4 个复选框列表。现在我的问题是,如果我从任何 checkboxList 应用过滤器,那么它会检查查询中指定的所有列的 selected 值。
我要的是下面这样
SELECT * FROM products WHERE price_rang IN ('selectedValueFromCheckBoxList1') And category IN ('selectedValueFromCheckBoxList2')
现在发生了什么
SELECT * FROM `products` WHERE price_range IN ('selectedValueFromCheckBoxList2') AND category IN ('selectedValueFromCheckBoxList2')
所以在这个查询中假设如果我 select 值首先来自 checkboxList2 然后对于两个列它都采用该值并且结果不显示。
下面是我的过滤流程代码
Private Sub getResult()
Dim constr As String = ConfigurationManager.ConnectionStrings("conio").ConnectionString
Dim query As String = "select * from products"
Dim condition As String = String.Empty
For Each price As ListItem In priceFilter.Items
condition += If(price.Selected, String.Format("'{0}',", price.Value), String.Empty)
Next
For Each sub_category As ListItem In category.Items
condition += If(sub_category.Selected, String.Format("'{0}',", sub_category.Value), String.Empty)
Next
If Not String.IsNullOrEmpty(condition) Then
condition = String.Format(" WHERE price_range IN ({0}) and sub_category IN ({0})", condition.Substring(0, condition.Length - 1))
End If
Using con As New MySqlConnection(constr)
Using cmd As New MySqlCommand(query & condition)
Using sda As New MySqlDataAdapter(cmd)
cmd.Connection = con
Using dt As New DataTable()
sda.Fill(dt)
products.DataSource = dt
products.DataBind()
End Using
End Using
End Using
End Using
End Sub
这是一个选项,如果您只对选中的项目感兴趣。
Public Function buildWhereClause() As String
Dim query As String = "select * from products"
Dim joiner As String = " "
Dim condition As String = String.Empty
Dim priceCondition As String = String.Empty
For i = 0 To priceFilter.Items.Count - 1
If priceFilter.Items(i).Selected Then
Dim price As String = priceFilter.Items(i).ToString
priceCondition = String.Concat(priceCondition, joiner, String.Format("'{0}'", price))
If joiner = " " Then joiner = ", "
End If
Next
Dim categoryCondition As String = String.Empty
joiner = " "
For i = 0 To categoryFilter.Items.Count - 1
If categoryFilter.Items(i).Selected Then
Dim category As String = categoryFilter.Items(i).ToString
categoryCondition = String.Concat(categoryCondition, joiner, String.Format("'{0}'", category))
If joiner = " " Then joiner = ", "
End If
Next
Dim whereClause As String = String.Empty
joiner = " where "
If Not String.IsNullOrEmpty(priceCondition) Then
whereClause = String.Concat(whereClause, joiner, String.Format(" price_range IN ({0})", priceCondition)) ' and sub_category IN ({0})", condition.Substring(0, condition.Length - 1))
joiner = " and "
End If
If Not String.IsNullOrEmpty(categoryCondition) Then
whereClause = String.Concat(whereClause, joiner, String.Format(" sub_category in ({0})", categoryCondition))
joiner = " and "
End If
Return String.Concat(query, whereClause)
End Function
我有一个 web 应用程序,其中有 1000 个产品,因此需要有多个过滤器。我总共有 4 个复选框列表。现在我的问题是,如果我从任何 checkboxList 应用过滤器,那么它会检查查询中指定的所有列的 selected 值。 我要的是下面这样
SELECT * FROM products WHERE price_rang IN ('selectedValueFromCheckBoxList1') And category IN ('selectedValueFromCheckBoxList2')
现在发生了什么
SELECT * FROM `products` WHERE price_range IN ('selectedValueFromCheckBoxList2') AND category IN ('selectedValueFromCheckBoxList2')
所以在这个查询中假设如果我 select 值首先来自 checkboxList2 然后对于两个列它都采用该值并且结果不显示。
下面是我的过滤流程代码
Private Sub getResult()
Dim constr As String = ConfigurationManager.ConnectionStrings("conio").ConnectionString
Dim query As String = "select * from products"
Dim condition As String = String.Empty
For Each price As ListItem In priceFilter.Items
condition += If(price.Selected, String.Format("'{0}',", price.Value), String.Empty)
Next
For Each sub_category As ListItem In category.Items
condition += If(sub_category.Selected, String.Format("'{0}',", sub_category.Value), String.Empty)
Next
If Not String.IsNullOrEmpty(condition) Then
condition = String.Format(" WHERE price_range IN ({0}) and sub_category IN ({0})", condition.Substring(0, condition.Length - 1))
End If
Using con As New MySqlConnection(constr)
Using cmd As New MySqlCommand(query & condition)
Using sda As New MySqlDataAdapter(cmd)
cmd.Connection = con
Using dt As New DataTable()
sda.Fill(dt)
products.DataSource = dt
products.DataBind()
End Using
End Using
End Using
End Using
End Sub
这是一个选项,如果您只对选中的项目感兴趣。
Public Function buildWhereClause() As String
Dim query As String = "select * from products"
Dim joiner As String = " "
Dim condition As String = String.Empty
Dim priceCondition As String = String.Empty
For i = 0 To priceFilter.Items.Count - 1
If priceFilter.Items(i).Selected Then
Dim price As String = priceFilter.Items(i).ToString
priceCondition = String.Concat(priceCondition, joiner, String.Format("'{0}'", price))
If joiner = " " Then joiner = ", "
End If
Next
Dim categoryCondition As String = String.Empty
joiner = " "
For i = 0 To categoryFilter.Items.Count - 1
If categoryFilter.Items(i).Selected Then
Dim category As String = categoryFilter.Items(i).ToString
categoryCondition = String.Concat(categoryCondition, joiner, String.Format("'{0}'", category))
If joiner = " " Then joiner = ", "
End If
Next
Dim whereClause As String = String.Empty
joiner = " where "
If Not String.IsNullOrEmpty(priceCondition) Then
whereClause = String.Concat(whereClause, joiner, String.Format(" price_range IN ({0})", priceCondition)) ' and sub_category IN ({0})", condition.Substring(0, condition.Length - 1))
joiner = " and "
End If
If Not String.IsNullOrEmpty(categoryCondition) Then
whereClause = String.Concat(whereClause, joiner, String.Format(" sub_category in ({0})", categoryCondition))
joiner = " and "
End If
Return String.Concat(query, whereClause)
End Function