ListView Datapager不工作当Session使用而不是VeiwState时

时间:2016-05-06 07:06:26

标签: asp.net vb.net listview

我想在listview中显示诊所详细信息列表。来自MasterPage用户选择城市&如果他去临床页面,那么医院列表将显示在选定的城市。现在,如果我在我的诊所页面中使用ViewState,那么它不会从所选城市获取诊所数据那么我所做的就是我存储城市会话&在诊所页面上,我使用了Session而不是ViewState,它现在正常工作但我的数据库停止了工作。如果我必须从datapager看到另一个页面,那么它不会切换。这是我的代码

母版

Protected Sub locationSelector_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles locationSelector.TextChanged
    Session("masterLocation") = locationSelector.text
    Session("Data") = Nothing
End Sub 

诊所页面

Private Sub hospitals_PreRender(sender As Object, e As EventArgs) Handles Me.PreRender
    Try
        If Not Session("Data") Is Nothing Then
            hospitals.DataSource = Session("Data")
            hospitals.DataBind()
        Else
            Dim citySelector As Label = Page.Master.FindControl("locationPopupActivator")
            query = "select hospitalid, name, address, thumbnail, serviceID, mondayFrom, mondayTo, consultancyFees, city from hospitals Where city Like '" + citySelector.Text + "%'  and status = 'active'"
            Dim cmd As New MySqlCommand(query, con)
            cmd.CommandTimeout = 120
            Dim da As New MySqlDataAdapter(cmd)
            Dim table As New DataTable
            da.Fill(table)
            Session("Data") = table
            hospitals.DataSource = table
            hospitals.DataBind()
        End If

        'mainCount.Text = table.Rows(0)("countRows").ToString

    Catch ex As Exception
        Response.Write(ex)
    End Try
End Sub

Protected Sub DataPager1_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
    Try
        Dim table As DataTable = Session("Data")
        hospitals.DataSource = table
        hospitals.DataBind()
    Catch ex As Exception
        Response.Write(ex)
    End Try
End Sub

ASPX上的Listview

<asp:ListView ID="hospitals" runat="server" DataKeyNames="hospitalID" DataKey="hospitalID">
    <ItemTemplate>
        My Content
    </ItemTemplate>
    <EmptyDataTemplate>
        <div class="not-found">
            <p>
                Sorry! Selected Query Not Found</p>
            <center>
                <img src="images/not-found.jpg" /></center>
        </div>
    </EmptyDataTemplate>
    <LayoutTemplate>
        <ul id="itemPlaceholderContainer" runat="server" style="">
            <li runat="server" id="itemPlaceholder" />
        </ul>
        <div class="datapager" style="padding-bottom: 10px;">
            <asp:DataPager ID="DataPager1" runat="server" PageSize="10" PagedControlID="hospitals" ViewStateMode="Enabled">
                <Fields>
                    <asp:NextPreviousPagerField ButtonType="Link" ShowFirstPageButton="false" ShowPreviousPageButton="true" ShowNextPageButton="false" />
                    <asp:NumericPagerField ButtonType="Link" />
                    <asp:NextPreviousPagerField ButtonType="Link" ShowNextPageButton="true" ShowLastPageButton="false" ShowPreviousPageButton="false" />
                </Fields>
            </asp:DataPager>
        </div>
    </LayoutTemplate>
</asp:ListView>

2 个答案:

答案 0 :(得分:0)

好的,在您的评论之后,我的代码对我有用:

Private Sub hospitals_PreRender(sender As Object, e As EventArgs) Handles Me.PreRender
Try 
            If Session("Data") Is Nothing Then
                Dim citySelector As Label = Page.Master.FindControl("locationPopupActivator")
                query = "select hospitalid, name, address, thumbnail, serviceID, mondayFrom, mondayTo, consultancyFees, city from hospitals Where city Like '" + citySelector.Text + "%'  and status = 'active'"
                Dim cmd As New MySqlCommand(query, con)
                cmd.CommandTimeout = 120
                Dim da As New MySqlDataAdapter(cmd)
                Dim table As New DataTable
                da.Fill(table)
                Session("Data") = table
                hospitals.DataSource = table
                hospitals.DataBind()
            End If

            'mainCount.Text = table.Rows(0)("countRows").ToString
     Catch ex As Exception
       Response.Write(ex)
     End Try
End Sub

protected void hospitals_PagePropertiesChanging(object sender, System.Web.UI.WebControls.PagePropertiesChangingEventArgs e)
        {
            var datapager = ((DataPager)hospitals.FindControl("DataPager1"));
            datapager.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
            hospitals.DataSource = Session["Data"];
            hospitals.DataBind();
            datapager.DataBind();
        }

我认为你根本不需要DataPager1_PreRender方法,所以你可能应该将它们全部删除。您需要将新事件附加到列表视图中:OnPagePropertiesChanging="hospitals_PagePropertiesChanging"。对不起c#中的代码,但我不太了解VB;)

答案 1 :(得分:0)

这是您网页的工作示例:

hospital.master

