/* 分页查询 */ create PROCEDURE [sp_Page] @PageCurrent int, --要显示的页码 @PageSize int,--每页的大小 @ifelse nvarchar(1000),--返回的字段 @where nvarchar(1000),--条件 @order nvarchar(1000)--排序 AS BEGIN BEGIN TRY DECLARE @strSQL nvarchar(500),@strSQLcount nvarchar(500),@countPage int if ISNULL(@PageSize,0)<1 set @PageSize=20 set @strSQL='select * from ( select '+@ifelse+',ROW_NUMBER() OVER('+@order+') as row from '+@where+' ) a where row between '+CONVERT(nvarchar(10), @PageCurrent*@PageSize-@PageSize+1)+' and '+CONVERT(nvarchar(10), @PageCurrent*@PageSize)+'' set @strSQLcount='select count(1) as count from '+@where EXECUTE sp_executesql @strSQL; EXECUTE sp_executesql @strSQLcount; END TRY BEGIN CATCH print ERROR_MESSAGE() END CATCH END -- 例: -- declare @where nvarchar(1000); -- set @where='gongqiu where ...'; -- exec [sp_Page] @Page,@Size,'*',@where, 'order by date desc'贴一个我现在用的分页存储过程,感觉还不错,SQL版本是2005
具体的是网页中分面。一般使用URL分页。每页固定行数。URL上标明页数。如
http://csdn.net/list.aspx?p=1//第一页
http://csdn.net/list.aspx?p=2//第二页
http://csdn.net/list.aspx?p=3//第三页。。但是在每页的数据查询出来是可以通过前台选择或者填加的。多个查询条件的。
如根据国家或者什么时间段查询,然后再分页应该可以理解吧?一般这种分页方式大多采用直接页面跳转,使用querystring传值。但现在可能查询条件N多,querystring不够用。所以可否有其他方案设计?
protected void Page_Load(object sender, EventArgs e)
{
this.Title=ConfigurationSettings.AppSettings["webtitle"];
if (!IsPostBack)
{
BindDropDown();
Label1.Text = "暂无结果!";
}
}
private void BindDropDown()
{
Selectcontrol ss = new Showz();
DataSet ds = ss.CMenu();
DropDownList1.DataSource = ds.Tables["sclass"].DefaultView;
DropDownList1.DataTextField = "sclass_name";
DropDownList1.DataValueField = "sclass_id";
DropDownList1.DataBind();
}
protected void Button1_Click(object sender, EventArgs e)
{
string sqlstring="";
string input = TextBox1.Text.ToString().Trim();
int select =Int32.Parse(DropDownList1.SelectedValue);
Selectcontrol ss = new Showz();
if (select.ToString()=="")
{
sqlstring = "select * from ziyuan where zname like '%"+input+"%'";
DataSet ds = ss.DsGetinfo(sqlstring);
DataList1.DataSource = ds.Tables["aa"];
Label1.Text ="搜索到有:"+ ds.Tables["aa"].Rows.Count.ToString()+"条记录!"; GuestCount = ds.Tables[0].Rows.Count;
PagedDataSource objPage = new PagedDataSource();
objPage.DataSource = ds.Tables[0].DefaultView;
lbCount.Text = "总共有" + ds.Tables[0].Rows.Count.ToString() + "条记录";
Label3.Text = "总共有" + ds.Tables[0].Rows.Count.ToString() + "条记录";
//设置可以分页以及每页的行数
objPage.AllowPaging = true;
objPage.PageSize = 10;
//总页数
lbTotalPage.Text = "总页数:" + objPage.PageCount.ToString() + "页";
Label4.Text = "总页数:" + objPage.PageCount.ToString() + "页"; ;
//定义变量来保存当前页
int CurPage;
//判断是否具有页面跳转的请求
if (Request.QueryString["Page"] != null)
{
CurPage = Convert.ToInt32(Request.QueryString["Page"]);
}
else
{
CurPage = 1;
}
//设置当前页的索引
objPage.CurrentPageIndex = CurPage - 1;
lbCurPage.Text = "当前页 : 第" + CurPage.ToString() + "页";
Label5.Text = "当前页 : 第" + CurPage.ToString() + "页";
//如果不是首页
if (!objPage.IsFirstPage)
{
//定义上一页超链接的url为: 当前执行页面的虚拟路径,并传递下一页面的索引值
hlnkHead.NavigateUrl = Request.CurrentExecutionFilePath +
"?Page=" + Convert.ToString(1);
HyperLink1.NavigateUrl = Request.CurrentExecutionFilePath +
"?Page=" + Convert.ToString(1);
hlnkPrev.NavigateUrl = Request.CurrentExecutionFilePath +
"?Page=" + Convert.ToString(CurPage - 1);
HyperLink2.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage - 1);
}
//如果不是最后一页
if (!objPage.IsLastPage)
{
//定义“下一页”超链接url为:当前执行页面的虚拟路径,并传递下一页面的索引值
hlnkNext.NavigateUrl = Request.CurrentExecutionFilePath +
"?Page=" + Convert.ToString(CurPage + 1);
HyperLink3.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage + 1);
hlnkEnd.NavigateUrl = Request.CurrentExecutionFilePath +
"?Page=" + objPage.PageCount.ToString();
HyperLink4.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage + 1);
}
DataList1.DataSource = objPage;
DataList1.DataBind(); }
else
{
sqlstring = "select * from ziyuan where s_id="+select+" and zname like '%"+input+"%'";
DataSet ds = ss.DsGetinfo(sqlstring);
DataList1.DataSource = ds.Tables["aa"];
Label1.Text = "搜索到有:" + ds.Tables["aa"].Rows.Count.ToString() + "条记录!"; GuestCount = ds.Tables[0].Rows.Count;
PagedDataSource objPage = new PagedDataSource();
objPage.DataSource = ds.Tables[0].DefaultView;
lbCount.Text = "总共有" + ds.Tables[0].Rows.Count.ToString() + "条记录";
Label3.Text = "总共有" + ds.Tables[0].Rows.Count.ToString() + "条记录";
//设置可以分页以及每页的行数
objPage.AllowPaging = true;
objPage.PageSize = 10;
//总页数
lbTotalPage.Text = "总页数:" + objPage.PageCount.ToString() + "页";
Label4.Text = "总页数:" + objPage.PageCount.ToString() + "页"; ;
//定义变量来保存当前页
int CurPage;
//判断是否具有页面跳转的请求
if (Request.QueryString["Page"] != null)
{
CurPage = Convert.ToInt32(Request.QueryString["Page"]);
}
else
{
CurPage = 1;
}
//设置当前页的索引
objPage.CurrentPageIndex = CurPage - 1;
lbCurPage.Text = "当前页 : 第" + CurPage.ToString() + "页";
Label5.Text = "当前页 : 第" + CurPage.ToString() + "页";
//如果不是首页
if (!objPage.IsFirstPage)
{
//定义上一页超链接的url为: 当前执行页面的虚拟路径,并传递下一页面的索引值
hlnkHead.NavigateUrl = Request.CurrentExecutionFilePath +
"?Page=" + Convert.ToString(1);
HyperLink1.NavigateUrl = Request.CurrentExecutionFilePath +
"?Page=" + Convert.ToString(1);
hlnkPrev.NavigateUrl = Request.CurrentExecutionFilePath +
"?Page=" + Convert.ToString(CurPage - 1);
HyperLink2.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage - 1);
}
//如果不是最后一页
if (!objPage.IsLastPage)
{
//定义“下一页”超链接url为:当前执行页面的虚拟路径,并传递下一页面的索引值
hlnkNext.NavigateUrl = Request.CurrentExecutionFilePath +
"?Page=" + Convert.ToString(CurPage + 1);
HyperLink3.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage + 1);
hlnkEnd.NavigateUrl = Request.CurrentExecutionFilePath +
"?Page=" + objPage.PageCount.ToString();
HyperLink4.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage + 1);
}
DataList1.DataSource = objPage;
DataList1.DataBind();
}
}
在这里我用DataList1显示数据,有查询,分页,第一次打开没有结果显示,输入条件后按查询才有结果显示
1、使用session
2、添加一个隐藏页,在隐藏页面上记录
说说使用隐藏页咋弄?
使用session是有不合理性,这个是你的样式决定的,使用url传递查询条件本身就不太合理。
使用隐藏页就是把你现在的页放入一个框架中,在框架里面添加一个width为0的页面,那里记录查询条件,翻页时需要修改那个界面上的值,加载界面时从那个界面取值
在第一次查询时viewstate属性是否有值。没值绑定所有数据
private string Name
{
get
{
return (string)ViewState[""];
}
set
{
ViewState[""]=value;
}
}
参考
隐藏页能取到值?当点击<a hrf的时候肯定不能取到原来页面的隐藏页面的值吧?怎么个取法?
Session和样式没啥关系?
session不合理的原因:
在一个页面保存好了后,点到其他页面的时候,本来没有选择条件查询的,结果确有了当然,你会说不同页面使用不同的session.这样的话session就多起来了。1个页面有100个查询条件,就得用100个session,当然,你会说可以用一个session保存实体或者hashtable,但是session其实也是hashtable,这样的话,如果有100个页面,且有100+个人以上访问的话,你想有多少个session?
你参考中的分页仍然是用一控件,你的页码仍然是以按钮形式的,即不会有跳转页面的,所以可以用viewstate....
我一般是用4个按钮加1个下拉列表做分页查询.然后把要跳转的页数放在CommandArgument属性里
首先,在隐藏界面藏值问题。你输入条件后,需要有一个触发事件吧,在触发事件里向隐藏界面保存值,在pageload里面检查隐藏页面的值。
其次,我说的样式指的是模式或框架,现在问题主要是你翻页控件出现的问题,在aspx界面使用<a 作为翻页控件有点不太合适,使用linkbutton也可以啊,使用button也可以啊,况且有listgrid,listgridview等控件,不需要单独开发翻页控件的,所以我感觉你的翻页控件做的不好,如果要单独做也可以,但是做的时候应该考虑到查询条件的问题。
在服务器端生成<A>标签的时候把查询条件,通过自己写的字符串压缩算法压缩并写入href,然后请求服务器端的时候,服务器直接解压这个字符串,然后从里面提取查询条件
实际这样做效果也就那样,IE限制是2K 我用的算法也就能传到4K而已
你第一次回发的参数 全部写进数据库 表的主键用GUID 把GUID返回到URL上 然后根据回发的GUID是否存在来判断是不是第一次查询,还是分页查询
这样理论上也行 关键就是要往数据库来回写东西
http://www.cnblogs.com/lhking/archive/2009/04/16/1437497.html
/*
分页查询
*/
create PROCEDURE [sp_Page]
@PageCurrent int, --要显示的页码
@PageSize int,--每页的大小
@ifelse nvarchar(1000),--返回的字段
@where nvarchar(1000),--条件
@order nvarchar(1000)--排序
AS
BEGIN
BEGIN TRY
DECLARE @strSQL nvarchar(500),@strSQLcount nvarchar(500),@countPage int
if ISNULL(@PageSize,0)<1
set @PageSize=20
set @strSQL='select * from
(
select '+@ifelse+',ROW_NUMBER() OVER('+@order+') as row from '+@where+'
) a
where row between '+CONVERT(nvarchar(10), @PageCurrent*@PageSize-@PageSize+1)+' and '+CONVERT(nvarchar(10), @PageCurrent*@PageSize)+''
set @strSQLcount='select count(1) as count from '+@where
EXECUTE sp_executesql @strSQL;
EXECUTE sp_executesql @strSQLcount;
END TRY
BEGIN CATCH
print ERROR_MESSAGE()
END CATCH
END
-- 例:
-- declare @where nvarchar(1000);
-- set @where='gongqiu where ...';
-- exec [sp_Page] @Page,@Size,'*',@where, 'order by date desc'贴一个我现在用的分页存储过程,感觉还不错,SQL版本是2005