我写了一个分页与搜索结合的程序,现在遇到两个问题:一、当我点击搜索后,得出的结果重复显示了两遍,也就是里面的DefaultPage()方法调用了两遍。二、点击搜索以后得出结果,但是在得出的结果中再点分页,又会跳回到初始化的状态,所有数据都出来了,而并不是在结果中进行分页。



前台页面代码


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="index.aspx.cs" Inherits="index" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>分页测试</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="LblTitle" runat="server"></asp:Label><br />
        <asp:Button ID="Button1" runat="server" Text="第一页" OnClick="BtnFirst_Click" />
        <asp:Button ID="Button3" runat="server" OnClick="BtnPre_Click" Text="上一页" />
        <asp:Button ID="Button2" runat="server" OnClick="BtnNext_Click" Text="下一页" />
        <asp:Button ID="Button4" runat="server" OnClick="BtnLast_Click" Text="最后一页" />
        <br />
        <br />
        游戏名称:<asp:TextBox ID="tserch" runat="server"></asp:TextBox>&nbsp; 机器号:<asp:TextBox ID="tsn" runat="server"></asp:TextBox>&nbsp; 日期:<asp:TextBox ID="ttimes" runat="server"></asp:TextBox>
        &nbsp;<asp:Button ID="btnserch" runat="server"  Text="搜索" OnClick="btnserch_Click" />
        
        <br />        </div>
    </form>
</body>
</html>


后台程序代码


using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Data.SqlClient;
public partial class index : System.Web.UI.Page
{
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
    public int PageSize = 5;
      protected void Page_Load(object sender, EventArgs e)
    {
        DefaultPage();
    }    protected void DefaultPage()
    {
        conn.Open();        string sql1;
        string serch = tserch.Text;        if (tserch.Text.Trim() == "")
        {
            sql1 = "select count(*) from pagination ";
        }
        else
        {
            sql1 = "select count(*) from pagination where game='" + serch + "'";
        }
        
        SqlCommand cmd = new SqlCommand(sql1, conn);
        int MaxSize = Convert.ToInt32(cmd.ExecuteScalar());
        int Page = Convert.ToInt32(Request.QueryString.Get("PageID"));        if (Page == 0)
        {
            Page = 1;
        }        float temp = (float)MaxSize / PageSize;        if (Page >= Convert.ToInt32(Math.Ceiling(temp)))
        {
            Page = Convert.ToInt32(Math.Ceiling(temp));
        }        string sql2;
        if (tserch.Text.Trim() == "")
        {
            sql2 = "select count(*) from (select top " + PageSize * Page + " * from pagination ) as c";
        }
        else
        {
            sql2 = "select count(*) from (select top " + PageSize * Page + " * from pagination where game='" + serch + "') as c";
        }        SqlCommand scmd1 = new SqlCommand(sql2, conn);
        SqlDataReader sdr1 = scmd1.ExecuteReader();        sdr1.Read();
        string cou = sdr1[0].ToString();
        sdr1.Close();        int RowCount = Int32.Parse(cou) - PageSize * (Page - 1);        string SQL;
        if (tserch.Text.Trim() == "")
        {
            SQL = "select * from (select top " + RowCount.ToString() + " * from (select top " + Page * PageSize + " * from pagination  order by UserID ) as a order by a.UserID DESC) as b order by b.UserID";
        }
        else
        {
            SQL = "select * from (select top " + RowCount.ToString() + " * from (select top " + Page * PageSize + " * from pagination where game = '" + serch + "' order by UserID ) as a order by a.UserID DESC) as b order by b.UserID";
        }        SqlDataAdapter sda = new SqlDataAdapter(SQL, conn);
        DataSet ds = new DataSet();
        sda.Fill(ds, "pagination");
        DataTable dt = ds.Tables["pagination"];
        conn.Close();        foreach (DataRow row in dt.Rows)
        {
            Response.Write("<table width=250 height=20 border=0 cellspacing=0 cellpadding=0><tr><td width=100><a href=detail.aspx?UserID=" + row["UserID"] + ">" + (row["game"]) + "</a></td><td width=150><a href=index.aspx?sn=" + row["sn"] + ">" + (row["sn"]) + "</a></td><td width=150><a href=index.aspx?sn=" + row["admin"] + ">" + (row["admin"]) + "</a></td></tr></table>");
        }        conn.Close();
        LblTitle.Text = "共有" + Convert.ToInt32(Math.Ceiling(temp)) + "页/当前是第" + Page + "页";
    }    protected void btnserch_Click(object sender, EventArgs e)
    {
        DefaultPage();
    }
    //第一页-----------------------------------------------------
    protected void BtnFirst_Click(object sender, EventArgs e)
    {
        Response.Redirect("index.aspx?PageID=1");
    }
    //第一页-----------------------------------------------------
    //上一页-----------------------------------------------------
    protected void BtnPre_Click(object sender, EventArgs e)
    {
        int Page = Convert.ToInt32(Request.QueryString.Get("PageID"));
        if (Page <= 1)
        {
            Page = 2;
        }
        int curent = Page - 1;
        Response.Redirect("index.aspx?PageID=" + curent);
    }
    //上一页-----------------------------------------------------    //下一页-----------------------------------------------------
    protected void BtnNext_Click(object sender, EventArgs e)
    {
        conn.Open();
        string serch = tserch.Text;
        string sql;
        if (tserch.Text.Trim() == "")
        {
            sql = "select count(*) from pagination ";
        }
        else
        {
            sql = "select count(*) from pagination where game='" + serch + "'";
        }
        SqlCommand cmd = new SqlCommand(sql, conn);        int MaxSize = Convert.ToInt32(cmd.ExecuteScalar());
        int Page = Convert.ToInt32(Request.QueryString.Get("PageID"));        float temp = (float)MaxSize / PageSize;        if (Page >= Convert.ToInt32(Math.Ceiling(temp)))
        {
            Page = Convert.ToInt32(Math.Ceiling(temp)) - 1;
        }        if (Page <= 0)
        {
            Page = 1;
        }        int curent = Page + 1;
        Response.Redirect("index.aspx?PageID=" + curent);        conn.Close();
    }
    //下一页-----------------------------------------------------    //最后一页-----------------------------------------------------
    protected void BtnLast_Click(object sender, EventArgs e)
    {
        conn.Open();        string serch = tserch.Text;
        string sql;
        if (tserch.Text.Trim() == "")
        {
            sql = "select count(*) from pagination ";
        }
        else
        {
            sql = "select count(*) from pagination where game='" + serch + "'";
        }
        SqlCommand cmd = new SqlCommand(sql, conn);
        int MaxSize = Convert.ToInt32(cmd.ExecuteScalar());
        float temp = (float)MaxSize / PageSize;
        Response.Redirect("index.aspx?PageID=" + Math.Ceiling(temp));
        conn.Close();
    }
    //最后一页-----------------------------------------------------
}