<%@ Master Language="VB" CodeFile="hospital.master.vb" Inherits="hospital_master" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="sm" runat="server" />
        <div>
            <asp:Label ID="lblLockSel" runat="server" AssociatedControlID="locationSelector">Locator Selector</asp:Label>
            <asp:UpdatePanel ID="upLocSel" runat="server" UpdateMode="Conditional">
                <ContentTemplate>
                    <asp:TextBox ID="locationSelector" runat="server" AutoPostBack="true"></asp:TextBox>
                    <asp:Label ID="locationPopupActivator" runat="server"></asp:Label>
                </ContentTemplate>
            </asp:UpdatePanel>
            <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
            </asp:ContentPlaceHolder>
        </div>
    </form>
</body>
</html>

hospital.master.vb

Partial Class hospital_master
    Inherits System.Web.UI.MasterPage
    Protected Sub locationSelector_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles locationSelector.TextChanged
        Session("masterLocation") = locationSelector.Text
        Session("Data") = Nothing
        locationPopupActivator.Text = locationSelector.Text
    End Sub
End Class

clinics.aspx

<%@ Page Title="" Language="VB" MasterPageFile="~/hospital.master" AutoEventWireup="false" CodeFile="clinics.aspx.vb" Inherits="Clinics" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <asp:UpdatePanel ID="upHospitals" runat="server" UpdateMode="Always">
        <ContentTemplate>
<asp:ListView ID="hospitals" runat="server" DataKeyNames="hospitalID" DataKey="hospitalID">
    <ItemTemplate>
        <%--My Content--%>
        <li>
<asp:HyperLink ID="lnkHospital" runat="server" NavigateUrl='<%#Eval("hospitalID", "~/hospital.aspx?id={0}") %>' Text='<%#Eval("Name") %>'></asp:HyperLink>
        </li>
    </ItemTemplate>
    <EmptyDataTemplate>
        <div class="not-found">
            <p>
                Sorry! Selected Query Not Found</p>
            <center><%--<center>Is Deprecated Use div with CSS</center>--%>
                <img src="images/not-found.jpg" /></center>
        </div>
    </EmptyDataTemplate>
    <LayoutTemplate>
        <ul>
            <li runat="server" id="itemPlaceholder" />
        </ul>
    </LayoutTemplate>
</asp:ListView>
            <%--Inside Update Panel dataPager should be outside paged control--%>
        <div class="datapager" style="padding-bottom: 10px;">
            <asp:DataPager ID="DataPager1" runat="server" PageSize="10" PagedControlID="hospitals"><%-- ViewStateMode="Enabled"> this is default--%>
                <Fields>
                    <asp:NextPreviousPagerField ButtonType="Link" ShowFirstPageButton="false" ShowPreviousPageButton="true" ShowNextPageButton="false" />
                    <asp:NumericPagerField ButtonType="Link" />
                    <asp:NextPreviousPagerField ButtonType="Link" ShowNextPageButton="true" ShowLastPageButton="false" ShowPreviousPageButton="false" />
                </Fields>
            </asp:DataPager>
        </div>
        </ContentTemplate>
    </asp:UpdatePanel>
</asp:Content>

clinics.aspx.vb

Partial Class Clinics
    Inherits System.Web.UI.Page

    Private Sub Clinics_Load(sender As Object, e As EventArgs) Handles Me.Load
        If Not Page.IsPostBack Then
            Session.Remove("Data") 'init
        End If
    End Sub

    Private Sub hospitals_PagePropertiesChanging(sender As Object, e As PagePropertiesChangingEventArgs) Handles hospitals.PagePropertiesChanging
        DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, False)
        hospitals.DataSource = GetData() 'Session("Data")
        hospitals.DataBind()
    End Sub

    Private Sub hospitals_PreRender(sender As Object, e As EventArgs) Handles Me.PreRender
        hospitals.DataSource = GetData()
        hospitals.DataBind()
    End Sub
    Private Function GetData() As Data.DataTable
        Try
            If Session("Data") IsNot Nothing Then
                Return Session("Data")
            Else
                'This is MS SQL server. If you use MySQL then change types accordingly
                DataPager1.SetPageProperties(0, DataPager1.PageSize, False) 'reinit
                Dim citySelector As Label = Page.Master.FindControl("locationPopupActivator")
                Using con As New Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("ClinicsCNN").ConnectionString)
                    Dim cmd As New Data.SqlClient.SqlCommand("select hospitalid, name, address, thumbnail, serviceID, mondayFrom, mondayTo, consultancyFees, city from hospitals Where city Like @city  and status = 'active'", con)
                    cmd.CommandType = Data.CommandType.Text
                    cmd.Parameters.Add("@city", Data.SqlDbType.VarChar, 50).Value = citySelector.Text & "%" 'same as Session("masterLocation")
                    Dim table As New Data.DataTable()
                    Dim da As New Data.SqlClient.SqlDataAdapter(cmd)
                    da.Fill(table)
                    da.Dispose()
                    cmd.Dispose()
                    Session("Data") = table
                    Return table
                End Using
            End If
        Catch ex As Exception
            Response.Write(ex) 'for debug purpose
            Return Nothing
        End Try

    End Function
End Class

你接受这个解决方案吗?