【问题标题】:Using ViewState to apply filters on Listview使用 ViewState 在 Listview 上应用过滤器
【发布时间】:2016-07-19 20:21:17
【问题描述】:

我使用 ListView 控件从数据库中获取产品列表。我还将结果存储在 viewstate 中。现在从复选框应用过滤器以获取精炼数据我想知道如何使用 viewState 值?

例如如果页面加载时在音乐类别中找到 10 个产品。现在,如果用户应用过滤器(蓝牙),则只应显示音乐中且具有蓝牙的产品..

现在它正在工作就像在页面加载时获取音乐类别然后如果我检查蓝牙过滤器,那么所有与音乐无关的蓝牙产品都会出现。

Private Sub shop_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim pageName As String = Me.Page.RouteData.Values("category").ToString()
    if not Me.isPostback Then
     Try
            query = select * from products where category = '"+pageName+"'
            Dim conString As String = ConfigurationManager.ConnectionStrings("conio").ConnectionString
            Dim con As New MySqlConnection(conString)
            Dim cmd As New MySqlCommand(query)
            con.Open()
            Dim da As New MySqlDataAdapter()
            cmd.Connection = con
            da.SelectCommand = cmd
            Dim dt As New DataTable()
            da.Fill(dt)
            ViewState("Data") = dt
            products.DataSource = dt
            products.DataBind()
            catHeading.Text = pageName
            itemCount.Text = dt.Rows.Count.ToString
            con.Close()
        Catch ex As Exception
            Response.Write(ex)
        End Try
    End If
End Sub

过滤应用代码

Private Sub priceFilter_SelectedIndexChanged(sender As Object, e As EventArgs) Handles priceFilter.SelectedIndexChanged
    'buildWhereClause()

    Dim price As String = priceFilter.SelectedValue.ToString()
    Dim dt As DataTable = DirectCast(ViewState("Data"), DataTable)
    Dim dr As DataRow() = dt.[Select]((Convert.ToString("category='") & price) + "'")
    products.DataSource = dt
    products.DataBind()
    itemCount.Text = dt.Rows.Count.ToString
End Sub

我只想当用户应用任何过滤器时,它应该从视图状态(数据)而不是整个表检查。

【问题讨论】:

    标签: asp.net vb.net listview filtering


    【解决方案1】:

    将您的类别保存在视图状态中,并在选中时在字符串中获取该类别并在您的查询中加入该字符串。像这样的

        Dim constr As String = ConfigurationManager.ConnectionStrings("connectionstring").ConnectionString
        Dim query As String = "select * from table"
        Dim joiner As String = ""
    
        Dim condition As String = String.Empty
        Dim whereClause As String = String.Empty
        Dim priceCondition As String = String.Empty
        Try
            Dim category As String = ViewState("Data")
            condition = String.Concat(condition, joiner, String.Format("{0}", category))
            If joiner = "" Then joiner = ""
    
    
            joiner = " where "
            If Not String.IsNullOrEmpty(condition) Then
                whereClause = String.Concat(whereClause, joiner, String.Format("category Like '%{0}%'", condition))
                joiner = " and "
            End If
    
    
            'Same way you can apply multiple filters as you want & then get that in one string like below
    
            Dim masterClause As String = String.Empty
            masterClause = (query & whereClause)
    
            Using con As New MySqlConnection(constr)
                Using cmd As New MySqlCommand(masterClause)
                    Using sda As New MySqlDataAdapter(cmd)
                        cmd.Connection = con
                        Using dt As New DataTable()
                            sda.Fill(dt)
                            products.DataSource = dt
                            products.DataBind()
                            itemCount.Text = dt.Rows.Count.ToString
                        End Using
                    End Using
                End Using
            End Using
    

    【讨论】:

      【解决方案2】:

      对于您的过滤器,您可以使用:

          Dim dt As DataTable = DirectCast(ViewState("Data"), DataTable)
          Dim dr As DataRow() = dt.Select("category='" & category & "'")
          products.DataSource = dr
          products.DataBind()
          itemCount.Text = dr.Length
      

      【讨论】:

      • 它显示错误“找不到列类别”怎么可能?表中有类别列
      • 现在它没有抛出任何错误,但没有输出。
      • 尝试调试。在 products.datasource = dt 上放一个断点;现在查看观察窗口中的“dt”。 dt.Rows.Count 是什么?并尝试观看“博士” - 长度是多少?
      • 当您使用 "dt.Select("category='PUT_ANY_CATEGORY_HERE')" 进行调试时,您会看到什么 - 是否得到任何行?
      • dt 正在获取表 1。类别正确获取选定的值,因此无需将静态值放在那里。只是过滤器没有应用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多