我写了一个分页与搜索结合的程序,现在遇到两个问题:一、当我点击搜索后,得出的结果重复显示了两遍,也就是里面的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> 机器号:<asp:TextBox ID="tsn" runat="server"></asp:TextBox> 日期:<asp:TextBox ID="ttimes" runat="server"></asp:TextBox>
<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();
}
//最后一页-----------------------------------------------------
}
解决方案 »
- 急急 存储过彻骨批量更新的问题
- WIN7 IIS7.5 发布ASP.NET 2.0网站的问题
- .net 缓存问题求解
- 问个SiteMapPath控件中链接字体的问题
- ASP.NET WEB自定义控件属性显示问题求助--->>
- 自定义服务器控件,能否将标签添加到<from runat="server">...</form>外面
- java菜鸟 到此一问 大虾请出招
- 程序在本地运行没有任何问题,拿到服务器上打不开页面,错误如下,麻烦帮看一下是怎么回事,谢谢!
- 求一sql语句
- ASP.NET页面程序运行一段时间后出现问题?
- Access无法更新的问题(sql server数据层正常,且可排除权限问题)
- asp.net高手帮忙啊!!!!!!!!!
试试
解决方法,在pageload中加上
if(!IsPostBack){
DefaultPage();
}第二个问题可能和这个有关
楼主试试再说
否则就会导致点击其他分页又重新绑定了原始数据
利用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"] + "%' ";
}
{
DefaultPage();
} 一定要搞清楚这个是怎么回事,否则以后还会出现类似的问题!
{
DefaultPage();
} 一定要搞清楚这个是怎么回事,否则以后还会出现类似的问题!
{
DefaultPage();
}
这个事件后,页面是会完全刷新的,也就是重头开始执行一边,所以会在
protected void Page_Load(object sender, EventArgs e)
{
DefaultPage();
}出现2次调用,加个If(!IsPostBack)
问题一、当我点击搜索后,得出的结果重复显示了两遍,也就是里面的DefaultPage()方法调用了两遍。
问题二、点击搜索以后得出结果,但是在得出的结果中再点分页,又会跳回到初始化的状态,所有数据都出来了,而并不是在结果中进行分页。
if (!IsPostBack)
{
DefaultPage();
}
这个方法解决了第一个问题。但是第二个问题还是存在,请高手帮着看看,是哪里出了问题?
{
///请看5楼的回复,你的数据源是command,你可以在那个基础上修改一下, 修改sqlcommand
}
{
DefaultPage();
}这样的写法,实在是太每次都要执行。。
设置成静态字段,或者用viewstate来保存值
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;
}
那用不用把每句string serch = tserch.Text;都改成ViewState["serch"] = tserch.Text;呢?
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();
}
//最后一页-----------------------------------------------------
我就没看明白,你这个最后一页的数据是怎么获取出来的,如何个表示法?
我把里面所有string serch = tserch.Text;都改成ViewState["serch"] = tserch.Text;,然后把所有带where条件的sql也改成了where game='" + ViewState["serch"] + "'"; 可是还是那个问题。。
我发现一个问题。如果在翻页的时候如果能记录textbox里面的内容到session,在翻页就不会出现那个问题。但是这样又会出现一个新问题。就是如果我要是搜索新的东西。必须要清空session,否则不管我在textbox里面写什么东西。点搜索以后。还是会出现上一次那个搜索的内容。
我设置在这里面了protected void DefaultPage()
{
conn.Open();
ViewState["serch"] = tserch.Text;
修改以后的代码
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();
}
//最后一页-----------------------------------------------------
}
这里面来,另外Page_Load里还要判断下viewstate是不是有值,如果有值就清空,要不你就只能或者搜索的值了
protected void btnserch_Click(object sender, EventArgs e)
{
ViewState["serch"] = tserch.Text;
DefaultPage();
}
是这样吗? 还有,那个判断viewstate是否空值,应该怎么写,是if(viewstate["serch"]==null)吗,不知道是不是这样。还有。怎么清空呢?
两段代码这样改对吗
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();
}
{
ViewState.Clear();
}
这个要放到IsPostBack里吧,要不你一点任何一个按钮都会清空ViewState的
{
if (!IsPostBack)
{
DefaultPage();
if (ViewState["serch"] != null)
{
ViewState.Clear();
}
}
}
SORRY
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());
}
...
conn.Close();
这里是错误的,最后一句执行不到,连接关闭不了的!
DefaultPage(int page);
然后第几页,你就调用
DefaultPage(第几页);
这种方式会将页面初始化,所以楼主得到的就是初始化的页面
解决办法:可以在pageLoad中通过
String page = Request.QueryString["PageID"];
if(page!=null)
{
手工触发btnSearch方法;
}else if(!IsPostBack)
{
DefaultPage();
}
以楼主现在的逻辑是没有办法通过page变量判断是调用next还是pre的
所以楼主最好能写一个根据pageID分出当前请求页面的私有方法
然后再btnPre和btnNext中得到PageID,再调用这个私有方法,返回分页数据
抱歉上面说得不对
没有看到你在btnSearch方法中已经做了得到页码的工作