解决方案 »

  1.   

    AutoEventWireup="true" 改成 AutoEventWireup="false"
    试试
      

  2.   

    DefaultPage调用两次是因为一次在pageLoad中一次在btnSearchClick中
    解决方法,在pageload中加上
    if(!IsPostBack){
      DefaultPage();
    }第二个问题可能和这个有关
    楼主试试再说
      

  3.   

    Gridview+SqlDataSource+分页+搜索主要是要在GridView生成之前先设置好数据源。
    否则就会导致点击其他分页又重新绑定了原始数据
    利用GridView的PreRender事件,这个事件是在控件生成之前触发的,在这个事件里设置好SQL语句即可<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                CellPadding="4" DataKeyNames="ProductID" DataSourceID="SqlDataSource1" 
                ForeColor="#333333" GridLines="None" AllowPaging="True" 
                onprerender="GridView1_PreRender">protected void Button1_Click(object sender, EventArgs e)
            {
                ViewState["search"] = this.TextBox1.Text;
            }        protected void GridView1_PreRender(object sender, EventArgs e)
            {
                this.SqlDataSource1.SelectCommand = "select * from Products where ProductName like '%" + ViewState["search"] + "%' ";
                
            }
      

  4.   

    if(!this.IsPostBack)

      DefaultPage(); 
    } 一定要搞清楚这个是怎么回事,否则以后还会出现类似的问题!
      

  5.   

    if(!this.IsPostBack)

      DefaultPage(); 
    } 一定要搞清楚这个是怎么回事,否则以后还会出现类似的问题!
      

  6.   

    肯定会调用2次DefaultPage()方法的,LZ貌似没搞清楚你点击了protected void btnserch_Click(object sender, EventArgs e)
        {
            DefaultPage();
        }
    这个事件后,页面是会完全刷新的,也就是重头开始执行一边,所以会在
    protected void Page_Load(object sender, EventArgs e)
        {
            DefaultPage();
        }出现2次调用,加个If(!IsPostBack)
      

  7.   



    问题一、当我点击搜索后,得出的结果重复显示了两遍,也就是里面的DefaultPage()方法调用了两遍。
     


    问题二、点击搜索以后得出结果,但是在得出的结果中再点分页,又会跳回到初始化的状态,所有数据都出来了,而并不是在结果中进行分页。


    if (!IsPostBack)
            {
                DefaultPage();
            }

    这个方法解决了第一个问题。但是第二个问题还是存在,请高手帮着看看,是哪里出了问题?

      

  8.   

     protected void GridView1_PreRender(object sender, EventArgs e) 
            { 
              ///请看5楼的回复,你的数据源是command,你可以在那个基础上修改一下,  修改sqlcommand
            }
      

  9.   

        protected void Page_Load(object sender, EventArgs e)
        {
            DefaultPage();
        }这样的写法,实在是太每次都要执行。。
      

  10.   

    string serch = tserch.Text
    设置成静态字段,或者用viewstate来保存值
      

  11.   

    分页这样写:
            public static DataTable GetContentList(string chanlist, int pagesize, int pageindex,bool istop)
            {
                string strSql = string.Empty;            if (pageindex > 1)
                {
                    strSql = "select top " + pagesize.ToString() + " * from Tbl_ContentInfo where Nid not in ( select top " + (pagesize * (pageindex - 1)).ToString() + " Nid as Nid from Tbl_ContentInfo where ContentTitle!=cast(ParentID as varchar(50)) and ParentID in (" + chanlist + ")";
                    if (istop)
                        strSql += " and istop=1";
                    strSql += " order by IsTop Desc,Date desc,NID Desc )  and ParentID in (" + chanlist + ")";
                    if (istop)
                        strSql += " and istop=1";
                    strSql += " Order By IsTop Desc,Date desc,NID Desc";
                }
                else
                {
                    strSql = "select top " + pagesize.ToString() + " * from Tbl_ContentInfo where ContentTitle!=cast(ParentID as varchar(50)) and ParentID in (" + chanlist + ")";
                    if (istop)
                        strSql += " and istop=1";
                    strSql += " Order By IsTop Desc,Date desc,NID Desc";
                }            DataTable dtResult = Tools.ConvertDataReaderToDataTable(SqlHelper.ExecuteReader(Config.ConnectionString, CommandType.Text, strSql, null));
                return dtResult;
            }
      

  12.   



    那用不用把每句string serch = tserch.Text;都改成ViewState["serch"] = tserch.Text;呢?
      

  13.   

    比如说,你的最后一页    //最后一页-----------------------------------------------------
        protected void BtnLast_Click(object sender, EventArgs e)
        {
            conn.Open();        string serch = tserch.Text;
            string sql;
            if (tserch.Text.Trim() == "")
            {
                sql = "select count(*) from pagination ";
            }
            else
            {
                sql = "select count(*) from pagination where game='" + serch + "'";
            }
            SqlCommand cmd = new SqlCommand(sql, conn);
            int MaxSize = Convert.ToInt32(cmd.ExecuteScalar());
            float temp = (float)MaxSize / PageSize;
            Response.Redirect("index.aspx?PageID=" + Math.Ceiling(temp));
            conn.Close();
        }
        //最后一页-----------------------------------------------------
    我就没看明白,你这个最后一页的数据是怎么获取出来的,如何个表示法?
      

  14.   


    我把里面所有string serch = tserch.Text;都改成ViewState["serch"] = tserch.Text;,然后把所有带where条件的sql也改成了where game='" + ViewState["serch"] + "'";  可是还是那个问题。。
      

  15.   

    你把你改后的代码贴点出来看看,你把viewstate["serch"]设置在哪里了
      

  16.   


    我发现一个问题。如果在翻页的时候如果能记录textbox里面的内容到session,在翻页就不会出现那个问题。但是这样又会出现一个新问题。就是如果我要是搜索新的东西。必须要清空session,否则不管我在textbox里面写什么东西。点搜索以后。还是会出现上一次那个搜索的内容。
      

  17.   


    我设置在这里面了protected void DefaultPage()
        {
            conn.Open();
            ViewState["serch"] = tserch.Text;
      

  18.   

    废话,SESSION是会话级别的,你要重新搜索肯定要清空原来的记录了
      

  19.   


    修改以后的代码

    public partial class index : System.Web.UI.Page
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
        public int PageSize = 5;
          protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                DefaultPage();
            }
        }    protected void DefaultPage()
        {
            conn.Open();        string sql1;
            ViewState["serch"] = tserch.Text;        if (tserch.Text.Trim() == "")
            {
                sql1 = "select count(*) from pagination ";
            }
            else
            {
                sql1 = "select count(*) from pagination where game='" + ViewState["serch"] + "'";
            }
            
            SqlCommand cmd = new SqlCommand(sql1, conn);
            int MaxSize = Convert.ToInt32(cmd.ExecuteScalar());
            int Page = Convert.ToInt32(Request.QueryString.Get("PageID"));        if (Page == 0)
            {
                Page = 1;
            }        float temp = (float)MaxSize / PageSize;        if (Page >= Convert.ToInt32(Math.Ceiling(temp)))
            {
                Page = Convert.ToInt32(Math.Ceiling(temp));
            }        string sql2;
            if (tserch.Text.Trim() == "")
            {
                sql2 = "select count(*) from (select top " + PageSize * Page + " * from pagination ) as c";
            }
            else
            {
                sql2 = "select count(*) from (select top " + PageSize * Page + " * from pagination where game='" + ViewState["serch"] + "') as c";
            }        SqlCommand scmd1 = new SqlCommand(sql2, conn);
            SqlDataReader sdr1 = scmd1.ExecuteReader();        sdr1.Read();
            string cou = sdr1[0].ToString();
            sdr1.Close();        int RowCount = Int32.Parse(cou) - PageSize * (Page - 1);        string SQL;
            if (tserch.Text.Trim() == "")
            {
                SQL = "select * from (select top " + RowCount.ToString() + " * from (select top " + Page * PageSize + " * from pagination  order by UserID ) as a order by a.UserID DESC) as b order by b.UserID";
            }
            else
            {
                SQL = "select * from (select top " + RowCount.ToString() + " * from (select top " + Page * PageSize + " * from pagination where game = '" + ViewState["serch"] + "' order by UserID ) as a order by a.UserID DESC) as b order by b.UserID";
            }        SqlDataAdapter sda = new SqlDataAdapter(SQL, conn);
            DataSet ds = new DataSet();
            sda.Fill(ds, "pagination");
            DataTable dt = ds.Tables["pagination"];
            conn.Close();        foreach (DataRow row in dt.Rows)
            {
                Response.Write("<table width=250 height=20 border=0 cellspacing=0 cellpadding=0><tr><td width=100><a href=detail.aspx?UserID=" + row["UserID"] + ">" + (row["game"]) + "</a></td><td width=150><a href=index.aspx?sn=" + row["sn"] + ">" + (row["sn"]) + "</a></td><td width=150><a href=index.aspx?sn=" + row["admin"] + ">" + (row["admin"]) + "</a></td></tr></table>");
            }        conn.Close();
            LblTitle.Text = "共有" + Convert.ToInt32(Math.Ceiling(temp)) + "页/当前是第" + Page + "页";
        }    protected void btnserch_Click(object sender, EventArgs e)
        {
            ViewState["serch"] = tserch.Text;
            DefaultPage();
        }
        //第一页-----------------------------------------------------
        protected void BtnFirst_Click(object sender, EventArgs e)
        {
            Response.Redirect("index.aspx?PageID=1");
        }
        //第一页-----------------------------------------------------
        //上一页-----------------------------------------------------
        protected void BtnPre_Click(object sender, EventArgs e)
        {
            int Page = Convert.ToInt32(Request.QueryString.Get("PageID"));
            if (Page <= 1)
            {
                Page = 2;
            }
            int curent = Page - 1;
            Response.Redirect("index.aspx?PageID=" + curent);
        }
        //上一页-----------------------------------------------------    //下一页-----------------------------------------------------
        protected void BtnNext_Click(object sender, EventArgs e)
        {
            conn.Open();
            ViewState["serch"] = tserch.Text;
            string sql;
            if (tserch.Text.Trim() == "")
            {
                sql = "select count(*) from pagination ";
            }
            else
            {
                sql = "select count(*) from pagination where game='" + ViewState["serch"] + "'";
            }
            SqlCommand cmd = new SqlCommand(sql, conn);        int MaxSize = Convert.ToInt32(cmd.ExecuteScalar());
            int Page = Convert.ToInt32(Request.QueryString.Get("PageID"));        float temp = (float)MaxSize / PageSize;        if (Page >= Convert.ToInt32(Math.Ceiling(temp)))
            {
                Page = Convert.ToInt32(Math.Ceiling(temp)) - 1;
            }        if (Page <= 0)
            {
                Page = 1;
            }        int curent = Page + 1;
            Response.Redirect("index.aspx?PageID=" + curent);        conn.Close();
        }
        //下一页-----------------------------------------------------    //最后一页-----------------------------------------------------
        protected void BtnLast_Click(object sender, EventArgs e)
        {
            conn.Open();        ViewState["serch"] = tserch.Text;
            string sql;
            if (tserch.Text.Trim() == "")
            {
                sql = "select count(*) from pagination ";
            }
            else
            {
                sql = "select count(*) from pagination where game='" + ViewState["serch"] + "'";
            }
            SqlCommand cmd = new SqlCommand(sql, conn);
            int MaxSize = Convert.ToInt32(cmd.ExecuteScalar());
            float temp = (float)MaxSize / PageSize;
            Response.Redirect("index.aspx?PageID=" + Math.Ceiling(temp));
            conn.Close();
        }
        //最后一页-----------------------------------------------------
    }
      

  20.   

    下到protected void btnserch_Click(object sender, EventArgs e)
    这里面来,另外Page_Load里还要判断下viewstate是不是有值,如果有值就清空,要不你就只能或者搜索的值了
      

  21.   


    protected void btnserch_Click(object sender, EventArgs e)
        {
            ViewState["serch"] = tserch.Text;
            DefaultPage();
        }
    是这样吗? 还有,那个判断viewstate是否空值,应该怎么写,是if(viewstate["serch"]==null)吗,不知道是不是这样。还有。怎么清空呢?
      

  22.   


    两段代码这样改对吗

    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                DefaultPage();
            }
            if (ViewState["serch"] != null)
            {
                ViewState.Clear();
            }
        }protected void btnserch_Click(object sender, EventArgs e)
        {
            ViewState["serch"] = tserch.Text;
            DefaultPage();
        }
      

  23.   

    你每次翻页都重新REDIRECT一下,所以你的VIEWSTATE会失效,建议不REDIRECT,重新绑定即可!
      

  24.   

    if (ViewState["serch"] != null)
            {
                ViewState.Clear();
            }
    这个要放到IsPostBack里吧,要不你一点任何一个按钮都会清空ViewState的
      

  25.   

    还是不行protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                DefaultPage();
                if (ViewState["serch"] != null)
                {
                    ViewState.Clear();
                }
            }
            
        }
      

  26.   

    38楼说的问题我没考虑到,失误了,不行就用SESSION吧
    SORRY
      

  27.   

    那是把所有的viewstate都替换为session吗
      

  28.   

    不需要的,用VIEWSTATE就行,你把绑定单独写到一个函数里面,然后写几个参数,象这样:先把这个绑定函数写好
    contrlRepeater(string searchcondition,string order)
    {
    ...
    }
    再单独分析搜索条件,放入viewstate
    string searchcondition=写你的搜索条件;
    string order=写的你排序;
    viewstate["searchcondition"]=searchcondition;
    viewstate["order"]=order;
    最后在每个翻页按钮函数里面
    protected void firstPage_Click(object sender, EventArgs e)
        {
            ...加上你的页数控制,最后用那个绑定函数直接引用一下
            this.contrlRepeater(ViewState["searchcondition"].ToString(),viewstate["order"].ToString());
        }
    protected void nextPage_Click(object sender, EventArgs e)
        {
            ...加上你的页数控制,最后用那个绑定函数直接引用一下
            this.contrlRepeater(ViewState["searchcondition"].ToString(),viewstate["order"].ToString());
        }
    ...
      

  29.   

    也很容易的呀,随便搬弄一下就行了,关键是LZ思路不够清晰,所以觉得改起来很麻烦,还有Response.Redirect("index.aspx?PageID=" + Math.Ceiling(temp));
     conn.Close();
    这里是错误的,最后一句执行不到,连接关闭不了的!
      

  30.   

    或者实在不行,你在DefaultPage()里面加一个参数,来控制页数
    DefaultPage(int page);
    然后第几页,你就调用
    DefaultPage(第几页);
      

  31.   

    楼主在分页按钮中使用的是Response.Redirect的方式
    这种方式会将页面初始化,所以楼主得到的就是初始化的页面
    解决办法:可以在pageLoad中通过
    String page = Request.QueryString["PageID"];
    if(page!=null)
    {
      手工触发btnSearch方法;
    }else if(!IsPostBack)
    {
       DefaultPage();
    }
      

  32.   

    补充一下,上面还需要改善逻辑
    以楼主现在的逻辑是没有办法通过page变量判断是调用next还是pre的
    所以楼主最好能写一个根据pageID分出当前请求页面的私有方法
    然后再btnPre和btnNext中得到PageID,再调用这个私有方法,返回分页数据
      

  33.   


    抱歉上面说得不对
    没有看到你在btnSearch方法中已经做了得到页码的工作